首页
社区
课程
招聘
未解决 inline hook后jmp指令解析错误问题? 10雪币
发表于: 2024-9-10 22:07 1832

未解决 inline hook后jmp指令解析错误问题? 10雪币

2024-9-10 22:07
1832

比如图片中我hook的函数是MessageBoxA,我复制完原来MessageBoxA的前几条指令到其他的内存中,我们知道jmp指令里面使用的是解析过后的地址,是一个基于上下文环境的相对地址,那么我在其他的内存中执行这段代码就会报错,有什么办法解决这个呢?
.
我目前想到的是,先在MessageBoxA头部写入一个jmp指令,跳到我们的函数,然后在我们的函数中恢复MessageBoxA挂钩,然后手动调用执行MessageBoxA后再重新挂钩,但是这样每次执行函数都要进行一次挂钩和解除挂钩,效率非常低,所以有什么办法能解决上面的问题呢?
.
希望大佬指点迷津,感谢!


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 57
活跃值: (2433)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
挂钩到新地址上 新地址模拟函数的头部再调回来jump到函数的HOOK的地址下面  调用函数就直接调用该地址 这样就不需要恢复函数
2024-9-11 08:22
0
雪    币: 767
活跃值: (3415)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
3
出错的两条指令,应该都是rip相关的,就是里面的内存地址、跳转目标都是以当前rip来计算偏移的,所以你把代码复制到新地址,就会出错。想维持原指令,只通过修复偏移地址的话,可能不太显示,因为储存偏移的空间不一定够,比如je那条指令,本身是个短跳,偏移只给了一个字节,而实际应用的时候,新地址与旧地址的偏差甚至可能超出4个字节。所以应该先理解指令指令,然后通过其他指令变相实现旧指令的功能。如果要再加上通用性,那就更麻烦了。
至于另外提到的挂钩后恢复指令执行的方案,可能要考虑多线程冲突。所以建议还是用成熟的轮子吧
2024-9-11 08:50
0
雪    币: 716
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
qiusuper 挂钩到新地址上 新地址模拟函数的头部再调回来jump到函数的HOOK的地址下面 调用函数就直接调用该地址 这样就不需要恢复函数
这个怎么挂钩到新地址上呢,除了jmp过去,对于系统函数就只能改ssdt表了吧,在不更改原来函数代码的情况下?
2024-9-11 08:56
0
雪    币: 716
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5
yeyeshun 出错的两条指令,应该都是rip相关的,就是里面的内存地址、跳转目标都是以当前rip来计算偏移的,所以你把代码复制到新地址,就会出错。想维持原指令,只通过修复偏移地址的话,可能不太显示,因为储存偏移的空 ...
是的 detours就是这么干的
2024-9-11 09:00
0
雪    币: 1846
活跃值: (1801)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
6
开头2行就足够hook了吧,应该和第三行汇编无关。
2024-9-11 09:03
0
雪    币: 716
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
shuax 开头2行就足够hook了吧,应该和第三行汇编无关。
如果是用jmp指令的话需要14个字节 如果使用 push ret 指令跳转写入的字节会少一些
2024-9-11 09:21
0
雪    币: 716
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
shuax 开头2行就足够hook了吧,应该和第三行汇编无关。
我还是直接用Detours吧,自己写确实比较麻烦
2024-9-11 09:26
0
游客
登录 | 注册 方可回帖
返回
//