驱动之路_取原函数地址_判断是否被hook
event.h
#include <ntddk.h> #define INITCODE code_seg("INIT") #define PAGECODE code_seg("PAGE") /*表示内存不足时,可以被置换到硬盘*/ VOID DDK_Unload (IN PDRIVER_OBJECT pDriverObject); //前置说明 卸载例程 typedef struct _ServiceDescriptorTable { PVOID ServiceTableBase; //System Service Dispatch Table 的基地址 PVOID ServiceCounterTable; //包含着 SSDT 中每个服务被调用次数的计数器。这个计数器一般由sysenter 更新。 unsigned int NumberOfServices;//由 ServiceTableBase 描述的服务的数目。 PVOID ParamTableBase; //包含每个系统服务参数字节数表的基地址-系统服务参数表 }*PServiceDescriptorTable; extern PServiceDescriptorTable KeServiceDescriptorTable; ULONG GetNt_CurAddr() //获取当前SSDT_NtOpenProcess的当前地址 { LONG *SSDT_Adr,SSDT_NtOpenProcess_Cur_Addr,t_addr; KdPrint(("驱动成功被加载中.............................\n")); //读取SSDT表中索引值为0x7A的函数 //poi(poi(KeServiceDescriptorTable)+0x7a*4) t_addr=(LONG)KeServiceDescriptorTable->ServiceTableBase; KdPrint(("当前ServiceTableBase地址为%x \n",t_addr)); SSDT_Adr=(PLONG)(t_addr+0x7A*4); KdPrint(("当前t_addr+0x7A*4=%x \n",SSDT_Adr)); SSDT_NtOpenProcess_Cur_Addr=*SSDT_Adr; KdPrint(("当前SSDT_NtOpenProcess_Cur_Addr地址为%x \n",SSDT_NtOpenProcess_Cur_Addr)); return SSDT_NtOpenProcess_Cur_Addr; } ULONG GetNt_OldAddr() { UNICODE_STRING Old_NtOpenProcess; ULONG Old_Addr; RtlInitUnicodeString(&Old_NtOpenProcess,L"NtOpenProcess"); Old_Addr=(ULONG)MmGetSystemRoutineAddress(&Old_NtOpenProcess);//取得NtOpenProcess的地址 KdPrint(("取得原函数NtOpenProcess的值为 %x",Old_Addr)); return Old_Addr; }
event.c
//_stdcall #include "event.h" #pragma INITCODE NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING B) //TYPEDEF LONG NTSTATUS { ULONG cur,old; cur=GetNt_CurAddr(); old=GetNt_OldAddr(); if (cur!=old) { //写入JMP KdPrint(("NtOpenProcess被HOOK了")); } return (1); } #pragma PAGECODE VOID DDK_Unload (IN PDRIVER_OBJECT pDriverObject) { PDEVICE_OBJECT pDev;//用来取得要删除设备对象 UNICODE_STRING symLinkName; // pDev=pDriverObject->DeviceObject; IoDeleteDevice(pDev); //删除设备 //取符号链接名字 RtlInitUnicodeString(&symLinkName,L"\\??\\yjx888"); //删除符号链接 IoDeleteSymbolicLink(&symLinkName); KdPrint(("驱动成功被卸载...OK-----------")); //sprintf,printf //取得要删除设备对象 //删掉所有设备 DbgPrint("卸载成功"); }

浙公网安备 33010602011771号