前言
我们知道常见的注入方式有IAT hook、SSDT hook、Inline hook等,但其实大体上可以分为两类,一类是基于修改函数地址的hook,一类则是基于修改函数代码的hook。而基于修改函数地址的hook最大的局限性就是只能hook已导出的函数,对于一些未导出函数是无能为力的,所以在真实的hook中,Inline hook反而是更受到青睐的一方。
hook测试
这里我用win32写了一个MessageBox
的程序,当点击开始按钮就会弹窗,这里我写了一个Hook_E9
函数用来限制对MessageBoxA
的hook,如果检测到了hook,则调用ExitProcess
直接退出程序
如下所示,这里我们的目的就是通过Inline hook
来修改文本框中的内容
这里使用常规方式修改5个字节的硬编码,通过E9跳转到我们自己的函数进行修改,这里将代码打包成dll
通过远程线程注入,这里显示是注入成功了,但是会被我们的检测函数拦截,这里可以看到拦截的是E9
这个硬编码
然后我们这里对我们的程序的E9指令进行替换,修改为先用call
短跳到没有被监控的区域,然后再跳到我们自己的函数
然而这里还是被拦截,这里显示的是被CRC检测拦截了
我们知道Inline hook
无论是通过E8还是E9跳转,肯定是要修改内存的,那么如果程序有CRC检测,那么我们这种使用汇编跳到自己的处理函数的方法是怎么都行不通的。这里就不能使用常规的方法去规避hook,而是通过CPU的dr0-dr7寄存器去触发异常,通过异常处理函数来修改文本框的值,这里我们首先需要了解的是硬件断点
硬件断点
简单说一下软件断点和内存断点,软件断点就是我们通常在OD里面通过F2下的断点,它的原理是将我们想要断点的一个硬编码修改为cc,内存断点就是通过V