Android Art虚拟机下的主动调用脱壳方案。
该版本在android 7.1.1_r1
上进行实现,并为Nexuse 5X做了适配(驱动代号NMF26F)。
若需要适配其他版本,请自行移植。
关于AOSP编译,可以参考我的笔记aosp build.md
;
关于AUPK的原理和流程,请移步看雪:
百度网盘
链接:https://pan.baidu.com/s/1Rj2Un2ox9u08K4p1rPx0Kw 提取码:aupk
or
realeases:https://github.com/FeJQ/AUPK/releases
-
下载镜像,并运行flash.bat刷机
-
安装,并运行待脱壳的app
-
获取app的包名,并写入配置文件:
$ echo "your.app.package">data/local/tmp/aupk.config"
-
等待脱壳结束,直到logcat 打印出
Aupk run over
。 -
使用DexPatcher对Dex文件进行修复
首先安装目标app
$ adb install your_app
运行app,可在logcat看到如下信息:
此时data/data/your_app/aupk
下多出许多文件
$ cd data/data/your_app/aupk
$ ls -l
其中,.dex
为整体dump下来的Dex文件,class.json
记录了Dex文件里所有的类名,前缀数字代表Dex文件的大小。
可以用findstr
命令来查找某一个类的类名在哪个文件中,如:
$ findstr /m "SplashActivity" *class.json
可以看到,"SplashActivity"类在8273364大小的Dex文件中,那么,我们可以通过以下命令,来写入配置文件
以开始对8273364_ExecuteSwitchImpl_class.json
里所有的类的所有方法进行主动调用
$ echo "com.klcxkj.zqxy 8273364_ExecuteSwitchImpl_class.json">data/local/tmp/aupk.config
或者对所有的Dex里的类的所有方法进行主动调用:
$ echo "com.klcxkj.zqxy">data/local/tmp/aupk.config
主动调用过程中打印的log:
有的壳hook了Log函数,导致Log.i()打印不出来消息,但jni层的LOG和Log.e()依然有效,当打印出Aupk run over
时,代表整个主动调用过程结束,可以在data/data/you_app/aupk
下看到一些以method.json
结尾的文件,这些文件包含了Dex文件的函数CodeItem信息,用于后面对Dex文件的修复。
并非等整个主动调用过程结束才会生成method.json
文件,而是每完成对一个class.json
文件的解析和调用,就会立即生成对应的method.json
,所以,利用主动调用的这段时间,你可以先修复已经完成了主动调用的Dex文件,或者去泡杯咖啡。
将脱下来的文件拷贝到电脑:
$ adb pull data/data/your_app/aupk
开始修复Dex,回填CodeItem:
$ dp fix -d 8273364_ExecuteSwitchImpl.dex -j 8273364_ExecuteSwitchImpl_method.json --nolog
等待片刻,即可完成修复:
带patched后缀的就是修复后的Dex文件
反编译看看效果: