如何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
相关产品推荐
相关产品推荐

