首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > windows >

windows驱动学习札记

2013-01-18 
windows驱动学习笔记零零散散花了一个月的时间初步学习了windows驱动编程,接着开始要制定2013年的学习计划

windows驱动学习笔记

零零散散花了一个月的时间初步学习了windows驱动编程,接着开始要制定2013年的学习计划,即将步入另外一个学习战场,于是就将最近学习记录下来,也好将来再返回学习时有点基础。

一、windows驱动安装

1、到官方下载DDK安装,ex : 3790.1830.DDK

2、目录简介 

      示例代码: 安装目录/src/general/event/sys

      编译:build

      基本文件:源文件,sources, makefile

     

二、VC6 驱动设置

1、 Tools->Options->Directories->Executable files->新建   ...\3790.1830\BIN\X86 移到最上边

       Tools->Options->Directories->Include files->新建  ...\3790.1830\INC\CRT

       Tools->Options->Directories->Include files->新建  ...\3790.1830\INC\DDK\WXP

       Tools->Options->Directories->Include files->新建  ...\3790.1830\INC\WXP

       Tools->Options->Directories->Include files->新建  ...\3790.1830\INC\DDK\WDM\WXP

       Tools->Options->Directories->Library files->新建  ...\3790.1830\LIB\WXP\I386

2、编译设置:适用于NT驱动,WDM驱动

       Project->Configurations->Add... 新建编译选项

       Project->Setting->C/C++->Project Options

       /nologo /Gz /MLd /WZ /WX /Z7 /Od /D WIN32=100 /D _X86_=1 /D WINVER=0x501 /D DBG=1 /Fo "ddk_check1" /Fd "ddk_check1" /FD /c

       Project->Setting->Link->Project Options

       wdm.lib ntoskrnl.lib /nologo /base:"0x10000" /stack:0x400000,0x1000

       /entry:"DriverEntry" /subsystem:console /incremental=no

       /pdb:"ddk_check/event.pdb" /debug /machine:I386

       /nodefaultlib  /out:"ddk_check/event.sys"  /subsystem:native

       /driver   /SECTION:INIT,D  /RELEASE   /IGNORE:4078


三、VS2003设置

一、配置移到最上面 

        工具->选项-》项目-》VC++目录-》包含文件-》新建...  3790.1830\inc\crt

       工具->选项-》项目-》VC++目录-》包含文件-》新建...  3790.1830\inc\ddk\wxp

       工具->选项-》项目-》VC++目录-》包含文件-》新建...  3790.1830\inc\wxp

       工具->选项-》项目-》VC++目录-》包含文件-》新建...  3790.1830\inc\ddk\wdm\wxp

       工具->选项-》项目-》VC++目录-》库文件-》新建  ...3790.1830\Bin\x86

       工具->选项-》项目-》VC++目录-》可执行文件-》新建  ...3790.1830\Bin\x86


       项目-》event属性-》配置管理器-》项目上下文-》新建项目配置    + "check"

       项目-》event属性-》配置属性-》C/C++-》常规-》调试信息格式@c7

       项目-》event属性-》配置属性-》C/C++-》常规-》警告等级@wz

       项目-》event属性-》配置属性-》C/C++-》预处理器: WIN32=100;_X86_=1, WINVER=0X501; DBG=1

       项目-》event属性-》配置属性-》C/C++-》代码生成-》运行时库 @多线程

       项目-》event属性-》配置属性-》C/C++-》代码生成-》缓冲区安全检查 @否

       项目-》event属性-》配置属性-》C/C++-》高级-》调用约定 @__stdcall   

       项目-》event属性-》链接器-》常规-》输出文件 @.sys

       项目-》event属性-》链接器-》输入-》附加依赖项@wdm.lib

       项目-》event属性-》高级-》入口点 @DriverEntry

       项目-》event属性-》高级-》基址@ 0x10000


