Hook多dex的app

xiaoeryu Lv5

本章内容为多dex的hook

之前一章分析了对加壳的app进行hook,但是在多dex的情况下我们可能并不知道哪个ClassLoader加载了我们想要hook的dex。

实际上对加固app的处理也是对多dex处理的一个特例,因为加固的app也是加载了多次dex(首先加载壳的dex其次再加载应用本身的dex)。

加固的app有一个特殊的流程在于需要修正原来的ClassLoader但是如果app加载多个dex的话,我们拿到的就不一定是我们想要hook的ClassLoader了。

比如说在热更新的时候,从云端动态下发的dex其代码逻辑都下下发的这个dex当中。然后通过dexClassLoader去加载这个dex再调用其中的某个函数。

这时候的主要问题就是我们想要hook的类到底再哪一个ClassLoader当中。

这里拿之前写过的使用DexClassLoader来加载dex的app,作为例子来分析一下。

先安装运行一下这个app

图1
  • 这里可以看到有一个单独的线程一直在输出Sorry!

用jadx打开看一下是从哪输出的

图2
  • 反编译后可以看到代码使用DexClassLoader加载了1.dex,然后使用反射的方式找到里面的testcontent方法。然后调用了这个方法,如果返回值结果为false就会打印Sorry!
  • 对这种插件dex,再用上一章的hook onCreate函数,等其执行完之后去拿到ClassLoader的办法显然就不行了,因为这里的classLoader并不需要修正。

处理动态加载的dex中的函数

那么接下来的目标就是hook图2中的1.dex->com.kanxue.test02.TestClass->testcontent

首先还是要拿到1.dex的ClassLoader,这里用到的是DexClassLoader那我们就可以通过hook DexClassLoader的构造函数来获取我们想拿到的dex的实例,构造函数的hook方法在之前的章节中讲过

图3
  • 这里拿到了要加载的dex的路径,把dex文件拿出来看一下

  • 这里同样也可以用上一章文末讲的方法把dex中的类列表打印出来

    图4
    • 不过这个测试的时候不稳定,有时候能打印出来,有时候打印的残缺不全或者打印不出来可以多试几次
将dex文件从设备中pull出来分析一下testcontent
图5
  • 这里可以看到这个函数非常简单,只是对传进来的参数进行MD5和补全后进行对比如果不同就返回false
通过图4可以发现成功的找到了目标类,这时候就可以通过这个ClassLoader来hook目标函数

hook这个函数之后,就可以通过修改参数让其符合校验或者直接修改返回值为true都是可以达到目的的

图6
  • 这里我们就是通过直接修改返回值为true,让其打印结果变为Congratulations!

总结:这里我们成功的对插件dex中的函数进行hook,这里跟hook加壳app的区别主要在于获取ClassLoader的方式不同,hook加壳app需要在onCreate执行完毕修复ClassLoader的时候获取即可,而对这种插件dex进行hook需要先hookDexClassLoader方法,然后再根据返回值获取正确的ClassLoader

  • 标题: Hook多dex的app
  • 作者: xiaoeryu
  • 创建于 : 2023-12-25 00:33:21
  • 更新于 : 2024-02-13 17:27:17
  • 链接: https://github.com/xiaoeryu/2023/12/25/Hook多dex的app/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
此页目录
Hook多dex的app