第二节 如何反编译 APK
(第2章 安卓逆向基础)
学习目标
学完本节,希望你能够:
- 说出 APK 反编译在干啥:把编译后的 APK 还原成可读代码(Java 或 Smali)和资源,便于分析逻辑。
- 区分三种常见做法:Java 反编译 (看逻辑)、Smali 反编译 (改字节码后重打包)、Native 逆向(分析 so)。
- 会用 jadx 、apktool (含 baksmali)、dex2jar 等提取 DEX、反编译 Java/Smali;会用 IDA Pro 、Ghidra 打开 so 做初步分析。
- 动手:反编译一个 APK,找到关键类和方法,并在授权环境下尝试改 Smali 或 Hook so。
阅读提示:工具安装与详细用法在后续章节会细讲;本节以「在干啥、一般怎么干、用啥工具」为主。
常见疑问:反编译出来的代码和源码一样吗?不一样,变量名、注释可能丢失,但逻辑可读;复杂混淆会难读,后面有专门节讲。
一、APK 反编译在干啥?
说白了,就是把已经编译好的 APK 再变回可读的代码和资源,从而:
- 把 classes.dex 转成 Java 或 Smali,看业务逻辑、找登录/VIP/加密;
- 看 AndroidManifest.xml 、res/ 等资源和配置;
- 把 lib/*.so 用反汇编/反编译工具打开,分析 Native 逻辑。
注意:仅限授权环境与学习、安全研究,不要对他人应用做未授权逆向或传播。
二、三种反编译方式怎么选?
| 方式 | 在干啥 | 适用场景 | 常用工具 |
|---|---|---|---|
| Java 反编译 | 把 DEX 转成 Java 代码 | 快速读逻辑、搜关键字 | jadx 、dex2jar + JD-GUI |
| Smali 反编译 | 把 DEX 转成 Smali(可改可重打包) | 改逻辑、绕过校验、去广告 | apktool 、baksmali |
| Native 逆向 | 分析 .so(ELF) | 看 C/C++ 逻辑、算法、校验 | IDA Pro 、Ghidra |
记一句:想读用 jadx,想改字节码用 apktool,想逆 so 用 IDA/Ghidra。
三、提取 APK 和 DEX 一般怎么干?
从设备拿已安装的 APK
bash
adb shell pm list packages | grep example
adb shell pm path com.example.app
adb pull /data/app/com.example.app-1/base.apk .
从 APK 里单独拿 DEX
bash
unzip base.apk classes.dex
四、Java 代码反编译:用 jadx 或 dex2jar
在干啥:把 DEX 还原成 Java,方便读
jadx 一步到位:APK 或 DEX 拖进去,直接出 Java 工程。
一般怎么干:jadx
bash
jadx -d output/ base.apk
cat output/com/example/MainActivity.java
若只有 dex2jar ,可先转成 JAR,再用 JD-GUI 打开:
bash
./d2j-dex2jar.sh classes.dex
jd-gui classes-dex2jar.jar
五、Smali 反编译:用 apktool
在干啥:出 Smali 和资源,便于改逻辑后重打包
apktool 会解出 smali/ 、res/ 、AndroidManifest.xml 等,改完再用 apktool 打包成 APK。
一般怎么干
bash
apktool d base.apk -o output/
cat output/smali/com/example/MainActivity.smali
改完 Smali 后:
bash
apktool b output -o modded.apk
jarsigner -verbose -keystore my.keystore modded.apk alias_name
adb install modded.apk
六、Native 层(so)怎么分析?
在干啥:so 是 C/C++ 编译的,要单独用二进制逆向工具
从设备或 APK 里拿到 so 后,用 readelf 、nm 看结构,用 IDA Pro 或 Ghidra 反汇编/反编译。
一般怎么干:看结构 + 用 IDA/Ghidra
bash
adb pull /data/data/com.example.app/lib/arm64/libnative.so .
readelf -h libnative.so
nm -D libnative.so
IDA/Ghidra 里:加载 so → 选对架构(ARM/ARM64)→ 搜字符串(如 SecretKey、strcmp)→ 看校验逻辑。思路可以是:找到比较函数,改二进制或运行时用 Frida Hook 返回值。
Hook so 示例(Frida)
js
Java.perform(function() {
var nativeFunc = Module.findExportByName("libnative.so", "check_password");
Interceptor.attach(nativeFunc, {
onEnter: function(args) {
console.log("check_password called!");
args[0] = ptr("HackedPassword");
}
});
});
注意:仅限授权环境;不要对他人软件做未授权篡改或传播。
本节小结
你只要记住这几条就行:
- APK 反编译 = 把 APK 还原成可读代码和资源;分 Java 反编译 、Smali 反编译 、Native 逆向 三种。
- 读逻辑用 jadx (或 dex2jar);改逻辑并重打包用 apktool ;分析 so 用 IDA/Ghidra ,配合 Frida Hook。
- 提取 APK 用
adb pull,提取 DEX 用unzip;so 从 APK 的 lib/ 或设备 data 里拿。 - 所有操作仅在授权、合规前提下进行。
本节术语速查
| 术语 | 一句话解释 |
|---|---|
| 反编译 | 把编译后的 DEX/so 还原成可读的 Java/Smali/C 等。 |
| Smali | DEX 对应的「汇编」级语法,可编辑后重打包。 |
| Native | 指 C/C++ 编译的 so,与 Java 层相对。 |
| IDA Pro / Ghidra | 二进制反汇编/反编译工具,用于分析 so。 |
本节思考与练习
- 概念:Java 反编译和 Smali 反编译有啥区别?分别适合干啥?
- 应用:若你要「改一个方法的返回值再安装」,该用哪种方式?步骤大概是啥?
- 动手 :用 jadx 反编译一个 APK,搜索
login、check、vip,打开一个相关类看几行。 - 动手:用 apktool 反编译同一 APK,找到对应类的 .smali 文件,改一个方法的 Smali(如 isVIP 恒返回 true),再打包、签名、安装验证。
下一节预告 :下一节讲 DEX 文件结构解析,你会搞清楚 DEX 头、字符串表、类/方法表在文件里怎么排布,以及怎么用 dexdump、baksmali 等工具解析。