第二节_如何反编译_APK

第二节 如何反编译 APK

(第2章 安卓逆向基础)

学习目标

学完本节,希望你能够:

  1. 说出 APK 反编译在干啥:把编译后的 APK 还原成可读代码(Java 或 Smali)和资源,便于分析逻辑。
  2. 区分三种常见做法:Java 反编译 (看逻辑)、Smali 反编译 (改字节码后重打包)、Native 逆向(分析 so)。
  3. 会用 jadxapktool (含 baksmali)、dex2jar 等提取 DEX、反编译 Java/Smali;会用 IDA ProGhidra 打开 so 做初步分析。
  4. 动手:反编译一个 APK,找到关键类和方法,并在授权环境下尝试改 Smali 或 Hook so。

阅读提示:工具安装与详细用法在后续章节会细讲;本节以「在干啥、一般怎么干、用啥工具」为主。

常见疑问:反编译出来的代码和源码一样吗?不一样,变量名、注释可能丢失,但逻辑可读;复杂混淆会难读,后面有专门节讲。


一、APK 反编译在干啥?

说白了,就是把已经编译好的 APK 再变回可读的代码和资源,从而:

  • classes.dex 转成 JavaSmali,看业务逻辑、找登录/VIP/加密;
  • AndroidManifest.xmlres/ 等资源和配置;
  • lib/*.so 用反汇编/反编译工具打开,分析 Native 逻辑。

注意:仅限授权环境与学习、安全研究,不要对他人应用做未授权逆向或传播。


二、三种反编译方式怎么选?

方式 在干啥 适用场景 常用工具
Java 反编译 把 DEX 转成 Java 代码 快速读逻辑、搜关键字 jadxdex2jar + JD-GUI
Smali 反编译 把 DEX 转成 Smali(可改可重打包) 改逻辑、绕过校验、去广告 apktoolbaksmali
Native 逆向 分析 .so(ELF) 看 C/C++ 逻辑、算法、校验 IDA ProGhidra

记一句:想读用 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 后,用 readelfnm 看结构,用 IDA ProGhidra 反汇编/反编译。

一般怎么干:看结构 + 用 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)→ 搜字符串(如 SecretKeystrcmp)→ 看校验逻辑。思路可以是:找到比较函数,改二进制或运行时用 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");
        }
    });
});

注意:仅限授权环境;不要对他人软件做未授权篡改或传播。


本节小结

你只要记住这几条就行:

  1. APK 反编译 = 把 APK 还原成可读代码和资源;分 Java 反编译Smali 反编译Native 逆向 三种。
  2. 读逻辑用 jadx (或 dex2jar);改逻辑并重打包用 apktool ;分析 so 用 IDA/Ghidra ,配合 Frida Hook。
  3. 提取 APK 用 adb pull,提取 DEX 用 unzip;so 从 APK 的 lib/ 或设备 data 里拿。
  4. 所有操作仅在授权、合规前提下进行。

本节术语速查

术语 一句话解释
反编译 把编译后的 DEX/so 还原成可读的 Java/Smali/C 等。
Smali DEX 对应的「汇编」级语法,可编辑后重打包。
Native 指 C/C++ 编译的 so,与 Java 层相对。
IDA Pro / Ghidra 二进制反汇编/反编译工具,用于分析 so。

本节思考与练习

  1. 概念:Java 反编译和 Smali 反编译有啥区别?分别适合干啥?
  2. 应用:若你要「改一个方法的返回值再安装」,该用哪种方式?步骤大概是啥?
  3. 动手 :用 jadx 反编译一个 APK,搜索 logincheckvip,打开一个相关类看几行。
  4. 动手:用 apktool 反编译同一 APK,找到对应类的 .smali 文件,改一个方法的 Smali(如 isVIP 恒返回 true),再打包、签名、安装验证。

下一节预告 :下一节讲 DEX 文件结构解析,你会搞清楚 DEX 头、字符串表、类/方法表在文件里怎么排布,以及怎么用 dexdump、baksmali 等工具解析。

相关推荐
长沙火山3 小时前
第七节_动态调试入门
逆向·安卓逆向
长沙火山5 小时前
第十九节_Android_APP_安全机制
逆向·安卓逆向
长沙火山1 天前
第十七节_ELF_文件解析
逆向·安卓逆向
长沙火山1 天前
第十三节_Android_APP_目录结构
逆向·安卓逆向
长沙火山1 天前
第十二节_Android_权限机制
逆向·安卓逆向
长沙火山1 天前
第十六节_反汇编工具介绍
逆向·安卓逆向
长沙火山1 天前
第十一节_Android_进程管理
逆向·安卓逆向
长沙火山1 天前
第九节_Android_CPU_架构解析
逆向·安卓逆向
长沙火山2 天前
第六节_x86_vs_ARM_汇编
逆向·安卓逆向