温馨提示×

怎么对比centos反汇编

小樊
47
2026-10-17 19:42:42
栏目: 智能运维

在 CentOS 上对比“反汇编”(disassembly)结果,常见需求一般有两种:

  1. 同一个程序不同版本/编译选项的反汇编对比
  2. Linux 下对比反汇编代码的工具和方法

下面按实用角度给你讲清楚。


一、准备反汇编环境(CentOS)

1. 安装常用工具

sudo yum install -y binutils gcc objdump gdb

可选(更强大):

sudo yum install -y radare2 ghidra(手动装)

二、生成反汇编文件

方法 1:objdump(最常用)

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

常用参数:

  • -d:反汇编可执行代码
  • -M intel:Intel 语法(默认是 AT&T)
  • -S:源码+汇编对照(需 -g 编译)

示例:

objdump -d -M intel ./test > test.asm

方法 2:gdb(动态/函数级)

gdb ./a.out
(gdb) disassemble main

导出:

(gdb) set logging on
(gdb) disassemble main
(gdb) set logging off

三、对比反汇编结果

✅ 方法 1:diff(最简单)

diff a.asm b.asm

或更好看的:

vimdiff a.asm b.asm

⚠️ 问题:

  • 地址不同会干扰对比
  • 函数顺序可能变化

✅ 方法 2:去掉地址再 diff(推荐)

objdump -d -M intel ./a.out | cut -c 10- > a.clean
objdump -d -M intel ./b.out | cut -c 10- > b.clean
diff a.clean b.clean

或:

objdump -d ./a.out | awk '{print $2,$3,$4}' > a.s
objdump -d ./b.out | awk '{print $2,$3,$4}' > b.s
diff a.s b.s

✅ 方法 3:按函数对比(更精准)

objdump -d -M intel ./a.out | sed -n '/<main>:/,/^$/p' > main_a.asm
objdump -d -M intel ./b.out | sed -n '/<main>:/,/^$/p' > main_b.asm
diff main_a.asm main_b.asm

四、进阶工具(更适合复杂对比)

1. radare2(r2)

r2 -AA ./a.out
> pdf @ main

对比两个二进制:

  • 导出汇编
  • 使用 radiff2
radiff2 -a x86 -b 64 a.out b.out

2. Ghidra(图形化)

  • 导入两个 ELF
  • 反编译为伪代码
  • 直接文本对比

适合:

  • 逆向分析
  • 安全研究

五、常见对比场景

场景 推荐方式
编译优化对比 objdump + diff
源码小改动 -S + vimdiff
安全补丁对比 radiff2
逆向分析 Ghidra

六、示例完整流程

gcc -O0 -o a.out test.c
gcc -O2 -o b.out test.c

objdump -d -M intel a.out > a.asm
objdump -d -M intel b.out > b.asm

vimdiff a.asm b.asm

如果你愿意,可以告诉我:

  • 是 C/C++ 程序 还是 未知二进制
  • 想对比 函数级别 还是 整个文件
  • 是否涉及 安全/逆向

我可以给你更针对性的命令或脚本。

0 踩