声明 结构 typedef struct _ServiceDescriptorTable { PVOID ServiceTableBase; //描述表的基址 PVOID ServiceCounterTable; //被调用的计数器 unsigned int NumberOfServices; //描述表的数目 PVOID ParamTableBase; //描述表的参数 }*PServiceDescriptorTable; extern PServiceDescriptorTable KeServiceDescriptorTable; 读取 ULONG GetCurAddress() { ULONG ulAddr; //当前的地址汇编的方法 // __asm // { // push eax; // push ebx; // mov ebx,KeSer; // mov ebx,[ebx] // mov eax,0x7A // shl eax,2 // add ebx,eax // mov ebx,[ebx] // mov ulAddr,ebx // pop eax; // pop ebx; // } // KdPrint(("以汇编的方式读取当前地址为%x",ulAddr)); // 用函数的方法... LONG *ptempAddr,temAddr; temAddr = (LONG)KeServiceDescriptorTable->ServiceTableBase; //获取描述表的地址 ptempAddr = (PLONG)(temAddr + 0x7A*4); //+ 0x7A*4 转换成指针 ulAddr = *ptempAddr; // 转回变量 这样ulAddr就保存着地址 KdPrint(("以函数的方式读取当前地址为%X",ulAddr)); return ulAddr; } ULONG GetOldAddress() { UNICODE_STRING NtOpenProcessName; ULONG NtOpenProcess_Old_Addr; RtlInitUnicodeString( &NtOpenProcessName, L"NtOpenProcess"); NtOpenProcess_Old_Addr = (ULONG)MmGetSystemRoutineAddress(&NtOpenProcessName); KdPrint(("NtOpenProcess的启始地址为%X",NtOpenProcess_Old_Addr)); return 1; }