该段中的部分文字来源于各大佬的文章,这里为总结性质的归纳,如有错误,还请指正。
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抽取的脱壳机,基本流程如下:
再后来出现了FartExt,作者后来写了一个和rom配套的管理app,组成MikRom
总的来说MikRom优化了以下几点:
于是下面打算来玩玩mikrom,但是我的pixel 3a手机暂时没有编译好的刷机包可用,于是下面尝试自己编译mikrom的aosp源码。
关于aosp编译,可以参考之前写的文章:https://saucer-man.com/android/986.html,这里对于细节就不再概述,编译环境为ubuntu20虚拟机。
和作者的编译版本尽可能保持一致,这里我选用了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
下载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\..*
驱动的下载链接位于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
cd ~/Desktop/android_source
source build/envsetup.sh
lunch aosp_sargo-userdebug
make update-api -j12
make -j8
# 重启到fastboot模式
adb reboot bootloader
# 设置系统位置
export ANDROID_PRODUCT_OUT=/home/yanq/Desktop/android_source/out/target/product/sargo/
# 刷入
fastboot flashall -w
sargo:/ $ service list | grep mikrom
113 mikrom: [android.app.IMikRom]
存在该service,则说明系统可用。
下面装入MikManager,可以在https://github.com/dqzg12300/MikManager 页面进行下载
这里使用360的免费壳作为测试,可以使用下面的过滤来查看日志。
adb logcat | grep "mikrom"
在MikManager中勾选要脱壳的app,然后打开该app,即可进行脱壳。跑完之后会生成repair后的dex文件。
然后我们使用jadx打开:
效果还是不错的
(参考链接已经按照发布时间排序,可顺序阅读)