hook怎么写( 三 )


下面以ws2_32.dll里的send()为例子来说明如何HOOK这个函数: Exported fn(): send - Ord:0013h 地址 机器码 汇编代码 :71A21AF4 55 push ebp //将被HOOK的机器码(第1种方法) :71A21AF5 8BEC mov ebp, esp //将被HOOK的机器码(第2种方法) :71A21AF7 83EC10 sub esp, 00000010 :71A21AFA 56 push esi :71A21AFB 57 push edi :71A21AFC 33FF xor edi, edi :71A21AFE 813D1C20A371931CA271 cmp dword ptr [71A3201C], 71A21C93 //将被HOOK的机器码(第4种方法) :71A21B08 0F84853D0000 je 71A25893 :71A21B0E 8D45F8 lea eax, dword ptr [ebp-08] :71A21B11 50 push eax :71A21B12 E869F7FFFF call 71A21280 :71A21B17 3BC7 cmp eax, edi :71A21B19 8945FC mov dword ptr [ebp-04], eax :71A21B1C 0F85C4940000 jne 71A2AFE6 :71A21B22 FF7508 push [ebp+08] :71A21B25 E826F7FFFF call 71A21250 :71A21B2A 8BF0 mov esi, eax :71A21B2C 3BF7 cmp esi, edi :71A21B2E 0F84AB940000 je 71A2AFDF :71A21B34 8B4510 mov eax, dword ptr [ebp+10] :71A21B37 53 push ebx :71A21B38 8D4DFC lea ecx, dword ptr [ebp-04] :71A21B3B 51 push ecx :71A21B3C FF75F8 push [ebp-08] :71A21B3F 8D4D08 lea ecx, dword ptr [ebp+08] :71A21B42 57 push edi :71A21B43 57 push edi :71A21B44 FF7514 push [ebp+14] :71A21B47 8945F0 mov dword ptr [ebp-10], eax :71A21B4A 8B450C mov eax, dword ptr [ebp+0C] :71A21B4D 51 push ecx :71A21B4E 6A01 push 00000001 :71A21B50 8D4DF0 lea ecx, dword ptr [ebp-10] :71A21B53 51 push ecx :71A21B54 FF7508。
4. 如何HOOK任意函数 This HOWTO deals with pre-hooks. For details on post-hooks, see 如何安全的Post-Hook一个函数.
For more information on the actual hooking of functions, see 如何Hook一个函数.
你通常这样使用么
Meet Joe Average Hook:
local orig_foo = foo
function foo(a1, a2)
-- some code that looks at a1
return orig_foo(a1, a2)
end
问题在于这个方法只能处理固定数目的参数, 如果方法的API改变了, 将导致无法使用. 幸运的是我们有办法使他继续工作.
Blizzard's APIs do change from time to time!
使用安全的方式
local orig_foo = foo
function foo(a1, )
--do something with a1
return orig_foo(a1, )
end
这样确保了所有的参数会传递到原始方法中, 即便你不知道具体有多少个参数. 同样确保了所有返回值都能正确返回. 另一个好处是, 我们使用了局部变量来保存原始方法并做了一个适当的尾调用可以带来更好的性能, 从而为我们的hook做了最小化的付出.
会带来巨大的性能影响么?
在WoW-2.0以前的设计中, 使用unpack(), 在每次hook被调用时创建一个垃圾回收表. 在新的设计中改进了, 使用''变量, 去掉了垃圾回收这部分源码. 在Lua5.1中, 在每次hook调用时包括传参和返回值都不会浪费表的内存.
5. 谁能比较详细的介绍一下Hook的概念和使用方法 HOOK,我的懂得是,一个体系函数调用的用户函数,一般情况下,都是有应用软件调用体系函数来实现所需的功能,然则在某些情况下,比如体系须要向应用软件发送的信息量比较大年夜,或者是要交互的发送信息,这个时或就须要应用软件写一个本身的函数,给体系调用,经由过程这个函数的参数体系向法度榜样发送法度榜样请求的信息,经由过程参数法度榜样也可以影响体系下一步发送的信息 。
在很多的情况下,HOOK函数都是在调用这个函数的过程中运行的,而不是在应用法度榜样的过程中,所以HOOK函数的请求很高,不要破坏调用过程 。在HOOK函数运行时,应用法度榜样过程往往是浊宣的,也就是HOOK函数耗用的是应用法度榜样的CPU时光,而不是调用过程的,即使调用过程此时也是浊宣的,但这不是绝对的,所以在某些情况下还要推敲和主过程的同步问题,最典范的是SetWindowsHookEx()函数设置的HOOK,HOOK函数必须在DLL中,全部DLL都被装入IE的过程中,要大年夜HOOK函数返回信息给应用法度榜样必须要经由过程一些例如MappingFile,Pipe等过程间通信的方法,还要留意过程间拜访同一数据的同步 。