首页
社区
课程
招聘
未解决 [求助]Inline hook如何才能不破坏原寄存器和堆栈环境?
发表于: 2020-8-8 18:33 6980

未解决 [求助]Inline hook如何才能不破坏原寄存器和堆栈环境?

2020-8-8 18:33
6980

问题:在写64位inline hook的时候,在代理函数中,总是避不开破坏现场环境.
尝试解决:
1.倘若在代理函数头部将寄存器信息压入堆栈,此时如果目标函数的参数多于4个,则多余那些参数便取不到.
2.如果申请一段内存,将寄存器信息保存在这段申请的内存中,则需要将这段内存的地址作为参数传给saveRegister函数,如此rcx便被破坏.
3.如果将方案2申请的内存作为全局变量,在汇编文件中引用外部变量,可解决此问题,但如此一来,如果要hook 多个函数,则得引用多个外部变量,耦合太高了

 

不知有更好的解决方案吗?


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 1
支持
分享
最新回复 (21)
雪    币: 57
活跃值: (2463)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
兼容性最好的就是第3方案  引用多个数组就是了
2020-8-8 19:52
0
雪    币: 1067
活跃值: (627)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
同求~
2020-8-8 22:09
0
雪    币: 6124
活跃值: (4716)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
4
参考detours
2020-8-8 22:47
0
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
目标函数的参数大于4个,多余的参数一样可以传递给代理函数
除此之外,还可以用线程局部变量来保存寄存器数据
2020-8-9 04:41
0
雪    币: 12848
活跃值: (9167)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
6
FF 25 00 00 00 00 + ULONG64 addr
2020-8-9 13:33
0
雪    币: 660
活跃值: (2105)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
7
yy虫子yy 目标函数的参数大于4个,多余的参数一样可以传递给代理函数 除此之外,还可以用线程局部变量来保存寄存器数据
x64通常由rsp+偏移来寻址,如果把寄存器给压入栈,那真的还能寻到多余4个的参数吗?
另外,可否请教一下"用线程局部变量来保存寄存器数据"该怎么做?
2020-8-9 13:56
0
雪    币: 660
活跃值: (2105)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
8
hzqst FF 25 00 00 00 00 + ULONG64 addr
谢谢,不过我指的是执行代理函数的代码会破坏现场啦,
2020-8-9 13:56
0
雪    币: 12848
活跃值: (9167)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
9
FeJQ 谢谢,不过我指的是执行代理函数的代码会破坏现场啦,
pushfq+pushaq+call internalproxy+popaq+popfq
2020-8-9 14:44
0
雪    币: 660
活跃值: (2105)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
10
hzqst pushfq+pushaq+call internalproxy+popaq+popfq
这么一堆push,那可不就寻不到第5,6,7...个参数了吗?
2020-8-9 14:54
0
雪    币: 12848
活跃值: (9167)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
11
FeJQ 这么一堆push,那可不就寻不到第5,6,7...个参数了吗?
mov rcx, rsp然后自己从stack+offset取啊
2020-8-9 15:19
0
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
FeJQ x64通常由rsp+偏移来寻址,如果把寄存器给压入栈,那真的还能寻到多余4个的参数吗? 另外,可否请教一下"用线程局部变量来保存寄存器数据"该怎么做?
根据x64函数调用规则,以rsp+偏移的形式,超过4个参数由堆栈来传递
那么代理函数把第5个参数从堆栈中取出来,按照规则再入一次栈,就可以传递给原函数调用
而线程局部变量是为了多线程同时调用函数,使每个变量的数据都只对其所属线程可见
也就是说其作用域只存在于此线程,数据不会被别的线程破坏,根据这一点,就可以用作寄存器数据的保存
2020-8-9 16:05
0
雪    币: 660
活跃值: (2105)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
13
yy虫子yy 根据x64函数调用规则,以rsp+偏移的形式,超过4个参数由堆栈来传递 那么代理函数把第5个参数从堆栈中取出来,按照规则再入一次栈,就可以传递给原函数调用 而线程局部变量是为了多线程同时调用函数, ...
感觉实现起来还是很棘手,不知有没有相关资料,代码,或x64内核hook库推荐?
2020-8-9 16:40
0
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
FeJQ 感觉实现起来还是很棘手,不知有没有相关资料,代码,或x64内核hook库推荐?
棘手后才可以熟能生巧,怕棘手就干不成这事
2020-8-9 20:18
0
雪    币: 660
活跃值: (2105)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
15
yy虫子yy 棘手后才可以熟能生巧,怕棘手就干不成这事
好的,谢谢啦
2020-8-9 22:47
0
雪    币: 29
活跃值: (5857)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16

动态生成汇编跳板函数(汇编是为了将地址硬编码进去),在跳板内备份和恢复

最后于 2021-6-24 10:29 被不吃早饭编辑 ,原因:
2021-6-21 19:59
0
雪    币: 660
活跃值: (2105)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
17
不吃早饭 动态生成编写汇编跳板,在跳板内备份和恢复
请问“动态生成编写汇编跳板”是什么意思?
2021-6-23 22:02
0
雪    币: 29
活跃值: (5857)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18

inline hook时别直接跳转到replace函数,先跳转到一级跳板函数内,在一级跳板函数内对寄存器和堆栈进行备份(为了保证能够将replace函数地址进行硬编码,需要使用汇编实现),调用原函数时,在真正执行原函数调用跳板前,先对寄存器和堆栈进行恢复即可。至于怎么硬编码进去,你怎么inline hook的就怎么硬编码进去咯

最后于 2021-6-24 10:32 被不吃早饭编辑 ,原因:
2021-6-24 10:30
0
雪    币: 29
活跃值: (5857)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19

本来实现inline hook只需要在调用原函数前调用一个执行被覆盖指令的跳板函数,现在为了对寄存器和堆栈进行备份,我们还需要一个在执行replace函数前的backup跳板,以及调用原函数前的recovery跳板

最后于 2021-6-24 10:32 被不吃早饭编辑 ,原因:
2021-6-24 10:32
0
雪    币: 660
活跃值: (2105)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
20
不吃早饭 本来实现inline hook只需要在调用原函数前调用一个执行被覆盖指令的跳板函数,现在为了对寄存器和堆栈进行备份,我们还需要一个在执行replace函数前的backup跳板,以及调 ...
明白啦, 感谢大佬
2021-6-24 11:05
0
雪    币: 327
活跃值: (159)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
学习
2024-3-28 03:42
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
22
FeJQ x64通常由rsp+偏移来寻址,如果把寄存器给压入栈,那真的还能寻到多余4个的参数吗? 另外,可否请教一下"用线程局部变量来保存寄存器数据"该怎么做?
hao
2024-3-28 10:43
0
游客
登录 | 注册 方可回帖
返回
//