fart脱壳:mikrom编译刷机
文章最后更新时间为:2023年06月27日 21:50:35
1. 什么是fart脱壳
该段中的部分文字来源于各大佬的文章,这里为总结性质的归纳,如有错误,还请指正。
Android APP 脱壳的本质就是对内存中处于解密状态的dex的dump,要达到对apk的脱壳,最为关键的就是准确定位内存中解密后的dex文件的起始地址和大小。那么这里要达成对apk的成功脱壳,就有两个最为关键的要素:
- 内存中dex的起始地址和大小
- 脱壳时机
于是出现了很多整体dex dump的脱壳工具,比如dexhunter等,但是随着加壳技术的发展,各加固厂商又结合hook技术,通过hook dex文件中类和方法加载执行过程中的关键流程,来实现在函数执行前才进行解密操作的指令抽取的解决方案。此时,就算是对内存中的dex整体进行了dump,但是由于其方法的最为重要的函数体中的指令被加密,导致无法对相关的函数进行脱壳。于是出现了FUPK3:
- Android通用脱壳机FUPK3 https://bbs.pediy.com/thread-246117.htm
FUPK3实现并开源了Dalvik环境下的基于主动调用的脱壳技术,该脱壳工具通过欺骗壳而主动调用dex中的各个函数,完成调用流程,让壳主动解密对应method的指令区域,从而完成对指令抽取型壳的脱壳。完美实现了对抗指令抽取型壳的解决方案。
随着Android的升级,Dalvik虚拟机已经逐渐淡出了视野,当前的很多应用已经不支持安装在4.4以下系统中,这就导致fupk3也即将走向末路。寒冰大佬在fupk3的基础上,提出一种ART环境下的基于主动调用的的脱壳技术解决方案:
- FART:ART环境下基于主动调用的自动化脱壳方案 https://bbs.pediy.com/thread-252630.htm
- FART正餐前甜点:ART下几个通用简单高效的dump内存中dex方法 https://bbs.pediy.com/thread-254028.htm
- 拨云见日:安卓APP脱壳的本质以及如何快速发现ART下的脱壳点 https://bbs.pediy.com/thread-254555.htm
总的来说,FART脱壳的步骤分为三步:
1.内存中DexFile结构体完整dex的dump
2.主动调用类中的每一个方法,并实现对应CodeItem的dump
3.通过主动调用dump下来的方法的CodeItem进行dex中被抽取的方法的修复
在fart的基础上,后来又出现了Youpk:
- 又一款基于ART的主动调用的脱壳机 https://bbs.pediy.com/thread-259854.htm
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
- FartExt之优化更深主动调用的FART10 https://bbs.pediy.com/thread-268760.htm
- FartExt超进化之奇奇怪怪的新ROM工具MikRom https://bbs.pediy.com/thread-271358.htm
总的来说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. 参考链接
(参考链接已经按照发布时间排序,可顺序阅读)
- Android通用脱壳机FUPK3 https://bbs.pediy.com/thread-246117.htm
- FART:ART环境下基于主动调用的自动化脱壳方案 https://bbs.pediy.com/thread-252630.htm
- FART正餐前甜点:ART下几个通用简单高效的dump内存中dex方法 https://bbs.pediy.com/thread-254028.htm
- 拨云见日:安卓APP脱壳的本质以及如何快速发现ART下的脱壳点 https://bbs.pediy.com/thread-254555.htm
- 来自高纬的对抗:定制ART解释器脱所有一二代壳 https://mp.weixin.qq.com/s/3tjY_03aLeluwXZGgl3ftw
- Youpk: 又一款基于ART的主动调用的脱壳机 https://bbs.pediy.com/thread-259854.htm
- 将FART和Youpk结合来做一次针对函数抽取壳的全面提升 https://bbs.pediy.com/thread-260052.htm
- FartExt之优化更深主动调用的FART10 https://bbs.pediy.com/thread-268760.htm
- FartExt超进化之奇奇怪怪的新ROM工具MikRom https://bbs.pediy.com/thread-271358.htm
编译了lineageOS 17.1 dipper。运行后dump的全是bin文件没dex文件0字节
这名字起的,我还以为你是yang
大佬,求pixel3a的mikrom镜像
@root 镜像没保存了,可以自己编译下哈
我编译成功后,一直刷不进去,卡在fastboot flashall -w,我不知道是不是镜像有问题,如果可以分享的话,十分感谢!
博主你好,pixel 3a的mikrom镜像可以发我一份吗?
网盘失效了,再分享下吧,谢谢