反汇编查看二进制段布局
反汇编看二进制的段布局
要查看二进制文件的段(Section)布局,可以使用反汇编工具分析可执行文件的结构。以下是详细步骤和常用工具:
核心工具
1. Linux (ELF格式)
readelf
(推荐)
显示ELF文件的段头表(Section Headers)和程序头表(Program Headers):1
2readelf -S <二进制文件> # 查看段头表(Section Headers)
readelf -l <二进制文件> # 查看程序头表(Program Headers,描述内存布局)objdump
查看所有段的信息:1
2objdump -h <二进制文件> # 显示段头摘要
objdump -d <二进制文件> # 反汇编代码段(如.text)
2. macOS/iOS (Mach-O格式)
otool
macOS 自带工具,分析Mach-O文件:1
otool -lV <二进制文件> # 显示加载命令(包含段布局)
3. Windows (PE格式)
dumpbin
(Visual Studio 工具)
查看PE文件的段信息:1
2dumpbin /HEADERS <二进制文件.exe>
dumpbin /SECTION:<段名> <二进制文件.exe>
关键段(Section)说明
二进制文件通常包含以下常见段:
段名 | 用途 | 属性 |
---|---|---|
.text |
代码段(函数指令) | 可执行、只读 |
.data |
已初始化的全局/静态变量 | 可读写 |
.rodata |
只读数据(常量字符串、常量数组) | 只读 |
.bss |
未初始化的全局/静态变量 | 可读写(不占文件空间) |
.plt /.got |
动态链接跳转表/全局偏移表 | 可读写 |
.symtab |
符号表(调试用) | 只读 |
.strtab |
字符串表(符号名称) | 只读 |
示例分析 (Linux ELF)
步骤 1:查看段头表
1 | readelf -S demo |
输出示例:
1 | Section Headers: |
- **
.text
**:代码段(Flg=AX
表示可执行)。 - **
.rodata
**:只读数据段(Flg=A
表示只读)。 - **
.data
**:已初始化数据(Flg=WA
表示可读写)。 - **
.bss
**:未初始化数据(NOBITS
表示不占用文件空间)。
步骤 2:查看内存布局
1 | readelf -l demo |
输出关键段:
1 | Program Headers: |
- 第一个
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 |
调试时查看内存映射 |
通过上述方法,可以清晰了解二进制文件的段布局及其在内存中的映射关系。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Helloeuler!