本帖最后由 malone 于 2026-7-3 18:25 编辑
1. 什么是fart脱壳该段中的部分文字来源于各大佬的文章,这里为总结性质的归纳,如有错误,还请指正。 Android APP 脱壳的本质就是对内存中处于解密状态的dex的dump,要达到对apk的脱壳,最为关键的就是准确定位内存中解密后的dex文件的起始地址和大小。那么这里要达成对apk的成功脱壳,就有两个最为关键的要素: 于是出现了很多整体dex dump的脱壳工具,比如dexhunter等,但是随着加壳技术的发展,各加固厂商又结合hook技术,通过hook dex文件中类和方法加载执行过程中的关键流程,来实现在函数执行前才进行解密操作的指令抽取的解决方案。此时,就算是对内存中的dex整体进行了dump,但是由于其方法的最为重要的函数体中的指令被加密,导致无法对相关的函数进行脱壳。于是出现了FUPK3: FUPK3实现并开源了Dalvik环境下的基于主动调用的脱壳技术,该脱壳工具通过欺骗壳而主动调用dex中的各个函数,完成调用流程,让壳主动解密对应method的指令区域,从而完成对指令抽取型壳的脱壳。完美实现了对抗指令抽取型壳的解决方案。 随着Android的升级,Dalvik虚拟机已经逐渐淡出了视野,当前的很多应用已经不支持安装在4.4以下系统中,这就导致fupk3也即将走向末路。寒冰大佬在fupk3的基础上,提出一种ART环境下的基于主动调用的的脱壳技术解决方案: 总的来说,FART脱壳的步骤分为三步: 1.内存中DexFile结构体完整dex的dump
2.主动调用类中的每一个方法,并实现对应CodeItem的dump
3.通过主动调用dump下来的方法的CodeItem进行dex中被抽取的方法的修复 在fart的基础上,后来又出现了Youpk: Youpk是一款针对Dex整体加固+各式各样的Dex抽取的脱壳机,基本流程如下: - 从内存中dump DEX:DEX文件在art虚拟机中使用DexFile对象表示, 而ClassLinker中引用了这些对象, 因此可以采用从ClassLinker中遍历DexFile对象并dump的方式来获取。
- 构造完整调用链, 主动调用所有方法并dump CodeItem:遍历DexFile的所有ClassDef,然后主动调用Class的所有Method, 并修改ArtMethod::Invoke使其强制走switch型解释器,然后在解释器中插桩,做CodeItem的dump。
- 合并 DEX, CodeItem:将dump下来的CodeItem填充到DEX的相应位置中即可. 主要是基于google dx工具修改。
再后来出现了FartExt,作者后来写了一个和rom配套的管理app,组成MikRom 总的来说MikRom优化了以下几点: - 更深的主动调用
- 去除了一些fart的一些特征,但我估计很快MikRom就会成为特征
- 升级到了aosp10
- 自带FART函数修复
- 带一个app界面,可以方便操作需要脱壳的app和类
- 还有一些其他的功能,暂时没研究,这里就不归纳了,大家可以去看原作者的文章
于是下面打算来玩玩mikrom,但是我的pixel 3a手机暂时没有编译好的刷机包可用,于是下面尝试自己编译mikrom的aosp源码。 2. mikrom编译刷机关于aosp编译,可以参考之前写的文章:https://saucer-man.com/android/986.html,这里对于细节就不再概述,编译环境为ubuntu20虚拟机。 2.1 下载aosp源码和作者的编译版本尽可能保持一致,这里我选用了android-10.0.0_r4分支的源码
- # 下载代码
- cd ~/Desktop
- mkdir android_source
- repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-10.0.0_r4
- repo sync -j4
复制代码 2.2 修改aosp源码下载mikrom - git clone https://github.com/dqzg12300/MikRom.git
- cp -r MikRom/aosp10r2 ~/Desktop
复制代码然后修改aosp源码,这里我已经diff过了,可以直接沿用作者的源码,直接拷贝Mikrom的文件覆盖aosp源码即可,如果你使用了差别比较大的源码,最后手动diff下作者的修改,然后逐个修改文件。 - #!/usr/bin/python3
- # -*- coding: utf-8 -*-
- import os
- from shutil import copyfile
- for fpathe,dirs,fs in os.walk('/home/yanq/Desktop/aosp10r2'):
- for f in fs:
- source_file_path = os.path.join(fpathe,f)
- dest_file_path = source_file_path.replace("aosp10r2","android_source")
- copyfile(source_file_path, dest_file_path)
复制代码然后给修改的源码目录添加编译白名单
- vim build/core/tasks/check_boot_jars/package_whitelist.txt
- 在最后添加
- cn\.mik
- cn\.mik\..*
复制代码 2.3 下载驱动驱动的下载链接位于https://developers.google.cn/android/drivers ,找到QP1A.191005.007
- cd ~/Desktop
- wget https://dl.google.com/dl/android/aosp/google_devices-sargo-qp1a.191005.007-ad5eb01e.tgz
- wget https://dl.google.com/dl/android/aosp/qcom-sargo-qp1a.191005.007-6203bdff.tgz
- tar -zxvf google_devices-sargo-qp1a.191005.007-ad5eb01e.tgz
- tar -zxvf qcom-sargo-qp1a.191005.007-6203bdff.tgz
- cp extract-qcom-sargo.sh android_source/
- cp extract-google_devices-sargo.sh android_source/
- cd android_source/
- ./extract-google_devices-sargo.sh
- ./extract-qcom-sargo.sh
复制代码 2.4 编译
- cd ~/Desktop/android_source
- source build/envsetup.sh
- lunch aosp_sargo-userdebug
- make update-api -j12
- make -j8
复制代码 2.5 刷机
- # 重启到fastboot模式
- adb reboot bootloader
- # 设置系统位置
- export ANDROID_PRODUCT_OUT=/home/yanq/Desktop/android_source/out/target/product/sargo/
- # 刷入
- fastboot flashall -w
复制代码 2.6 验证
- sargo:/ $ service list | grep mikrom
- 113 mikrom: [android.app.IMikRom]
复制代码存在该service,则说明系统可用。 2.7 脱壳测试下面装入MikManager,可以在https://github.com/dqzg12300/MikManager 页面进行下载
这里使用360的免费壳作为测试,可以使用下面的过滤来查看日志。
- adb logcat | grep "mikrom"
复制代码在MikManager中勾选要脱壳的app,然后打开该app,即可进行脱壳。跑完之后会生成repair后的dex文件。
然后我们使用jadx打开:
效果还是不错的 4. 参考链接(参考链接已经按照发布时间排序,可顺序阅读)
|