22.Inline_Hook
引入
根据上节课IAT HOOK结尾的局限性分析,自己写的函数,或者是通过LoadLibrary进来的函数在IAT 表中都是不存在的。这时候我们就需要用到Inline HOOK
Inline HOOK(内联HOOK),CE工具中的代码注入用到的就是这种HOOK。原理就是,在HOOK点修改指令,跳转到我们的函数位置,然后此时就可以获取到寄存器,堆栈信息。执行完我们自己的代码后再跳转回到原来的位置执行。
注意事项
在制作Inline hook的过程中有不少需要注意的地方:
- 当我们在跳转的时候可以用E8(Call),E9(Jmp)这些后面跟的地址都是需要通过公式计算的。公式:X = 要跳转到的地址 - 5 - 当前地址(X就是跳转指令后面的值)
- 当我们HOOK插入跳转指令的时候会修改掉一些指令,但是当前函数还没有执行这几条指令,所以在我们的函数执行完成之前还得调用回这几条指令
- 当我们跳转到我们自己的函数区域时可能会对堆栈、寄存器做修改,这时候就得在执行这些操作之前保存寄存器的值,在完成操作后恢复寄存器和堆栈
- 这里还有一个要注意的地方就是想要直接获取到自定义函数的函数首地址不能直接用函数名,这里有个坑是这样的,当我们在调试过程中进入函数名的地址中时我们会发现这里不是函数所在的地方,而是一个jmp,跳转到函数的首地址。我们来验证一下这个观点:
自定义一个函数,然后调试->转到反汇编,看看函数地址:
此时的函数地址时413660,我们再看看DWORD tmp = (DWORD)函数地址是什么个东西,诶?这个tmp它不是首地址,那他是个啥咧?:
我们直接启动调试,然后在反汇编窗口直接跳到这个位置,发现这里是一个jmp,而jmp的地址就是函数的首地址

大致流程:

代码实现
Main.cpp
1 |
|
InlineHook.h
1 |
|
InlineHook.cpp
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 x0r's blog!
