第十六节_反汇编工具介绍

第十六节 反汇编工具介绍

(第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 文件

  1. File → Open → 选择 libnative.so
  2. 选择 CPU 架构(ARM/ARM64)
  3. 开始分析,查看函数表、字符串、交叉引用(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 文件

  1. File → New Project → Import libnative.so
  2. 选择 ARM 处理器
  3. 双击函数,查看反汇编结果
  4. 使用 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 "..."


动手练一练

  1. 用 objdump 反汇编 ELF
bash 复制代码
objdump -d libnative.so | head -n 20
  1. 用 IDA/Ghidra 反编译 ELF
  2. 导入 libnative.so
  3. 查找字符串
  4. 分析关键函数
  5. 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]));
        }
    });
});
  1. 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 可动态看调用和改行为。


本节思考与练习

  1. 概念:反汇编和反编译有啥区别?IDA 和 Ghidra 各适合啥场景?
  2. 动手:用 objdump 反汇编一个 so,找到 main 或导出函数。
  3. 动手:用 IDA 或 Ghidra 打开同一个 so,看字符串和交叉引用。
  4. 动手:用 Frida Hook 一个 so 里的 open(),打印打开的文件路径。

下一节预告 :下一节讲 ELF 文件解析(第十七节),把 ELF 头、程序头、节表、符号表讲清楚。

相关推荐
长沙火山6 小时前
第十一节_Android_进程管理
逆向·安卓逆向
长沙火山6 小时前
第九节_Android_CPU_架构解析
逆向·安卓逆向
长沙火山1 天前
第六节_x86_vs_ARM_汇编
逆向·安卓逆向
泡泡以安1 天前
Android 逆向实战:从零突破某电商 App 登录接口全参数加密
android·爬虫·安卓逆向
长沙火山2 天前
第五节_汇编语言基础
逆向·安卓逆向
夏了茶糜3 天前
Electron应用逆向分析思路
逆向
嫂子的姐夫6 天前
25-jsl:gov公安(全扣补环境版)
爬虫·逆向·加速乐
嫂子的姐夫6 天前
24-MD5:红人点集登录+凡客网登录
爬虫·python·逆向·小白逆向练手
clown_YZ8 天前
KnightCTF2026--WP
网络安全·逆向·ctf·漏洞利用