第十六节 反汇编工具介绍
(第1章 安卓逆向概论)
学习目标
学完本节,希望你能够:搞清反汇编是啥、咋把二进制变成汇编;熟悉 IDA、Ghidra、Radare2、objdump 的用途和场景;会分析 ELF、DEX、.so;会用 Frida/Xposed 做动态分析、Hook 关键函数;能提取、反编译、分析 Android 二进制。
一、反汇编是啥?
用一句话说清楚
反汇编(Disassembly)是指将 机器码(Binary Code)转换为汇编代码(Assembly Code),从而理解程序的运行逻辑。
示例
| 二进制指令 | ARM 汇编 | 等价 C 代码 |
|---|---|---|
E3A00005 |
MOV R0, #5 |
int a = 5; |
E0801001 |
ADD R1, R0, R1 |
b = a + b; |
EB000001 |
BL function |
function(); |
查看 ELF 文件架构
bash
file libnative.so
示例输出:
libnative.so: ELF 64-bit LSB shared object, ARM aarch64
二、常用反汇编工具有啥?
1. objdump(Linux 自带)
反汇编 ELF 文件
bash
objdump -d libnative.so | head -n 20
解析 ELF 段信息
bash
readelf -h libnative.so
2. IDA Pro(交互式反汇编器)
安装 IDA Free
bash
wget https://out7.hex-rays.com/files/idafree83_linux.run
chmod +x idafree83_linux.run
./idafree83_linux.run
打开 ELF 文件
- File → Open → 选择
libnative.so - 选择 CPU 架构(ARM/ARM64)
- 开始分析,查看函数表、字符串、交叉引用(XREF)
快捷键
| 操作 | 快捷键 |
|---|---|
| 交叉引用 | X |
| 切换汇编/C 代码 | F5 |
| 查找字符串 | Shift + F12 |
3. Ghidra(NSA 开源工具)
安装 Ghidra
bash
wget https://ghidra-sre.org/ghidra_10.1.5_PUBLIC_20231005.zip
unzip ghidra_10.1.5_PUBLIC_20231005.zip
cd ghidra_10.1.5
./ghidraRun
分析 ELF 文件
- File → New Project → Import
libnative.so - 选择 ARM 处理器
- 双击函数,查看反汇编结果
- 使用
Decompiler还原 C 代码
Ghidra 常用快捷键
| 操作 | 快捷键 |
|---|---|
| 查找字符串 | Ctrl + Shift + F |
| 交叉引用 | Ctrl + Shift + X |
| 反编译 | F4 |
4. Radare2(开源 CLI 反汇编工具)
安装 Radare2
bash
git clone https://github.com/radareorg/radare2.git
cd radare2
sys/install.sh
反汇编 ELF
bash
r2 -AA libnative.so
常用命令
| 命令 | 作用 |
|---|---|
aa |
自动分析 |
afl |
显示所有函数 |
pdf @ main |
反汇编 main() |
izz |
查找字符串 |
三、逆向里咋分析 Android ELF?
1. 提取 libnative.so
bash
adb shell run-as com.example.app cat /data/app/com.example.app/lib/arm64/libnative.so > libnative.so
2. 解析 ELF 头
bash
readelf -h libnative.so
3. 反汇编
bash
objdump -d libnative.so | head -n 20
4. Hook ELF 运行时行为
使用 Frida Hook open()
js
Java.perform(function() {
var libc = Module.findExportByName(null, "open");
Interceptor.attach(libc, {
onEnter: function(args) {
console.log("File Opened: " + Memory.readUtf8String(args[0]));
}
});
});
执行
bash
frida -U -n com.example.app -e "..."
四、咋 Hook DEX 代码?
使用 Frida Hook DEX 运行时
js
Java.perform(function() {
var DexClassLoader = Java.use("dalvik.system.DexClassLoader");
DexClassLoader.loadClass.implementation = function(name) {
console.log("Hooked Dex Load: " + name);
return this.loadClass(name);
};
});
执行
bash
frida -U -n com.example.app -e "..."
动手练一练
- 用 objdump 反汇编 ELF
bash
objdump -d libnative.so | head -n 20
- 用 IDA/Ghidra 反编译 ELF
- 导入
libnative.so - 查找字符串
- 分析关键函数
- Hook open() 调用
js
Java.perform(function() {
var libc = Module.findExportByName(null, "open");
Interceptor.attach(libc, {
onEnter: function(args) {
console.log("File Opened: " + Memory.readUtf8String(args[0]));
}
});
});
- Hook DexClassLoader
js
Java.perform(function() {
var DexClassLoader = Java.use("dalvik.system.DexClassLoader");
DexClassLoader.loadClass.implementation = function(name) {
console.log("Hooked Dex Load: " + name);
return this.loadClass(name);
};
});
本节小结
你只要记住这几条就行:反汇编是把机器码转成汇编,objdump 简单快、IDA/Ghidra 可交互和反编译 C、Radare2 是命令行;ELF 用 file/readelf -h 看架构,用 Frida Hook 可动态看调用和改行为。
本节思考与练习
- 概念:反汇编和反编译有啥区别?IDA 和 Ghidra 各适合啥场景?
- 动手:用 objdump 反汇编一个 so,找到 main 或导出函数。
- 动手:用 IDA 或 Ghidra 打开同一个 so,看字符串和交叉引用。
- 动手:用 Frida Hook 一个 so 里的
open(),打印打开的文件路径。
下一节预告 :下一节讲 ELF 文件解析(第十七节),把 ELF 头、程序头、节表、符号表讲清楚。