-
-
[原创]SandHook with x86
-
2021-6-3 18:43
14227
-
引言
最近论坛某些人重新定义“开源”的行为实属把我逗乐了,甚至还提前几天在论坛里发预告,结果你给我整个内部群里发布了,这不搞笑的么,对此我觉得有必要用行动告诉一下他到底什么才叫开源。
这里我打算开源兼容了x86架构的SandHook框架,SandHook大家肯定不陌生了,大名鼎鼎的EdXposed的两个实现方案之一就是基于SandHook完成的。可惜大佬ganyao114视乎对x86不太感冒,n个commit前就表示x86小问题有空就更新,然鹅时间已经过去很久了,本菜鸟还是没能等到期望的commit。考虑到自己的一些项目需要在模拟器上跑,所以就自己开干咯。
这里先放github地址:https://github.com/necuil/SandHook_with_x86
找了半天没看到哪里加大字号,难受...
看一下效果图,在雷电4模拟器测试无异常。这里只是为了演示,没用xposed的接口,有需要的话直接使用SandHook自带的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来完成了。
除了以上提到的点之外,还有一些细枝末节的东西,因为时间比较久了,都记不太清了,不过都是小问题,大家自己看看代码就差不多了。辣么就酱,我先溜了,兄弟萌~
[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。
最后于 2021-11-1 17:22
被不吃早饭编辑
,原因: