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
  • 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版本

  • 过root
    • 关闭selinux、adbd不降权、ptrace、以及其它常见特征

    • 与user版本不同的地方
      • 设置ro.debuggable=0
        • 修改以下两个文件
          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

     

posted @ 2024-04-05 23:24  eliwang  阅读(12)  评论(0编辑  收藏  举报