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;}