前些时写的.一直在考试..今天写下注释贴上来,不多说了.代码里面有详细的注释
没有写UnHook部分..大家可以自己写,做个练习,呵呵
hook.dll
;此程序的作用是HOOK进程创建函数CreateProcessInternalW
.386
.model flat,stdcall
option casemap:none
;编译方式:
;ml.exe /c /coff /nologo /Fo"hook.obj" "hook.asm"
;link.exe /SUBSYSTEM:WINDOWS /DEF:"hook.def" /DLL /nologo /OUT:"hook.dll" "hook.obj"
;思路很简单,在CreateProcessInternalW函数入口jmp到我们的处理函数,处理后直接返回或者再从我们的函数jmp回来继续执行
;主要是要注意一下怎么把jmp XXXXX翻译机器码,比如你要jmp到4000,当前你要修改的指令地址是1000
;由于jmp XXXX指令长5个字节所以XXXXX的值应该是4000-1000-5
;也就是jmp后面的地址不是你要跳转到的地址,而是你要跳转到的地址相对于当前指令下一条指令的偏移,明白了吧,call也一样
include std.inc ;添加常用的几个头文件
.data
szKernel32 db 'kernel32.dll',0
szCreateProcessInternalW db 'CreateProcessInternalW',0
szStartHook db 'StartHook',0
hCreateProcess DWORD 0
hStartHook DWORD 0
hProcess DWORD 0
szBuf db 5 dup(0)
szMsg dw 04f60h,08ba9h,04ed6h,08fd0h,0884ch,04e48h,0003fh,0003fh,0003fh,0000;你让他运行么???的unicode编码
hhk DWORD 0
szHookDll db 'hook.dll',0
.code
DllMain proc hInst:DWORD,nReason:DWORD,unused:DWORD
.if nReason==DLL_PROCESS_ATTACH
invoke GetModuleHandle,offset szKernel32
invoke GetProcAddress,eax,offset szCreateProcessInternalW ;获取CreateProcessInternalW的入口地址
mov hCreateProcess,eax
invoke GetProcAddress,hInst,offset szStartHook ;获取自己处理函数部分的地址,即StartHook的地址
mov hStartHook,eax
invoke GetCurrentProcessId
invoke OpenProcess,PROCESS_VM_OPERATION or PROCESS_VM_WRITE,FALSE,eax ;一定要先打开这些权限
mov hProcess,eax
mov eax,hStartHook ;StartHook的函数地址
sub eax,hCreateProcess ;减去当前CreateProcessInternalW的入口地址
sub eax,5 ;再减去jmp XXXX的5个字节,就等于jmp后面的地址了
lea edx,szBuf
mov BYTE ptr [edx],0e9h ;0e9是jmp的机器码
mov DWORD ptr [edx+1],eax
invoke WriteProcessMemory,hProcess,hCreateProcess,offset szBuf,5,0 ;写入"jmp StartHook"
invoke CloseHandle,hProcess
.endif
ret
DllMain endp
StartHook proc
mov eax,esp
push 1
push offset szMsg
push DWORD ptr [eax+0ch] ;进程信息的unicode码
push 0
call MessageBoxW ;弹出消息框.让用户确认
.if eax==1 ;如果"是"的话,跳回去继续执行
push 0a08h ;这个是被我们的"jmp StartHook"替换掉的那条指令,这里一定要补上
push hCreateProcess ;
add DWORD ptr [esp],5;先把返回地址push到栈里,再ret返回,+5的原因应该知道吧
ret
.else
ret 030h ;否则直接返回,注意:CreateProcessInternalW的压栈参数比CreateProcessW多一个,这里选择修改前者是
.endif ;因为CreateProcessInternalw的第一条指令刚好是5个字节,便于修改
StartHook endp
;下面的是一个SetWindowsHookEx函数的应用.目的是全局hook,实际上什么处理都没有
MsgHook proc lcode,wParam,lParam
invoke CallNextHookEx,hhk,lcode,wParam,lParam
ret 0ch
MsgHook endp
SetHook proc
invoke GetModuleHandle,offset szHookDll
invoke SetWindowsHookEx,WH_GETMESSAGE,MsgHook,eax,0
mov hhk,eax
ret
SetHook endp
end DllMain
;By Hatling
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)