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

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

2020-8-8 18:33
6552

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

 

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


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

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

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

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

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

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

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

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