線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:961
推到 Plurk!
推到 Facebook!

如何HOOK asm 中的call 指令?

缺席
allen-86
一般會員


發表:28
回覆:44
積分:19
註冊:2008-02-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2012-04-10 15:34:46 IP:58.30.xxx.xxx 訂閱
 71A21B62 8BD8 mov ebx, eax
:71A21B64 E8C7F6FFFF         call 71A21230 //将被HOOK的机器码(第3种方法)
:71A21B69 3BDF             cmp ebx, edi
:71A21B6B 5B               pop ebx    
3,更改CALL指令的相对地址(CALL分别在71A21B12、71A21B25、71A21B64,但前面2条CALL之前有一个条件
跳转指令,有可能不被执行到,因此我们要HOOK 71A21B64处的CALL指令)。为什么要找CALL指令下手?
因为它们都是5字节的指令,而且都是CALL指令,只要保持操作码0xE8不变,改变后面的相对地址就可以转
到我们的HOOK代码去执行了,在我们的HOOK代码后面再转到目标地址去执行。    假设我们的HOOK代码在71A20400处,那么我们把71A21B64处的CALL指令改为CALL 71A20400(原指令是这样的:CALL 71A21230)
而71A20400处的HOOK代码是这样的:    71A20400:
pushad    //在这里做你想做的事情    popad
jmp 71A21230   //跳转到原CALL指令的目标地址,原指令是这样的:call 71A21230    这种方法隐蔽性很好,但是比较难找这条5字节的CALL指令,计算相对地址也复杂。
我用delphi7实现,现在可以计算出 HookProc的地址 也就是16进制码:E8 C7F6FFFF (71A21B64处的CALL指令改为CALL 71A20400)
也能取得原地址的16进制。 资料说:jmp 回去即可。但是我用OD追踪的时候,EAX ,EDX ,ECX的值popad的时候 已经改变了 Procedure MyHookProc;stdcall; var pOldProc:Pointer; begin asm pushad end; MessageBox(0,"","",0); asm popad end; asm jmp pOldProc end;
end;
pOldProc 地址取的是原call指令处的16进制(E8  C7F6FFFF)  即:C7F6FFFF
现在的问题是:能够Hook到,但是自己的过程返回的时候,会报错。
------
The empty vessels make the greatest sound.
系統時間:2017-10-18 17:16:47
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!