Hook多dex的app
本章内容为多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
- 这里可以看到有一个单独的线程一直在输出Sorry!
用jadx打开看一下是从哪输出的
- 反编译后可以看到代码使用
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方法在之前的章节中讲过
这里拿到了要加载的dex的路径,把dex文件拿出来看一下
这里同样也可以用上一章文末讲的方法把dex中的类列表打印出来
图4 - 不过这个测试的时候不稳定,有时候能打印出来,有时候打印的残缺不全或者打印不出来可以多试几次
将dex文件从设备中pull出来分析一下testcontent
- 这里可以看到这个函数非常简单,只是对传进来的参数进行MD5和补全后进行对比如果不同就返回false
通过图4可以发现成功的找到了目标类,这时候就可以通过这个ClassLoader来hook目标函数
hook这个函数之后,就可以通过修改参数让其符合校验或者直接修改返回值为true都是可以达到目的的
- 这里我们就是通过直接修改返回值为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 进行许可。