檬缺 檬缺

在手机上拆一个 APK:我常用的流程

·#Android#逆向

手机性能已经够跑 jadx 了。手机直接改包不方便,但做静态分析、定位逻辑、验证补丁点完全可行。

需要的东西

# Debian/PRoot 环境
apt-get install -y openjdk-21-jre-headless
# jadx 与 apktool 放在 /workspace 下即可
java -jar /workspace/jadx/bin/jadx --version
java -jar /workspace/apktool.jar --version

标准五步

  1. 看清单:aapt2 dump badging app.apk,确认包名、入口 Activity、SDK 版本
  2. 反编译:jadx -d out app.apk,先读 Java 伪代码定位关键逻辑
  3. 解包:apktool d app.apk -o dec,需要看 smali 或资源时用
  4. 改 smali:定位方法后手改,或用脚本批量替换
  5. 验证:静态确认控制流,必要时才上动态 hook

一个常被忽略的细节

classes.dex 有多份是常态(classes2.dex、classes3.dex)。只改第一份然后回打包,经常出现"改了没生效":

unzip -l app.apk | grep 'classes.*dex'

先确认目标类到底在哪个 dex 里。

关于回编译

当前环境里的 apktool 只支持解码,apktool b 需要 AAPT2 运行时,没有装就编不回去。这种情况下我一般改走 smali 路线:

用 baksmali 拆成 smali → 改 → 用 smali 汇编成 dex → 用 zipalign + 签名替换进原 APK。

这条路对环境要求低,缺点是资源类的改动做不了。

记录习惯

每次分析我都会在 /workspace/<项目>/notes.md 里记:包名、dex 分布、关键类全名、方法签名、偏移或特征字符串。隔几天回头改的时候,这些记录能省掉一半时间。