目录
  1. 1. 概述
  2. 2. 一、APK 拆解与重打包
    1. 2.1. 1.1 apktool
    2. 2.2. 1.2 jarsigner / apksigner
  3. 3. 二、DEX / 字节码分析
    1. 3.1. 2.1 d8 / dx(DEX 编译器)
    2. 3.2. 2.2 dexdump
    3. 3.3. 2.3 baksmali / smali
  4. 4. 三、SO / Native 层分析
    1. 4.1. 3.1 objdump(binutils)
    2. 4.2. 3.2 readelf
    3. 4.3. 3.3 nm
  5. 5. 四、动态调试工具
    1. 5.1. 4.1 adb 逆向专用命令
    2. 5.2. 4.2 strace
    3. 5.3. 4.3 frida(动态插桩)
  6. 6. 五、网络抓包
    1. 6.1. 5.1 tcpdump
    2. 6.2. 5.2 Charles / mitmproxy
  7. 7. 六、命令速查表
  8. 8. 面试常考问题
【逆向安全技术-基础篇】逆向开发常用命令

概述

Android 逆向工程的第一步是熟悉工具链。本文梳理逆向开发中最常用的命令行工具及其使用场景,覆盖 APK 拆解、DEX 分析、SO 调试、网络抓包等核心环节。


一、APK 拆解与重打包

1.1 apktool

apktool 是 Android 逆向的瑞士军刀,用于反编译 APK 中的资源文件和 smali 代码。

# 反编译 APK
apktool d target.apk -o output_dir

# 重新打包
apktool b output_dir -o repacked.apk

# 仅解码资源,不解码 dex(-s 跳过 smali)
apktool d -s target.apk -o output_dir

# 强制解码(跳过资源 ID 冲突检测)
apktool d -f target.apk -o output_dir
参数 含义
d / decode 解码/反编译
b / build 重新打包
-s 跳过 dex 解码(保留 classes.dex 原始状态)
-r 跳过资源解码
-f 强制删除目标目录覆盖

面试要点:apktool 反编译后生成的是 smali 代码而非 Java 源码,smali 是 Dalvik/ART 虚拟机的汇编语言,每一个寄存器操作都清晰可见。

1.2 jarsigner / apksigner

# V1 签名(jarsigner,逐步淘汰)
jarsigner -verbose -keystore debug.keystore -storepass android app.apk androiddebugkey

# V2/V3 签名(apksigner,现代应用推荐)
apksigner sign --ks debug.keystore --ks-pass pass:android app.apk

# 验证签名
apksigner verify -v app.apk

Android 7.0 (API 24) 开始引入 APK Signature Scheme v2,对整个文件进行签名校验,比 V1 逐条目签名性能大幅提升。Android 9.0 (API 28) 进一步引入 V3 支持密钥轮换。


二、DEX / 字节码分析

2.1 d8 / dx(DEX 编译器)

# dx 将 jar/class 转为 dex(旧版,Android Studio 3.0 后废弃)
dx --dex --output=classes.dex input.jar

# d8 新版 dex 编译器(Android Studio 3.1+)
d8 --release --output out_dir input.jar

2.2 dexdump

# 查看 dex 文件结构
dexdump -d classes.dex | head -50

# 查看特定类的方法字节码
dexdump classes.dex | grep -A 20 "Class descriptor"

2.3 baksmali / smali

# 将 dex 反汇编为 smali 代码
baksmali d classes.dex -o smali_output/

# 将 smali 代码汇编为 dex
smali a smali_output/ -o new_classes.dex

smali/baksmali 是理解字节码注入、插桩、反混淆的核心工具。当你需要修改应用逻辑(如跳过付费验证),就是在 smali 层面操作。


三、SO / Native 层分析

3.1 objdump(binutils)

# 查看 SO 动态符号表
objdump -T libtarget.so

# 反汇编指定函数
objdump -d libtarget.so | less

# 查看动态库依赖
objdump -p libtarget.so | grep NEEDED

3.2 readelf

# 查看 ELF 头信息(魔数、架构、入口地址)
readelf -h libtarget.so

# 查看节头表(.text .data .bss .rodata 等)
readelf -S libtarget.so

# 查看程序头(加载段信息)
readelf -l libtarget.so

3.3 nm

# 列出所有符号
nm -D libtarget.so

# 仅列出动态符号
nm --dynamic libtarget.so

四、动态调试工具

4.1 adb 逆向专用命令

# 查看进程内存映射
adb shell cat /proc/<pid>/maps

# 查看已安装应用的包名和 APK 路径
adb shell pm list packages -f

# dump 应用信息(含签名)
adb shell dumpsys package <package_name> | grep -A 5 "signatures"

# 查看应用路径
adb shell pm path <package_name>

4.2 strace

# 追踪进程系统调用
adb shell strace -p <pid>

# 过滤文件操作
adb shell strace -e open,read,write -p <pid>

4.3 frida(动态插桩)

# 在设备上启动 frida-server
adb push frida-server /data/local/tmp/
adb shell chmod 755 /data/local/tmp/frida-server
adb shell /data/local/tmp/frida-server &

# 列出可注入进程
frida-ps -U

五、网络抓包

5.1 tcpdump

# 在设备上抓包
adb shell tcpdump -i wlan0 -w /sdcard/capture.pcap

# 过滤 HTTPS 流量
adb shell tcpdump -i wlan0 port 443 -w /sdcard/capture.pcap

5.2 Charles / mitmproxy

# 设置全局代理
adb shell settings put global http_proxy <proxy_ip>:8888

# 移除代理
adb shell settings put global http_proxy :0

Android 7.0+ HTTPS 抓包关键:系统默认不信任用户安装的 CA 证书。需要将 Charles/mitmproxy 证书安装为系统证书(root 后推送到 /system/etc/security/cacerts/),或使用 Xposed 模块(如 JustTrustMe)Hook 证书校验。


六、命令速查表

场景 命令
反编译 APK apktool d app.apk
查看 DEX 结构 dexdump -d classes.dex
DEX → smali baksmali d classes.dex
反汇编 SO objdump -d lib.so
查看 SO 符号 nm -D lib.so
查看进程内存 adb shell cat /proc/<pid>/maps
抓取网络包 adb shell tcpdump -i wlan0 -w /sdcard/cap.pcap
签名验证 apksigner verify app.apk
动态插桩 frida -U -p <pid> -l script.js

面试常考问题

Q1: apktool 反编译出的 smali 与 Java 源码的关系?
smali 是 DEX 字节码的文本表示,每个 .smali 文件对应一个 Java 类,每一行对应 Dalvik 虚拟机的寄存器操作指令。理解 smali 是做字节码修改和插桩的基本功。

Q2: Android 7.0+ 抓 HTTPS 包为什么需要额外处理?
Android 7.0 引入 Network Security Config,默认只信任系统预装的 CA 证书。用户安装的证书(如 Charles 根证书)对 targetSdkVersion >= 24 的应用无效。解决方法:root 后安装为系统证书、Hook 证书校验、或修改应用 network_security_config.xml

Q3: apksigner V2 签名比 V1 好在哪?
V1 逐个对 JAR 条目签名,验证慢且 APK 解压后签名信息丢失;V2 对整个 APK 文件签名,安装时一次性验证,效率更高,且能检测整个文件是否被篡改。

打赏
  • 微信
  • 支付宝

评论