PE文件
概念
PE文件(Portable Executable)是Windows操作系统下的可执行文件格式,用于描述可执行程序、动态链接库(DLL)、驱动程序、内核模块等二进制文件的组织结构。
类型
-
.exe:可执行程序。 -
.dll:动态链接库。 -
.sys:驱动程序。 -
.ocx:ActiveX控件。
文件结构
-
DOS头(DOS Header)
-
包含
MZ签名,用于DOS兼容。 -
指向PE头的偏移地址。
-
-
PE文件头(PE Header)
-
PE\0\0签名。 -
COFF头(机器类型、节区数量等)。
-
可选头(入口点、内存对齐、子系统类型等)。
-
-
节区表(Section Table)
-
描述各节(如
.text,.data,.rsrc)的属性。
-
-
节区数据(Sections)
-
存储代码、数据、资源等。
-
ELF文件
概念
类Unix系统(如Linux、Android、BSD等)使用另一种常见的可执行文件格式——ELF(Executable and Linkable Format)。
类型
无扩展名
.elf
.so
.o
.ko
文件结构
-
ELF头(ELF Header)
-
\x7F ELF魔数。 -
类型(可执行/共享库/目标文件)、机器架构、入口点等。
-
-
程序头表(Program Headers)
-
定义如何加载到内存(
LOAD段)。
-
-
节区头表(Section Headers)
-
描述各节(如
.text,.data,.dynamic)的链接信息。
-
-
节区数据(Sections/Segments)
-
代码、数据、符号表等。
-
两者工具对比
| 用途 | PE工具 | ELF工具 |
|---|---|---|
| 查看结构 | CFF Explorer, PEView | readelf, objdump |
| 反汇编 | IDA Pro, Ghidra | objdump -d, Ghidra |
| 调试 | WinDbg, x64dbg | gdb, strace |
| 编辑/修补 | HxD, 010 Editor | hexedit, vim + xxd |
节区
概念
在PE(Windows)和ELF(Linux)这类可执行文件中,节区(Section) 就像是一个“分类收纳盒”,用来把程序的不同部分(代码、数据、资源等)分门别类存放。
作用
-
分类存储:代码、数据、资源等分开存放,避免混乱。
-
比如:代码放
.text,全局变量放.data,字符串放.rodata。
-
-
内存管理:告诉操作系统每个部分的权限(可读/可写/可执行)。
-
例如:代码节(
.text)需要“可读+可执行”,但不能写入(防止被篡改)。
-
-
优化效率:
-
未初始化的数据(如全局变量
int a;)不占文件空间,只在内存中分配(ELF的.bss节)。
-
PE节区类型
| 节区名 | 作用 |
|---|---|
.text | 存放可执行代码(CPU指令),权限通常是可读+可执行(RX)。 |
.data | 存放已初始化的全局变量(如int a = 10;),权限可读+可写(RW)。 |
.rdata | 存放只读数据(如字符串常量),权限只读(R)。 |
.rsrc | 存放资源(图标、菜单、对话框等),权限只读。 |
.idata | 导入表(记录程序依赖的DLL及其函数),用于动态链接。 |
ELF节区类型
| 节区名 | 作用 |
|---|---|
.text | 可执行代码(同PE),权限RX。 |
.data | 已初始化的全局变量,权限RW。 |
.bss | 未初始化的全局变量(如int a;),不占文件空间,内存中补零,权限RW。 |
.rodata | 只读数据(类似PE的.rdata),权限R。 |
.plt/.got | 动态链接的跳转表(类似PE的导入表),用于调用共享库(.so)的函数。 |
.dynamic | 动态链接信息(依赖哪些库、符号表等) |
段
概念
段(Segment) 是操作系统加载程序时使用的“内存管理单元”。它定义了如何将文件中的内容(代码、数据等)映射到内存,并设置内存的访问权限(可读、可写、可执行)。
-
文件中的节区 是分类打包的“小盒子”(比如代码盒、数据盒)。
-
段 是最终装车的“大集装箱”,告诉操作系统:“这几个小盒子要一起运到内存的某个地方,并且只能按某种方式使用(比如代码集装箱只能读和执行,不能乱改)。”
一个段(如LOAD)可以包含多个节区(如.text和.rodata),而一个节区也可能被拆分到不同段。
作用
-
内存映射
-
指定文件中哪些部分(节区)需要加载到内存。
-
例如:代码段(
LOAD)包含.text节,数据段(LOAD)包含.data节。
-
-
权限控制
-
设置内存页的访问权限(Read/Write/Execute)。
-
例如:代码段权限是
R-X(可读+可执行),数据段是RW-(可读+可写)。
-
-
对齐优化
-
按内存页大小(如4KB)对齐,提高加载效率。
-
6万+

被折叠的 条评论
为什么被折叠?



