才疏学浅,如有不对,请轻拍。
一个话题,将一个so注入到App中有几种方式?
1.Root,直接注入。
想必论坛的大部分人已经都会了,拿到了Root之后,我们可以利用ptrace直接注入。所以加固的第一点,便是反调试。
2.Root,将so作为系统so,这样任何App起来都得把so加载到app进程当中。
xposed的方式是重写孵化器,让孵化器能够加载自己的so,从而控制整个安卓。所以很多加固会去识别特征码,看是否有xposed的框架。
那么如果没有Root呢,我们如何往一个App里注入一个SO?
1.重打包
如果可以重新打包,我们可以反编译java层,在加载SO的地方,补一句加载So,把我们的SO放到App的Lib目录下。
2.我们启动App
其实关于我们启动App的方式有很多种,如果App的架构简单,我们可以反编译一部分App代码,重写java层,我们的java层去load原有App的So,在加载App的So的同时加载我们的So。
具体可以参考https://github.com/zhuowei/MCPELauncher/的做法。
如果App架构复杂,被加固了,无法重打包,无法注入,无法root,无法刷机,锁了BL,反正就这样了,我们是否还有办法注入?
自然还是可以!
关于VirtualApp要从安卓的插件化说起。
插件化,就是让App动态的加载一个磁盘的dex,这样实现热补丁技术,我们的Host进程类似于医生,长期稳定,而真正的dex则类似于病人,可以动态的修复。
其实加固的原理也类似于如此,加固的时候,我们拿到需要加固的APK将其中的dex给加密,然后替换掉入口,改为我们的壳APK入口,当壳加载了之后,我们再动态的加载原有的APK,这样静态反编译,得到的是壳Apk.
VirtualApp中我们重点关注下NativeEngine这个类,因为这个类会加载一个so,而且so会位于启动的apk当中。既然这里加载一个so,自然可以再加载几个也无所谓。
这个类加载的So做了很多事,包括hook系统的底层函数。
replaceOpenDexFileMethod(envenv->GetObjectArrayElement(javaMethods)isArtapiLevel)
其中这个函数将OPen_Dex,给Hook掉了,想做dumpDex是不是可以在这里做呢?
这个SO还做了IO重定向,因为创造了虚拟空间,所以读写需要重定向。
IOUniformer::startUniformer
这个函数中hook了一个
hook_dlopen(api_level);
这里hook了linker当中的do_dlopen函数,这是so加载的函数,加壳的SO一般在加载的时候进行部分脱壳,所以我们也可以在加载了之后加载我们的so,进行hook。
由于很多手机linker是被处理过的不见得都能找得到符号,我们也可以利用其它办法。
不过这里就已经达到了我们想要的效果,在别人的App里加载一个我们的so,在别人so加载的时候,进行hook。
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法