首页
社区
课程
招聘
[原创]SandHook 第二弹 - Xposed API 兼容 & 指令检查 & 进程注入
发表于: 2019-2-12 16:13 11866

[原创]SandHook 第二弹 - Xposed API 兼容 & 指令检查 & 进程注入

2019-2-12 16:13
11866

上一篇:
https://bbs.pediy.com/thread-249163.htm

由于 SandHook 需要手动写一个签名与目标方法相同的 Hook 方法,如果想把 API 包装成类 Xposed 的 Callback 式 API 是比较困难的,首先参数列表的解析就需要另外实现。

Epic 是用写好的一堆 Stub 函数进行分发,SandHook 参考了 EdXposed(YHAFA 的封装) 使用 Dexmaker 动态生成 Hook 函数。动态生成的函数包含参数列表保存以及转入 Xposed API 的逻辑。其实比较推荐 Byte Buddy,API 比较友好性能也不错。主要 EdXposed 使用 Dexmaker 已经实现过,所以就不做重复工作了。

主要分为两个方面:

修复 PC 寄存器相关的指令是 inline hook 的重要步骤,之所以 SandHook 之前不做,一是因为 OAT/JIT 出来的 Code 前几行基本都是栈操作指令,二是出来的 Code 都使用绝对地址。前几行 Code 包含 PC 相关代码的情况非常少见。。。。所以这个这个检查就当保险起见了。

这个困扰了我很久,之前在 9.0 32bit 下使用 inline hook 一直会莫名其妙挂掉。最后调试发现,前几行 32 位 thumb2 可能是 Thumb16/32 指令混合的。一级跳板是 4 字节对齐的,而备份出的原指令则肯能不是 4 字节对齐的。。。
这样等于一个 4 字节的原指令可能会被截取一半,最终导致非法指令。
之所以前面没有关注是因为 9.0 之前前几个指令基本都是 Thumb32。

Hook 想要应用到目标 APP 现在有几个方案:

总的来说各有优缺点:

在沙箱中注入 SandHook 逻辑,简单用网上的祖传代码改了下,写了个demo,目前测了 7.0 / 8.0
,8.0 以上 64 位目标进程暂时不能注入。
主要是 8.0 以上,dlopen 有限制,需要使用 linker 内部的函数,而 dlsym/fake_dlsym 并不能搜到符号,需要手动解析 ELF 去搜符号。
暂时只有 ELF32 的代码,不过 ELF64 有空也可以适配一下。

https://github.com/ganyao114/SandBoxHookPlugin

 
 
//setup for xposed
XposedCompat.cacheDir = getCacheDir();
XposedCompat.context = this;
XposedCompat.classLoader = getClassLoader();
XposedCompat.isFirstApplication= true;  
//do hook
XposedHelpers.findAndHookMethod(Activity.class, "onResume", new XC_MethodHook() {
      @Override
      protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
          super.beforeHookedMethod(param);
          Log.e("XposedCompat", "beforeHookedMethod: " + param.method.getName());
      }

      @Override
      protected void afterHookedMethod(MethodHookParam param) throws Throwable {
          super.afterHookedMethod(param);
          Log.e("XposedCompat", "afterHookedMethod: " + param.method.getName());
      }
});
  • 效果如下

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

收藏
免费 2
支持
分享
最新回复 (8)
雪    币: 916
活跃值: (3434)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
2
https://github.com/lizhangqu/dlfcn_compat
2019-2-12 16:20
0
雪    币: 1395
活跃值: (526)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
3
葫芦娃 https://github.com/lizhangqu/dlfcn_compat
谢了,那个 Zygote 注入代码应该是你的吧
2019-2-12 16:21
0
雪    币: 916
活跃值: (3434)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
4
坑大 谢了,那个 Zygote 注入代码应该是你的吧[em_19]
擦..还真是,其实那是个极度不稳定的代码,因为我连自己都没测过。。。。。
2019-2-12 16:24
0
雪    币: 403
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
感谢大牛分享
2019-2-12 17:10
0
雪    币: 15
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
每次看到这些代码,我都只默默的看着,从上往下,看完后抽支烟,这是说的什么啊,我完全看不懂啊
2019-2-12 23:18
0
雪    币: 1985
活跃值: (1831)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
感谢大牛分享
2019-2-13 04:13
0
雪    币: 138
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
葫芦娃 https://github.com/lizhangqu/dlfcn_compat
建议从动态链接器视角搜索符号
2019-2-28 15:14
0
雪    币: 116
活跃值: (1012)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
Xposed api 报错
sandhookdem: Unsupported class loader
这可咋搞
2021-3-23 13:41
0
游客
登录 | 注册 方可回帖
返回
//