在 Linux 环境下“对比反汇编”(比如对比两个二进制、对比同一程序不同版本、对比 patch 前后差异)通常有几种常见目标和对应方法。下面按使用场景给你一个实用指南。
-O0 vs -O2)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 a.asm b.asm
反汇编里地址会变,建议先“去地址化”:
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
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
bindiff(最强,但偏逆向)diaphora(Ghidra 插件,免费)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可以直接说,我可以给你针对性的命令和示例。