安卓脱壳速成

文章目录

编译脱壳机

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

编译时:

刷入时:

  • 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

Dex起步探索

FART 与 Youpk 结合

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

https://www.huruwo.top/fart脱壳机的使用与进阶2_fart使用相关原理和知识点/

https://sentrylab.cn/blog/2022/安卓逆向-脱壳学习记录/

问题复盘

  1. 闪退
E .bj.xhhosp.hsy: fartext ArtMethod::dumpArtMethod enter void com.XXX.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.XXX.ui.edittext.CustomEditText, android.widget.TextView, android.widget.TextView, com.XXX.ui.edittext.CustomEditText, android.widget.TextView, com.XXX.ui.edittext.CustomEditText, android.widget.TextView, com.XXX.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
  1. 进程被杀
03-10 21:37:40.391  1382  1419 I ActivityManager: Start proc 26247:com.founder.XXX/u0a105 for activity com.founder.XXX/.welcome.ui.SplashActivity
03-10 21:37:40.497 26247 26247 I ounder.shaoyan: The ClassLoaderContext is a special shared library.
03-10 21:37:40.557  1382 18390 I ActivityManager: Process com.founder.XXX (pid 26247) has died: fore TOP
03-10 21:37:40.557  1382  1420 W libprocessgroup: kill(-26247, 9) failed: No such process
03-10 21:37:40.558  1382  1420 I libprocessgroup: Successfully killed process cgroup uid 10105 pid 26247 in 0ms
03-10 21:37:40.558   772   772 I Zygote  : Process 26247 exited due to signal (9)
03-10 21:37:40.564   772   772 W gdbus   : type=1400 audit(0.0:1347): avc: denied { sys_nice } for capability=23 scontext=u:r:zygote:s0 tcontext=u:r:zygote:s0 tclass=capability permissive=0

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