You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何Hook长度小于Hook跳转指令的短函数?

短函数Hook的5字节跳转覆盖问题解决方法

针对你遇到的setVisible函数仅4字节、无法直接写入5字节跳转指令的情况,以下是几种可行的解决思路:

1. 指令窃取+跳板跳转(最优解)

因为写入5字节跳转指令会覆盖下方FUN_0047c0a0的第一个字节,我们可以把被覆盖的字节也一起搬迁到跳板内存,保证原程序逻辑不被破坏:

  • 找到一块可执行的空闲内存(比如通过VirtualAlloc申请内存,或利用PE文件中未使用的节区)。
  • 将原setVisible的4字节指令(88 50 18 c3)加上FUN_0047c0a0的第一个字节,总共5字节复制到跳板内存。
  • 在跳板内存的这5字节指令后,添加一条跳回FUN_0047c0a0+1地址的长跳转指令(E9 [偏移量],偏移量=目标地址 - 当前指令地址 - 5)。
  • 在原setVisible的起始地址0047c09c写入5字节的长跳转指令(E9 [偏移量]),指向你的自定义Hook函数。
  • 自定义Hook函数执行完业务逻辑后,若需要保留原功能,可调用跳板内存中的指令,之后正常返回。

2. 直接模拟原函数逻辑(无需跳转回原函数)

由于setVisible的逻辑非常简单:仅执行MOV byte ptr [param_1 + 0x18], param_2后返回,你可以在自定义Hook函数里直接实现这个逻辑,无需依赖原函数:

  • 在原setVisible地址写入5字节长跳转指令到自定义Hook函数,同时用“指令窃取”方法修复FUN_0047c0a0被覆盖的第一个字节(将该字节搬迁到跳板,跳转后执行跳板指令再跳回FUN_0047c0a0+1)。
  • 自定义Hook函数中,先处理你的业务逻辑,然后执行MOV byte ptr [EAX + 0x18], DL(调用约定为EAX存param_1,DL存param_2),最后执行RET返回。

3. 短跳转+长跳转组合(适合附近有空闲字节的情况)

如果setVisible附近存在未使用的字节(比如连续的NOP指令),可以用短跳转到空闲字节,再在空闲字节写入长跳转:

  • 在原setVisible的前2字节写入短跳转指令(EB XX),跳转到附近的空闲字节地址。
  • 在空闲字节地址写入5字节长跳转指令到自定义Hook函数。
  • 将原函数的后2字节(18 c3)复制到跳板,Hook函数执行完逻辑后调用跳板执行原指令,再返回。

内容的提问来源于stack exchange,提问作者Nox

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 12:05:42