温馨提示×

如何对比linux反汇编

小樊
43
2026-09-24 17:23:27
栏目: 智能运维

在 Linux 环境下“对比反汇编”(比如对比两个二进制、对比同一程序不同版本、对比 patch 前后差异)通常有几种常见目标和对应方法。下面按使用场景给你一个实用指南。


一、常见对比目的

  1. 源码/二进制版本差异(有没有改逻辑)
  2. 编译器优化差异(-O0 vs -O2)
  3. 安全补丁对比(CVE fix)
  4. 自己写的汇编 vs 编译器生成的汇编

二、基础反汇编工具

1. objdump(最常用)

objdump -d ./a.out > a.asm
objdump -d ./b.out > b.asm

常用选项:

objdump -d -M intel ./a.out   # Intel 语法
objdump -d -S ./a.out         # 源码+汇编(需带调试信息)

三、最推荐:直接 diff 反汇编文本

方法 1:普通 diff

diff a.asm b.asm

方法 2:忽略地址(更准)

反汇编里地址会变,建议先“去地址化”:

objdump -d ./a.out | sed 's/^[0-9a-f]* //' > a.clean
objdump -d ./b.out | sed 's/^[0-9a-f]* //' > b.clean
diff a.clean b.clean

方法 3:函数级对比(更清晰)

objdump -d ./a.out | awk '/<main>:/,/^$/' > main_a.asm
objdump -d ./b.out | awk '/<main>:/,/^$/' > main_b.asm
diff main_a.asm main_b.asm

四、更专业:二进制差异对比

1. bindiff(最强,但偏逆向)

  • 配合 IDA / Ghidra
  • 函数级、基本块级对比
  • 非常适合安全研究

2. diaphora(Ghidra 插件,免费)

  • 开源
  • 适合 ELF / Linux 程序

3. radiff2(rizin / radare2)

r2 -q -c 'aa; radiff2 -g main a.out b.out' a.out

五、从源码角度看(最省事)

如果是你自己编译的

gcc -S a.c -o a.s
gcc -S b.c -o b.s
diff a.s b.s

或者:

gcc -O0 -S a.c
gcc -O2 -S a.c

六、实战建议(经验总结)

✅ 想快速看改了啥
→ objdump + diff

✅ 看函数逻辑变化
→ 函数级提取后 diff

✅ 看安全补丁
→ diaphora / bindiff

✅ 自己写汇编对比编译器
→ gcc -S


如果你有具体场景(比如:

  • 对比两个 .so
  • 对比 patch 前后
  • 对比内核模块
  • 对比 Go / Rust 二进制)

可以直接说,我可以给你针对性的命令和示例。

0 踩