X64 inlineHook 总结

提要

        inline hook最终目的其实就是修改了机器码,改变原有的执行流程。因此最终目的即使得cpu的eip变化。

热修补

        编译型的语言,在编译时候都有一个选项叫做热修补。热修补的最终实际实现其实是在每个函数头添加一个一段占位的汇编,且该汇编代码不会影响cpu的执行状态。

        说到这里,我们第一反应就是nop。没错,nop就是其中之一。不过一般的程序热修补都不会使用nop,而是一些其他的指令。譬如

USER32.SetRect+36       - CC                    - int 3 
USER32.SetRect+37       - CC                    - int 3 
USER32.SetRect+38       - CC                    - int 3 
USER32.SetRect+39       - CC                    - int 3 
USER32.SetRect+3A       - CC                    - int 3 
USER32.SetRect+3B       - CC                    - int 3 
USER32.SetRect+3C       - CC                    - int 3 
USER32.SetRect+3D       - CC                    - int 3 
USER32.SetRect+3E       - CC                    - int 3 
USER32.SetRect+3F       - CC                    - int 3 
USER32.CallNextHookEx   - 8B FF                 - mov edi,edi
USER32.CallNextHookEx+2 - 55                    - push ebp
USER32.CallNextHookEx+3 - 8B EC                 - mov ebp,esp
USER32.CallNextHookEx+5 - 51                    - push ecx
USER32.CallNextHookEx+6 - 51                    - push ecx
USER32.CallNextHookEx+7 - 64 8B 0D 18000000     - mov ecx,fs:[00000018] { 24 }
USER32.CallNextHookEx+E - 8B 81 DC0F0000        - mov eax,[ecx+00000FDC]

        上文中 CallNextHookEx 函数开头的 mov edi,edi 即为热修补的占位代码。目的是使得第一条指令的大小大于等于2字节。因为jmp 短跳的指令大小即为2字节。

        而该两字节仅仅作为跳板,跳到哪里呢,当然是上方的int 3的空地址空间,并且再修改此处的地址的代码再次跳转到真实地址。因为长跳转需要的地址长度超过了5字节。

用于hook的汇编代码

         1、2G空间范围内跳转: 5字节

02520000 - E9 FBFFADFF           - jmp 02000000
02520005 - 90                    - nop 
02520006 - 90                    - nop 
02520007 - 90                    - nop 
02520008 - 90                    - nop 

        2、2G空间范围内表跳转:6字节

02520000 - FF 25 FAFFADFF        - jmp qword ptr [02000000]
02000000:存放函数地址

        3、无限制hook:16字节

02520000 - 50                      - push rax
02520001 - 48 B8 F0DEBC9A78563412  - mov rax,123456789ABCDEF0
0252000B - 48 87 04 24             - xchg [rsp],rax
0252000F - C3                      - ret 

        4、直接跳转:14字节

02520000 - FF25 00000000 F0DEBC9A78563412 - jmp 123456789ABCDEF0

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
x64 Inline Hook(内联钩子)是一种在x64架构下实现的钩子技术,用于在程序运行时对函数进行修改或者监控。钩子技术可以用于实现一些高级功能,如函数拦截、行为修改和调试等。 Inline Hook的主要原理是通过修改函数的机器码,将目标函数的执行流程改变到一个特定的钩子函数,从而实现我们所需的功能。这个钩子函数可以进行一系列的操作,如记录参数、修改参数、替换返回值等。 x64 Inline Hook实现相对复杂,因为x64架构下的指令集更加复杂,并且x64架构引入了新的寄存器和指令,如RAX、R10、R11,还有新的调用惯例等。因此,在实现x64 Inline Hook前,我们需要对x64汇编指令和调用惯例有深入的了解。 具体实现Inline Hook主要包括以下几个步骤: 1. 定位到目标函数的地址。可以通过符号表、导入表或者动态调试等方式获取目标函数的地址。 2. 备份目标函数的原始字节码。为了在后续操作中恢复目标函数的完整执行流程,我们需要保留原始字节码。 3. 修改目标函数的字节码。通过修改目标函数的机器码,将执行流程转移到我们的钩子函数。 4. 编写钩子函数。钩子函数的参数和返回值需要与目标函数保持一致,并实现所需的功能。 5. 恢复目标函数的原始字节码。在钩子函数执行完毕后,需要将目标函数的字节码恢复到原始状态,以确保程序正常运行。 6. 跳回目标函数。在钩子函数执行完成后,我们需要将执行流程跳转回原始的目标函数。 需要注意的是,Inline Hook的实现需要考虑到多线程的情况,并且要保证对内存的修改是线程安全的,以及在恢复原始字节码时要避免潜在的问题。 总的来说,x64 Inline Hook是一种强大的技术,可以用于实现程序的函数修改和监控等高级功能。但它的实现相对复杂,需要对x64架构和汇编指令有深入的理解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值