反汇编看二进制的段布局

要查看二进制文件的段(Section)布局,可以使用反汇编工具分析可执行文件的结构。以下是详细步骤和常用工具:


核心工具

1. Linux (ELF格式)

  • readelf (推荐)
    显示ELF文件的段头表(Section Headers)和程序头表(Program Headers):

    1
    2
    readelf -S <二进制文件>   # 查看段头表(Section Headers)
    readelf -l <二进制文件> # 查看程序头表(Program Headers,描述内存布局)
  • objdump
    查看所有段的信息:

    1
    2
    objdump -h <二进制文件>   # 显示段头摘要
    objdump -d <二进制文件> # 反汇编代码段(如.text)

2. macOS/iOS (Mach-O格式)

  • otool
    macOS 自带工具,分析Mach-O文件:
    1
    otool -lV <二进制文件>   # 显示加载命令(包含段布局)

3. Windows (PE格式)

  • dumpbin (Visual Studio 工具)
    查看PE文件的段信息:
    1
    2
    dumpbin /HEADERS <二进制文件.exe>
    dumpbin /SECTION:<段名> <二进制文件.exe>

关键段(Section)说明

二进制文件通常包含以下常见段:

段名 用途 属性
.text 代码段(函数指令) 可执行、只读
.data 已初始化的全局/静态变量 可读写
.rodata 只读数据(常量字符串、常量数组) 只读
.bss 未初始化的全局/静态变量 可读写(不占文件空间)
.plt/.got 动态链接跳转表/全局偏移表 可读写
.symtab 符号表(调试用) 只读
.strtab 字符串表(符号名称) 只读

示例分析 (Linux ELF)

步骤 1:查看段头表

1
readelf -S demo

输出示例:

1
2
3
4
5
6
Section Headers:
[Nr] Name Type Address Off Size ES Flg Lk Inf Al
[13] .text PROGBITS 0000000000401040 000040 0001a5 00 AX 0 0 16
[15] .rodata PROGBITS 0000000000402000 002000 00000c 00 A 0 0 4
[24] .data PROGBITS 0000000000404020 003020 000010 00 WA 0 0 8
[25] .bss NOBITS 0000000000404030 003030 000008 00 WA 0 0 4
  • **.text**:代码段(Flg=AX 表示可执行)。
  • **.rodata**:只读数据段(Flg=A 表示只读)。
  • **.data**:已初始化数据(Flg=WA 表示可读写)。
  • **.bss**:未初始化数据(NOBITS 表示不占用文件空间)。

步骤 2:查看内存布局

1
readelf -l demo

输出关键段:

1
2
3
4
5
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
LOAD 0x000000 0x0000000000400000 0x0000000000400000 0x0001e5 0x0001e5 R E 0x1000
LOAD 0x002000 0x0000000000402000 0x0000000000402000 0x0000cc 0x0000cc R 0x1000
LOAD 0x003000 0x0000000000403000 0x0000000000403000 0x00001c 0x000024 RW 0x1000
  • 第一个LOAD段:包含.text(可执行)。
  • 第二个LOAD段:包含.rodata(只读)。
  • 第三个LOAD段:包含.data.bss(可读写)。

动态分析:运行时内存布局

使用调试器查看进程的实际内存映射:

  • Linux: gdb + info proc mappings
  • macOS: lldb + image dump sections
  • Windows: WinDbg > !address

工具总结

平台 工具 命令示例
Linux readelf readelf -S <文件>
Linux objdump objdump -h <文件>
macOS otool otool -lV <文件>
Windows dumpbin dumpbin /HEADERS <文件.exe>
通用 gdb/lldb 调试时查看内存映射

通过上述方法,可以清晰了解二进制文件的段布局及其在内存中的映射关系。