FART

文章目录

安卓脱壳 FART 速成

环境准备

Pixel 3a XL 一台,代号 bonito,先恢复出厂系统 ,再准备相应源码, android-9.0.0_r47 对应 版本号 PQ3B.190801.002 对应,android-10.0.0_r2 对应 版本号 QP1A.190711.020

首先上手编译安卓源码,从中科大源拉取 AOSP

repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-10.0.0_r2
repo sync
source build/envsetup.sh
lunch  # 选择 bonito-userdebug
m
# 注意装齐依赖,老版本需要 py2

拉取时:

  • 为刷入真机,开始编译前必须下载并解压对应机型版本的驱动!!

  • 关于 repo 工具的分析,总之要区分 Repo 自身, manifest, project 三种不同层次的 repository

  • 切换不同版本时 repo forall git checkout 会带来不同 project 在 branch 上的差异,应该再次 initsync

编译时:

  • Arch Linux 下编译可参考:https://blog.firerain.me/article/13
  • 尽量不要用 root 用户编译,可能会有报错
  • flex locale 报错,改 LC_ALL=C 亦无效,进 prebuilts/misc 手动编译 flex
  • apache-xml 报错,手动编译该部分 make clean-apache-xml make apache-xml
  • 新增文件时,需将包名加至白名单 build/make/core/tasks/check_boot_jars/package_whitelist.txt

刷入时:

  • Win 下 fastboot not detect device,安装 Google USB Driver 即可
  • Win 下 fastboot freeze/hang when flashing,尝试其他命令如 getvar all
  • 远程 build 也可在本地 flash,拷贝输出目录下的*.img 至本地,ANDROID_PRODUCT_OUT="./" fastboot flashall 即可
  • 如果编译成功但刷入后发现无法开机,日志中有报错如

编译指南

若有其他报错且全网难搜,先仔细看报错信息,定位相关代码是否位置与原版有出入,或是否可修改。

只修改几处,也可能编译近几千个文件,花费数十分钟,务要小心谨慎。

如何对 repo 进行版本管理:在对应 project 下仅添加改动的文件至暂存区,不新增 commit,也不使用 repo start 创建全局新分支,只用 repo diff 手动管理版本

原理浅析

App 加固

应用启动会从 ActivityThread 进入,在方法 performLaunchActivity 的最后执行 fartthread()

Youpk 源码解读

自定义的代码几乎都封装在了 Unpacker 这个类里,额外添加 cJSONunpacker.h.cc 共四个文件,可读性好,可惜基于 android-7.1.2_r33,会有一些大区别

Art 部分改动的文件:

  • dex2oat.cc
    • 添加 shouldUnpack()
    • FINAL::ParseArgs() 中检查 shouldUnpack()SetCompilerFilter
      • Android 9 的 CompilerFilter 中不再有 kVerifyAtRuntime
  • Android.mk(Nougat) -> Android.bp(Pie)
    • 添加新文件至列表
  • artmethod.cc
    • Invoke() 中检查 Unpacker::isFakeInvoke()
    • 如果是主动调用 FakeInvoke 并且是 native 方法则不执行
  • class_linker.h
    • Unpacker 成为 ClassLinker 的友元
  • runtime.cc
    • Runtime::RegisterRuntimeNativeMethods()
  • interpreter_switch_impl.cc
    • PREAMBLE_SAVE 中执行 beforeInstructionExecute
    • ExecuteSwitchImplCpp 中执行 afterInstructionExecute
  • interpreter.cc
    • kInterpreterImplKindkMterpImplKind 改为 kSwitchImplKind

从 Android 7 到 Android 9 导致 unpacker.cc 的改动

  • 字段名与命名空间
    • StringPrintfandroid::base::
    • art:🪞:Class 下的 Status 被移到 art::ClassStatus
    • enum class PointerSize 代替 size_t,区分 32/64 位
  • DexFile 大变
    • 文件移至新目录 art/libdexfile
    • DexFile 派生成 standard 和 compact
    • CodeItem 原本 public 属性变 private,无法 offset
    • 安卓 9 提供了 DexFile::GetCodeItemSize
  • ObjPtr
    • ClassLinker 类许多方法均返回了 ObjPtr,需调整
    • soa.Decode() 返回 ObjPtr,需 .Ptr()

技术进展

修改安卓源码:Art 模式下的通用脱壳方法

脱壳原理及如何实现脱壳机

FART 脱壳流程分析

dex修复

源码解析及编译支持 Pixel2

FART相关原理及知识点

Dex起步探索

FART 与 Youpk 结合

FartExt之优化更深主动调用的FART10

问题复盘

  1. 脱壳闪退

    E .bj.xhhosp.hsy: fartext ArtMethod::dumpArtMethod enter void com.hundsun.healthrecord.databinding.HsIncludeMedicalRecordEditBinding.<init>(android.widget.LinearLayout, android.widget.TextView, android.widget.TextView, android.widget.LinearLayout, android.widget.TextView, android.widget.TextView, android.widget.LinearLayout, android.widget.TextView, android.widget.TextView, android.widget.LinearLayout, android.widget.TextView, android.widget.TextView, android.widget.LinearLayout, com.hundsun.ui.edittext.CustomEditText, android.widget.TextView, android.widget.TextView, com.hundsun.ui.edittext.CustomEditText, android.widget.TextView, com.hundsun.ui.edittext.CustomEditText, android.widget.TextView, com.hundsun.ui.edittext.CustomEditText, android.widget.TextView, android.widget.TextView, android.widget.TextView, android.widget.LinearLayout, android.widget.TextView, android.widget.TextView, android.widget.LinearLayout, android.widget.TextView, android.widget.TextView, android.widget.LinearLayout, android.widget.TextView, android.w
    
    ❯ grep "databinding.HsIncludeMedicalRecordEditBinding" -Rl .
    ./43897952_dexfile_execute.dex
    ./2836792_dexfile_execute.dex
    ./2836792_classlist_execute.txt
    ./43897952_dexfile.dex
    ./2836792_dexfile.dex
    ./2836792_classlist.txt
    ./2836792_ins_4044.bin
    

评论正在加载中...如果评论较长时间无法加载,你可以 搜索对应的 issue 或者 新建一个 issue