四、驱动编写DDK_HelloWorld书写int DriverEntry( PDRIVER_OBJECT,    PUNICODE_STRING)头文件  #include <ntddk.h>makefile  固定格式:    !INCLUDE $(NTMAKEENV)\makefile.defsources文件:     TARGETNAME=     TARGETTYPE=
     TARGETPATH=
     INCLUDES=    SOURCES=编译:build -C
#pragma pack(pop) //#pragma pack(pop)//-----------全局变量--------------------------------ULONG int3proc_addr; //用来存放int 3处理函数地址ULONG jmpaddr_int3proc_9; //用来存放intproc+9处理函数地址//-----------全局变量 定义结束-----------------------#pragma PAGECODEULONG ReadIdtBase(ULONG CPUNUM){    IDTR idtr;//获取表基址    PIDT_ENTRY Aidt;    KdPrint(("IDT_ENTRY size=%d \n", sizeof(IDT_ENTRY)));    __asm sidt idtr;//获取表基址信息    KdPrint(("IDT BASE=%x \n", idtr.base));    Aidt = PIDT_ENTRY(idtr.base);    return idtr.base;}void __declspec(naked)  int3UnHookcode(){    __asm    {        push    0        mov     word ptr [esp+2], 0    }}#pragma PAGECODEvoid __declspec(naked)  myInt3Proc(){    //__asm retn 100;    __asm    {        pushad        pushfd    }    KdPrint(("\n entry my Int3Proc \n"));    //在这里添加自己的条件过滤代码    //获取进程上下文    PEPROCESS EP;    EP = PsGetCurrentProcess();    // (PTSTR)((ULONG)EP+0x174)是否等于 需要反断点的进程    if (strcmp((PTSTR)((ULONG)EP + 0x174), "notepad.exe") == 0)    {        //需要保护的进程 直接蓝屏        KdPrint(("\n 蓝屏 蓝屏 蓝屏 \n"));        __asm retn 100;    }    __asm    {        popfd        popad    }    __asm    {        push 0        mov word ptr [esp+2], 0        //前2条需要恢复的指令 占9字节        jmp jmpaddr_int3proc_9    }}#pragma  PAGECODEULONG HookInt3Proc(){    ULONG status = 1;    PIDT_ENTRY Pidt_info = (PIDT_ENTRY)ReadIdtBase(0);    ULONG jmpaddr;    Pidt_info += 3; //转到IDT 数组3 里边存放着 int 3 处理函数地址    //Pidt_info=Pidt_info+sizeof(Pidt_info)*3;    //begin计算出int3处理函数地址    int3proc_addr = Pidt_info->offset_high << 16; //makelong 0x804d0000    //MAKELONG(Pidt_info->offset_high,Pidt_info->offset_Slow) //0xfaa1 =804dfaa1    int3proc_addr = int3proc_addr + Pidt_info->offset_low;    KdPrint (("\n int proc addr=%x \n", int3proc_addr));    //end;    //begin inline hook int3Proc write    // E9+jmp地址//jmp地址=myInt3Proc-int3proc_addr-5;    jmpaddr = ULONG(&myInt3Proc) - int3proc_addr - 5;    jmpaddr_int3proc_9 = int3proc_addr + 9;    __asm    {        push ebx        push eax        mov ebx, int3proc_addr        mov byte ptr ds:[ebx], 0xE9        mov eax, jmpaddr        mov dword ptr ds:[ebx+1], eax        pop eax        pop ebx    }    //end;inline hook int3proc write    return status;}#pragma  PAGECODEULONG UnHookInt3Proc(){    ULONG status = 1;    KdPrint(("\n 卸载 Idt Hook \n"));    __asm    {        push ebx        push eax        push ecx        mov ebx, int3proc_addr //0x804dfaa1        lea ecx, int3UnHookcode        mov eax, [ecx+0]        mov dword ptr ds:[ebx], eax        mov eax, [ecx+4]        mov dword ptr ds:[ebx+4], eax        mov eax, [ecx+8]        mov byte ptr ds:[ebx+8], al        pop ecx        pop eax        pop ebx    }    //end;inline hook int3proc write    return status;}


























热点排行