AOSP+Fart脱壳相关
前置条件
- 首先修改AOSP相关源码,去AOSP系统特征,去fart特征
一、User版(抽取型示例)
- 安装App,并赋予存储权限
- 指定需要进行抽取脱壳的包名
echo com.youxiang.soyoungapp > /data/local/tmp/luffy.txt
- 创建exclude_class.txt和exclude_method.txt
touch /data/local/tmp/exclude_class.txt touch /data/local/tmp/exclude_method.txt
对于某些app会故意定义一些方法,让你执行时闪退,所以需要根据日志信息,将闪退时的类或者方法名记录下来,不去执行
- 查看日志信息
adb logcat -s ActivityThread
- 动态加载dex处理
- 如果导出的dex不全,可以考虑是否存在动态加载dex问题
- 解决方案
- 基于Frida的Hook脚本去获取到相应的自定义ClassLoader
Java.perform(function () { // 大多数会继承于DexClassLoader,也有的会继承于BaseDexClassLoader或者PathClassLoader【DexClassLoader继承于BaseDexClassLoader】 var dexclassLoader = Java.use("dalvik.system.DexClassLoader"); // var baseDexclassLoader = Java.use("dalvik.system.BaseDexClassLoader"); dexclassLoader.$init.implementation = function (dexPath, optimizedDirectory, librarySearchPath, parent) { this.$init(dexPath, optimizedDirectory, librarySearchPath, parent); console.log('DexClassLoader构造方法执行。。。') console.log("dexpath =>",dexPath) console.log(JSON.stringify(this)); // console.log(this.getParent()); //主动执行 android.app.ActivityThread.fartwithClassloader var ActivityThread = Java.use("android.app.ActivityThread"); ActivityThread.doLuffywithClassloader(this); }; }); //frida -U -f com.nb.loaderdemo2 -l 14-fart_加载自定义ClassLoader.js
- 基于Frida的Hook脚本去获取到相应的自定义ClassLoader
- dex修复
- 对于某些壳,dumpArtMethod的上半部分已经能对dex进行整体dump,但是对于部分抽取壳,dex即使被dump下来,函数体还是以nop填充,即空函数体,FART还把函数的CodeItem给dump下来是让用户手动来修复这些dump下来的空函数。
- 工具github地址:https://github.com/dqzg12300/dexfixer
- 使用:
java -jar dexfixer.jar dexpath binpath outpath
- 示例
java -jar dexfixer.jar 7693460_dexfile.dex 7693460_ins_5125.bin demo.dex
demo.dex即修复后的dex文件
- 使用:
二、userdebug版本
-
adbd不降权、ptrace、以及其它
asop/build/core/main.mk aosp/system/core/adb/daemon/set_verity_enable_state_service.cpp
main.mk中需要强制ro.debuggable=0
当ro.debuggable=0时,会影响adb disable-verity的执行会受影响,因此需要注释掉/* if(!_android_log_is_debuggable){...return;} */
- 删除文件:/system/xbin/su
- 对于系统文件操作,需要利用挂载
- 解决方案
- 设置/system可写
- 删除/system/xbin/su
- 设置/system可读
- 具体指令
>>>adb disable-verity >>>adb reboot 重启使上述命令生效 当mount命令提示'system' not in /proc/mounts时需要执行上述两行命令 >>>adb shell >>>mount -o rw,remount /system >>>rm /system/xbin/su >>>mount -o ro,remount /system
-
- 集成证书
- 导出charles证书,比如证书名charles-ssl-proxying-certificate.pem
- 处理证书
openssl x509 -subject_hash_old -in charles-ssl-proxying-certificate.pem
得到字符串,比如29348ce7
- 修改证书名
- 将【charles-ssl-proxying-certificate.pem】修改为【29348ce7.0】
- 注意修改后的证书名和上述得到的字符串有关
- 植入手机
- 将证书文件放入目录【/system/etc/security/cacerts/】
- 参照上述挂载命令,在将/system挂载的情况下,执行
>>>adb push 29348ce7.0 /data/local/tmp/29348ce7.0 >>>mv /data/local/tmp/df697b32.0 /system/etc/security/cacerts/ >>>mount -o ro,remount /system
三、编译、刷系统
- 编译
>>>cd ~/bin/aosp
>>>source build/envsetup.sh >>>make clobber # 重新编译生效(仅在切换编译版本时需要) >>>lunch >>>选择序号 >>>make -j4 【数字越大,占内存越大,编译越快】 - 刷系统
sudo adb devices sudo adb reboot bootloader source ~/bin/aosp/build/envsetup.sh sudo ANDROID_PRODUCT_OUT=~/bin/aosp/out/target/product/flame fastboot flashall -w