inline hook 实际上就是指 通过改变目标函数头部的代码来使改变后的代码跳转到我们自己设置的一个函数里,产生hook。
今天就拿MessageBoxA这个api函数来做实验。功能就是当程序调用MessageBoxA 时,我们打印出MessageBoxA的参数
大概代码结构应该是这样
<a></a>
我们先看看汇编是怎样调用MessageBoxA的
首先看到,MessageBoxA里面
mov edi,edi
mov ebp
mov ebp,esp
刚好是5个字节,5个字节可以做一个远jmp
直接汇编改成我们自己的jmp
改后结果如下
单步执行发现hook成功。但程序崩溃。原因主要是由于
我们破坏了真正的MessageBox使们想要调用真正的MessageBox时也会调用失败了,所以我们要调用真正的MessageBox时要加上头部被我们换掉的部分,我们要内联汇编,里面不能含有编译器自动添加的代码,所以在myMessageBox头部要加上 _declspec(naked)
vs2010的debug版本每执行一个函数都要 cmp esi,esp 来验证堆栈的。所以还要加一句push esi 和pop esi
下面说一下用代码来写MessageBoxA着呢5个字节
先声明一个JMP结构体。注意前面加 #pragma pack(1)来避免内存对齐的一些规则
接下来写hook函数
现在测试成功。
完整源代码如下: