温馨提示×

如何对比linux反汇编结果

小樊
44
2026-09-27 15:21:19
栏目: 智能运维

在 Linux 下“对比反汇编结果”通常有几种常见场景,下面按目的 + 工具 + 方法给你一个比较系统的说明。


一、常见对比场景

  1. 同一程序,不同编译参数
    • 比如 -O0 vs -O2
  2. 不同版本源码/补丁前后的二进制
    • 判断改了哪些逻辑
  3. 同一份代码,不同编译器 / 不同架构
    • gcc vs clang,x86 vs arm
  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         # 源码+汇编混合

2. gdb(运行时反汇编)

gdb ./a.out
(gdb) disassemble main

适合:

  • 动态对比
  • 对比内存中实际执行的代码

3. nm / readelf(辅助对比符号)

nm a.out
readelf -s a.out

用来先确认:

  • 函数是否还在
  • 是否被改名 / strip

三、直接文本对比(最简单)

diff a.asm b.asm

或更好看:

vimdiff a.asm b.asm

⚠ 注意:

  • 地址不同是正常的
  • 要看指令序列、逻辑结构,而不是地址

四、更“聪明”的对比方式(推荐)

1. 去掉地址再对比

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

2. 使用 bindiff(最强二进制对比)

适合:

  • 安全分析
  • 漏洞比对

流程:

  1. 用 IDA Pro 打开两个二进制
  2. 导出 .idb
  3. 用 BinDiff 对比
  4. 看相似度、函数匹配、基本块差异

✅ 优点:

  • 忽略地址
  • 按“语义”匹配函数
  • 图形化非常直观

3. 使用 diaphora(IDA 免费插件)

  • 开源
  • 类似 BinDiff
  • 适合没有 BinDiff license 的情况

五、对比时的重点看什么

不要只看指令,要看:

✅ 函数是否存在
✅ 调用关系是否变化
✅ 循环 / 分支结构
✅ 是否插入了额外指令(反调试、校验)
✅ 常量是否变化(字符串、密钥)


六、示例:对比优化级别

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:寄存器优化、函数内联

七、如果你愿意,我可以帮你

你可以告诉我:

  1. 对比的是 什么程序
  2. 目的是 逆向 / 优化 / 安全分析
  3. 用的是 x86 / ARM / 其他

我可以直接给你一套最适合你场景的对比流程或脚本。

0 踩