详解如何利用Windows设备驱动
2009-02-12 13:55:33 来源:WEB开发网关键点2:加载ntoskrnl.exe 模块,并获得KeUserModeCallback_Routine 地址
加载ntoskrnl.exe到程序的空间非常简单,我们可以使用LoadLibraryEx API 实现。不同的Windows 内核有不同的KeUserModeCallback_Routine 地址,因此我们需要获取当前的地址。正如你所看到的call 请求那样(call dword ptr [KiSetTimeUpdateNotifyRoutine]),请求总是来自低于KeUserModeCallback 函数的地址。我们会利用这个特性,我们需要找到KeUserModeCallbac 地址,搜索特殊的call 指令代码(0xFF15 byte),经过简单的计算我们就可以得到KeUserModeCallback_Routine 的地址。代码我们举例说明:
;------------------------------------------------------------
;findstheKeUserModeCallback_Routinefromntoskrnl.exe
;------------------------------------------------------------
find_KeUserModeCallback_Routineproc
pushad
push1;DONT_RESOLVE_DLL_REFERENCES
push0
@pushsz"C:windowssystem32ntoskrnl.exe";ntoskrnl.exeisokalso
@callxLoadLibraryExA;loadlibrary
@check0,"Error:cannotloadlibrary"
movebx,eax;copyhandletoebx
@pushsz"KeUserModeCallback"
pusheax
@callxGetProcAddress;gettheaddress
movedi,eax
@check0,"Error:cannotobtainKeUserModeCallbackaddress"
scan_for_call:
incedi
cmpwordptr[edi],015FFh;thecallwesearchfor?
jnescan_for_call;nope,continuethescan
moveax,[edi+2];EAX=calladdress
movecx,[ebx+3ch]
addecx,ebx;ecx=PEH
movecx,[ecx+34h];ECX=kernelbasefromPEH
subeax,ecx;gettherealaddress
movdwordptr[KeUserModeCallback_Routine],eax;store
popad
ret
find_KeUserModeCallback_Routineendp
更多精彩
赞助商链接