fart脱壳:mikrom编译刷机

文章最后更新时间为:2023年06月27日 21:50:35

1. 什么是fart脱壳

该段中的部分文字来源于各大佬的文章,这里为总结性质的归纳,如有错误,还请指正。

Android APP 脱壳的本质就是对内存中处于解密状态的dex的dump,要达到对apk的脱壳,最为关键的就是准确定位内存中解密后的dex文件的起始地址和大小。那么这里要达成对apk的成功脱壳,就有两个最为关键的要素:

  1. 内存中dex的起始地址和大小
  2. 脱壳时机

于是出现了很多整体dex dump的脱壳工具,比如dexhunter等,但是随着加壳技术的发展,各加固厂商又结合hook技术,通过hook dex文件中类和方法加载执行过程中的关键流程,来实现在函数执行前才进行解密操作的指令抽取的解决方案。此时,就算是对内存中的dex整体进行了dump,但是由于其方法的最为重要的函数体中的指令被加密,导致无法对相关的函数进行脱壳。于是出现了FUPK3:

  1. Android通用脱壳机FUPK3 https://bbs.pediy.com/thread-246117.htm

FUPK3实现并开源了Dalvik环境下的基于主动调用的脱壳技术,该脱壳工具通过欺骗壳而主动调用dex中的各个函数,完成调用流程,让壳主动解密对应method的指令区域,从而完成对指令抽取型壳的脱壳。完美实现了对抗指令抽取型壳的解决方案。

随着Android的升级,Dalvik虚拟机已经逐渐淡出了视野,当前的很多应用已经不支持安装在4.4以下系统中,这就导致fupk3也即将走向末路。寒冰大佬在fupk3的基础上,提出一种ART环境下的基于主动调用的的脱壳技术解决方案:

  1. FART:ART环境下基于主动调用的自动化脱壳方案 https://bbs.pediy.com/thread-252630.htm
  2. FART正餐前甜点:ART下几个通用简单高效的dump内存中dex方法 https://bbs.pediy.com/thread-254028.htm
  3. 拨云见日:安卓APP脱壳的本质以及如何快速发现ART下的脱壳点 https://bbs.pediy.com/thread-254555.htm

总的来说,FART脱壳的步骤分为三步:

1.内存中DexFile结构体完整dex的dump
2.主动调用类中的每一个方法,并实现对应CodeItem的dump
3.通过主动调用dump下来的方法的CodeItem进行dex中被抽取的方法的修复

在fart的基础上,后来又出现了Youpk:

  1. 又一款基于ART的主动调用的脱壳机 https://bbs.pediy.com/thread-259854.htm

Youpk是一款针对Dex整体加固+各式各样的Dex抽取的脱壳机,基本流程如下:

  1. 从内存中dump DEX:DEX文件在art虚拟机中使用DexFile对象表示, 而ClassLinker中引用了这些对象, 因此可以采用从ClassLinker中遍历DexFile对象并dump的方式来获取。
  2. 构造完整调用链, 主动调用所有方法并dump CodeItem:遍历DexFile的所有ClassDef,然后主动调用Class的所有Method, 并修改ArtMethod::Invoke使其强制走switch型解释器,然后在解释器中插桩,做CodeItem的dump。
  3. 合并 DEX, CodeItem:将dump下来的CodeItem填充到DEX的相应位置中即可. 主要是基于google dx工具修改。

再后来出现了FartExt,作者后来写了一个和rom配套的管理app,组成MikRom

  1. FartExt之优化更深主动调用的FART10 https://bbs.pediy.com/thread-268760.htm
  2. FartExt超进化之奇奇怪怪的新ROM工具MikRom https://bbs.pediy.com/thread-271358.htm

总的来说MikRom优化了以下几点:

  1. 更深的主动调用
  2. 去除了一些fart的一些特征,但我估计很快MikRom就会成为特征
  3. 升级到了aosp10
  4. 自带FART函数修复
  5. 带一个app界面,可以方便操作需要脱壳的app和类
  6. 还有一些其他的功能,暂时没研究,这里就不归纳了,大家可以去看原作者的文章

于是下面打算来玩玩mikrom,但是我的pixel 3a手机暂时没有编译好的刷机包可用,于是下面尝试自己编译mikrom的aosp源码。

2. mikrom编译刷机

关于aosp编译,可以参考之前写的文章:https://saucer-man.com/android/986.html,这里对于细节就不再概述,编译环境为ubuntu20虚拟机。

2.1 下载aosp源码

和作者的编译版本尽可能保持一致,这里我选用了android-10.0.0_r4分支的源码
2022-11-28T11:47:57.png

# 下载代码
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

2022-11-28T11:56:10.png

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 页面进行下载

2022-11-28T12:07:10.png

这里使用360的免费壳作为测试,可以使用下面的过滤来查看日志。

adb logcat | grep "mikrom"

在MikManager中勾选要脱壳的app,然后打开该app,即可进行脱壳。跑完之后会生成repair后的dex文件。

2022-11-28T12:11:38.png

2022-11-28T12:12:03.png

然后我们使用jadx打开:

2022-11-28T12:14:38.png

效果还是不错的

4. 参考链接

(参考链接已经按照发布时间排序,可顺序阅读)

  1. Android通用脱壳机FUPK3 https://bbs.pediy.com/thread-246117.htm
  2. FART:ART环境下基于主动调用的自动化脱壳方案 https://bbs.pediy.com/thread-252630.htm
  3. FART正餐前甜点:ART下几个通用简单高效的dump内存中dex方法 https://bbs.pediy.com/thread-254028.htm
  4. 拨云见日:安卓APP脱壳的本质以及如何快速发现ART下的脱壳点 https://bbs.pediy.com/thread-254555.htm
  5. 来自高纬的对抗:定制ART解释器脱所有一二代壳 https://mp.weixin.qq.com/s/3tjY_03aLeluwXZGgl3ftw
  6. Youpk: 又一款基于ART的主动调用的脱壳机 https://bbs.pediy.com/thread-259854.htm
  7. 将FART和Youpk结合来做一次针对函数抽取壳的全面提升 https://bbs.pediy.com/thread-260052.htm
  8. FartExt之优化更深主动调用的FART10 https://bbs.pediy.com/thread-268760.htm
  9. FartExt超进化之奇奇怪怪的新ROM工具MikRom https://bbs.pediy.com/thread-271358.htm
1 + 7 =
7 评论
    pff Chrome 128 OSX
    9月20日 回复

    编译了lineageOS 17.1 dipper。运行后dump的全是bin文件没dex文件0字节

    666 Chrome 127 OSX
    8月19日 回复

    这名字起的,我还以为你是yang

    root Chrome 119 OSX
    2023年11月19日 回复

    大佬,求pixel3a的mikrom镜像

      yanq Chrome 118 OSX
      2023年11月23日 回复

      @root 镜像没保存了,可以自己编译下哈

    admin Chrome 116 Windows 10
    2023年08月17日 回复

    我编译成功后,一直刷不进去,卡在fastboot flashall -w,我不知道是不是镜像有问题,如果可以分享的话,十分感谢!

    admin Chrome 116 Windows 10
    2023年08月17日 回复

    博主你好,pixel 3a的mikrom镜像可以发我一份吗?

    有点无聊 Yandex Browser Linux
    2023年06月26日 回复

    网盘失效了,再分享下吧,谢谢