PE 格式
一种规范和标准,里面包含了程序执行的代码,数据和资源等 Win:.exe/.dll/.sys => pe
如图为pe文件的结构

DOS部首
pe 文件的开始部分 e_magic:“MZ” 0x5a4d
DOS stub -> “This program Cannot be run in DOS mode”
这是dos 部首的结构

pe 文件头
“PE”0,0
导入表 -> 引用的外部函数
导出表-> 自身定义的表
VOFFSET
相对于基地址 IMAGE_BASE 的偏移(内存中)
ROFFSET
在磁盘中 相对于文件头的地址
程序 EXE 与进程 线程
程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。把程序存放在磁盘上的EXE 程序文件是映像文件(ImageFile)
进程是程序在处理机的一次执行过程,他是一个动态的概念,拥有一个完整的生命周期。进程的实质是程曦在系统中的一次执行过程,进程是动态产生的,动态消亡的。一个程序在不同的数据集里就构成不同的进程
进程的三个状态:
- 就绪状态(Ready):进程已经获得除处理器外的所需资源,等待奉陪处理器资源。就绪进程可以按斗个优先级来划分队列。例如当进程由I/O 操作完成而进入就绪状态时,排入低优先级队。
- 运行状态(Running):进程占用处理器资源,在没有其他进程可以执行时(如果所有进程都在阻塞状态),通常会自动执行系统的空闲进程
- 阻塞状态(Blocked):由于进程等待某种条件(如I/O操作或进程同步),在条件满足前无法继续执行。该时间发生前即使把处理器资源分配给进程,也无法运行
线程的引入,是为了提高系统并发的度。一个程序至少有一个进程,而一个进程至少有一个线程,进程是资源分配的基本单位,线程是调度的基本单位。
系统内存布
- 用户空间(应用,C Library)
- Kernel Space(内核空间),操作系统
- 硬件平台
ELF 文件格式
ELF(Executable and Linkable Format,可执行与可链接格式)是一种用于二进制文件(如可执行程序、目标代码、共享库和核心转储)的标准文件格式。它最初由 UNIX 系统实验室开发,现在已成为类 Unix 系统(如 Linux、BSD)以及许多嵌入式系统上最主流的文件格式。
ELF 的核心思想是 提供一种灵活的方式来描述文件的内容和组织结构,使其既能被链接器(用于创建程序)理解,也能被加载器(用于运行程序)理解 。为了实现这一点,ELF 文件使用了一个“节”和“段”的两级视图。
ELF文件结构
-
ELF 文件头
- 位于文件开头,是整个文件的路线图
- 包含信息:
- 魔数:标识这是一个 ELF 文件(
0x7F ‘E’ ‘L’ ‘F’)。 - 文件类型,(可执行文件,共享库,目标文件)
- 目标机器架构 x86-64 ARM
- 程序头标在文件中的起始位置和表项大小
- 节头表中字符串表的索引
- 魔数:标识这是一个 ELF 文件(
-
程序头标
- 仅在可执行文件和共享库中存在,目标文件(
.o)通常没有。 - 它定义了如何将文件内容映射到进程的内存空间。
- 常见的段类型:
PT_LOAD:需要被加载到内存的段。一个可执行文件通常至少有两个LOAD段:一个用于代码和只读数据(权限为 R+X),另一个用于可读写数据(权限为 R+W)。PT_INTERP:指定程序解释器(动态链接器)的路径,例如/lib64/ld-linux-x86-64.so.2。PT_DYNAMIC:包含动态链接信息。
- 仅在可执行文件和共享库中存在,目标文件(
-
节
- 文件的实际内容被组织在不同的节中。
- 常见的节:
.text:存放已编译程序的 机器代码 。.data:存放 已初始化的全局变量和静态变量 。.bss:存放 未初始化的全局变量和静态变量 。这个节在文件中不占空间,但加载到内存时会分配空间并初始化为0.rodata:存放 只读数据 ,如字符串常量。.symtab: 符号表 ,存放函数和变量名等信息。.strtab: 字符串表 ,存放.symtab等节中使用的字符串。.shstrtab: 节头字符串表 ,存放所有节的名称。.dynamic:动态链接信息。.dynsym:动态链接符号表。
-
节头表
- 描述了文件中所有节的信息。每个表项对应一个节,描述了该节的名称、类型、在文件中的偏移量、大小、内存地址、访问权限等。
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时










