首页
论坛
课程
招聘
[原创]SandHook with x86
2021-6-3 18:43 8991

[原创]SandHook with x86

2021-6-3 18:43
8991

引言


最近论坛某些人重新定义“开源”的行为实属把我逗乐了,甚至还提前几天在论坛里发预告,结果你给我整个内部群里发布了,这不搞笑的么,对此我觉得有必要用行动告诉一下他到底什么才叫开源。

这里我打算开源兼容了x86架构的SandHook框架,SandHook大家肯定不陌生了,大名鼎鼎的EdXposed的两个实现方案之一就是基于SandHook完成的。可惜大佬ganyao114视乎对x86不太感冒,n个commit前就表示x86小问题有空就更新,然鹅时间已经过去很久了,本菜鸟还是没能等到期望的commit。考虑到自己的一些项目需要在模拟器上跑,所以就自己开干咯。


这里先放github地址:https://github.com/necuil/SandHook_with_x86

找了半天没看到哪里加大字号,难受...


看一下效果图,在雷电4模拟器测试无异常。这里只是为了演示,没用xposed,有需要的话直接使用大佬提供好的xposedCompat即可。


开干


本来想详细介绍介绍怎么实现的,想想还是算了,要打很多字的样子,因为本人很懒,所以还是放几张截图算了(笑

repo里涉及汇编的地方,我都尽量考虑了字节对齐

这里是为了手动解析tls,相关代码可以在aosp里找到(https://cs.android.com/android/platform/superproject/+/master:bionic/libc/platform/bionic/tls.h),x86_64的我也一并补上了,虽然并没有适配就是了(逃


这里主要是因为arm指令,thumb指令以及arm64指令长度是固定的,但x86并非如此。因此需要根据inlinehook时被覆盖的指令的实际长度来确定调用原函数时,执行完被覆盖指令后,应当继续执行的下一条指令在原函数的位置




汇编这一页太长了,剩下的就不截了,建议直接在repo里看。主要是x86没有地址无关码,写起来着实蛋疼,实现时用了不少奇技淫巧,姑且是实现了无寄存器污染。本菜鸟汇编不太好,如果各位大佬有更好的实现的话欢迎吐槽


这些是inlineHook时要对跳板进行填充的位置,没想到什么好办法,编译好之后在ida里一点点算出来的


这个类是SandHook进行inlineHook时用于检测要hook的函数头部是否包含相对地址指令的,如果包含则需要花费大量的代码来将他们转换为对应的绝对地址指令。可能是考虑到hook java函数时出现这种情况的可能性比较低吧,这里大佬ganyao114在发现存在相对地址指令时直接选择放弃inlineHook了。这里我用Substrate里提供的hde64反汇编引擎来完成x86下的反汇编操作,考虑到ganyao114并没有提供x86下的inlineHook实现(用于hook VM实现PendingHook等功能),这里刚好就用Substrate来完成了。


除了以上提到的点之外,还有一些细枝末节的东西,因为时间比较久了,都记不太清了,不过都是小问题,大家自己看看代码就差不多了。辣么就酱,我先溜了,兄弟萌~


第五届安全开发者峰会(SDC 2021)10月23日上海召开!限时2.5折门票(含自助午餐1份)

最后于 2021-6-5 17:13 被不吃早饭编辑 ,原因:
收藏
点赞1
打赏
分享
最新回复 (3)
雪    币: 312
活跃值: 活跃值 (2031)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
乌云科技团队 活跃值 2021-6-3 21:21
2
0
占坑
雪    币: 228
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
深山老琳 活跃值 2021-6-4 00:47
3
0
大佬,360过签,模拟器有望了
雪    币: 6590
活跃值: 活跃值 (838)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xie风腾 活跃值 2021-6-5 17:00
4
0

虽然看不懂,感觉很强大地样纸
多谢楼主分享
游客
登录 | 注册 方可回帖
返回