安卓脱壳速成
文章目录
编译脱壳机
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 上的差异,应该再次init
并sync
编译时:
- Arch Linux 下编译可参考:https://blog.firerain.me/article/13,可能要装
ncurses5-compat-libs
- 尽量不要用
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 这个类里,额外添加 cJSON
和 unpacker
的 .h
和 .cc
共四个文件,可读性好,可惜基于 android-7.1.2_r33
,会有一些大区别
Art 部分改动的文件:
dex2oat.cc
- 添加
shouldUnpack()
- 在
FINAL::ParseArgs()
中检查shouldUnpack()
并SetCompilerFilter
- Android 9 的
CompilerFilter
中不再有kVerifyAtRuntime
- Android 9 的
- 添加
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
kInterpreterImplKind
从kMterpImplKind
改为kSwitchImplKind
从 Android 7 到 Android 9 导致 unpacker.cc 的改动
- 字段名与命名空间
StringPrintf
在android::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()
技术进展
https://www.huruwo.top/fart脱壳机的使用与进阶2_fart使用相关原理和知识点/
https://sentrylab.cn/blog/2022/安卓逆向-脱壳学习记录/
问题复盘
- 闪退
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
- 进程被杀
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 。