在 Linux 下“对比反汇编结果”通常有几种常见场景,下面按目的 + 工具 + 方法给你一个比较系统的说明。
-O0 vs -O2objdump(最常用)objdump -d ./a.out > a.asm
objdump -d ./b.out > b.asm
常用参数:
objdump -d -M intel ./a.out # Intel 语法
objdump -d -S ./a.out # 源码+汇编混合
gdb(运行时反汇编)gdb ./a.out
(gdb) disassemble main
适合:
nm / readelf(辅助对比符号)nm a.out
readelf -s a.out
用来先确认:
diff a.asm b.asm
或更好看:
vimdiff 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
bindiff(最强二进制对比)适合:
流程:
.idb✅ 优点:
diaphora(IDA 免费插件)不要只看指令,要看:
✅ 函数是否存在
✅ 调用关系是否变化
✅ 循环 / 分支结构
✅ 是否插入了额外指令(反调试、校验)
✅ 常量是否变化(字符串、密钥)
gcc -O0 -o a.out main.c
gcc -O2 -o b.out main.c
objdump -d -M intel a.out > a.asm
objdump -d -M intel b.out > b.asm
vimdiff a.asm b.asm
你会看到:
-O0:很多 mov / push-O2:寄存器优化、函数内联你可以告诉我:
我可以直接给你一套最适合你场景的对比流程或脚本。