【逆向】二进制可执行文件的组织标准

PE文件

概念

PE文件(Portable Executable)是Windows操作系统下的可执行文件格式,用于描述可执行程序、动态链接库(DLL)、驱动程序、内核模块等二进制文件的组织结构。

类型

  • .exe:可执行程序。

  • .dll:动态链接库。

  • .sys:驱动程序。

  • .ocx:ActiveX控件。

文件结构

  1. DOS头(DOS Header)

    • 包含MZ签名,用于DOS兼容。

    • 指向PE头的偏移地址。

  2. PE文件头(PE Header)

    • PE\0\0签名。

    • COFF头(机器类型、节区数量等)。

    • 可选头(入口点、内存对齐、子系统类型等)。

  3. 节区表(Section Table)

    • 描述各节(如.text, .data, .rsrc)的属性。

  4. 节区数据(Sections)

    • 存储代码、数据、资源等。

ELF文件

概念

类Unix系统(如Linux、Android、BSD等)使用另一种常见的可执行文件格式——ELF(Executable and Linkable Format)

类型

无扩展名

.elf

.so

.o

.ko

文件结构

  1. ELF头(ELF Header)

    • \x7F ELF魔数。

    • 类型(可执行/共享库/目标文件)、机器架构、入口点等。

  2. 程序头表(Program Headers)

    • 定义如何加载到内存(LOAD段)。

  3. 节区头表(Section Headers)

    • 描述各节(如.text, .data, .dynamic)的链接信息。

  4. 节区数据(Sections/Segments)

    • 代码、数据、符号表等。

两者工具对比

用途PE工具ELF工具
查看结构CFF Explorer, PEViewreadelf, objdump
反汇编IDA Pro, Ghidraobjdump -d, Ghidra
调试WinDbg, x64dbggdb, strace
编辑/修补HxD, 010 Editorhexedit, 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),而一个节区也可能被拆分到不同段。

作用

  1. 内存映射

    • 指定文件中哪些部分(节区)需要加载到内存。

    • 例如:代码段(LOAD)包含.text节,数据段(LOAD)包含.data节。

  2. 权限控制

    • 设置内存页的访问权限(Read/Write/Execute)。

    • 例如:代码段权限是R-X(可读+可执行),数据段是RW-(可读+可写)。

  3. 对齐优化

    • 按内存页大小(如4KB)对齐,提高加载效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值