欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]利用VirtualApp实现免Root注入Hook(一)

[原创]利用VirtualApp实现免Root注入Hook(一)

才疏学浅,如有不对,请轻拍。


一个话题,将一个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。



注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功