第十六节 反汇编工具介绍
(第1章 安卓逆向概论)
学习目标
学完本节,希望你能够:搞清反汇编是啥、咋把二进制变成汇编;熟悉 IDA、Ghidra、Radare2、objdump 的用途和场景;会分析 ELF、DEX、.so;会用 Frida/Xposed 做动态分析、Hook 关键函数;能提取、反编译、分析 Android 二进制。
一、反汇编是啥?
用一句话说清楚
反汇编(Disassembly)是指将 机器码(Binary Code)转换为汇编代码(Assembly Code),从而理解程序的运行逻辑。
示例
| E3A00005 | MOV R0, #5 | int a = 5; |
| E0801001 | ADD R1, R0, R1 | b = a + b; |
| EB000001 | BL function | function(); |
查看 ELF 文件架构
file libnative.so
示例输出:
libnative.so: ELF 64-bit LSB shared object, ARM aarch64
二、常用反汇编工具有啥?
1. objdump(Linux 自带)
反汇编 ELF 文件
objdump -d libnative.so | head -n 20
解析 ELF 段信息
readelf -h libnative.so
2. IDA Pro(交互式反汇编器)
安装 IDA Free
wget https://out7.hex-rays.com/files/idafree83_linux.run
chmod +x idafree83_linux.run
./idafree83_linux.run
打开 ELF 文件
快捷键
| 交叉引用 | X |
| 切换汇编/C 代码 | F5 |
| 查找字符串 | Shift + F12 |
3. Ghidra(NSA 开源工具)
安装 Ghidra
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 文件
Ghidra 常用快捷键
| 查找字符串 | Ctrl + Shift + F |
| 交叉引用 | Ctrl + Shift + X |
| 反编译 | F4 |
4. Radare2(开源 CLI 反汇编工具)
安装 Radare2
git clone https://github.com/radareorg/radare2.git
cd radare2
sys/install.sh
反汇编 ELF
r2 -AA libnative.so
常用命令
| aa | 自动分析 |
| afl | 显示所有函数 |
| pdf @ main | 反汇编 main() |
| izz | 查找字符串 |
三、逆向里咋分析 Android ELF?
1. 提取 libnative.so
adb shell run-as com.example.app cat /data/app/com.example.app/lib/arm64/libnative.so > libnative.so
2. 解析 ELF 头
readelf -h libnative.so
3. 反汇编
objdump -d libnative.so | head -n 20
4. Hook ELF 运行时行为
使用 Frida Hook open()
Java.perform(function() {
var libc = Module.findExportByName(null, "open");
Interceptor.attach(libc, {
onEnter: function(args) {
console.log("File Opened: " + Memory.readUtf8String(args[0]));
}
});
});
执行
frida -U -n com.example.app -e "…"
四、咋 Hook DEX 代码?
使用 Frida Hook DEX 运行时
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);
};
});
执行
frida -U -n com.example.app -e "…"
动手练一练
objdump -d libnative.so | head -n 20
Java.perform(function() {
var libc = Module.findExportByName(null, "open");
Interceptor.attach(libc, {
onEnter: function(args) {
console.log("File Opened: " + Memory.readUtf8String(args[0]));
}
});
});
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 可动态看调用和改行为。
本节思考与练习
下一节预告:下一节讲 ELF 文件解析(第十七节),把 ELF 头、程序头、节表、符号表讲清楚。