| ELF Header | 文件头,描述整体结构和入口点
+------------------------+
| Program Header Table | 程序头表,描述加载的段
+------------------------+
| Segment/Sections | 实际段内容,如代码、数据等
+------------------------+
| Section Header Table | 段表,描述每个段的位置和功能
+------------------------+这里是ELF文件的文件结构类型ELF Header (ELF 文件头)作用:描述文件类型、目标架构和入口点等元数据。字段描述
e_ident魔数、文件类型标识、架构信息 (32/64 位,大小端)
e_type文件类型(可执行文件、共享库、目标文件等)
e_machine目标架构(如 x86、ARM 等)
e_versionELF 版本
e_entry程序入口点虚拟地址
e_phoff程序头表在文件中的偏移
e_shoff段表在文件中的偏移
e_flags与架构相关的标志
e_ehsizeELF Header 的大小
e_phentsize程序头表中每个条目的大小
e_phnum程序头表中的条目数
e_shentsize段表中每个条目的大小
e_shnum段表中的条目数
e_shstrndx段表中字符串表的索引
** Program Header Table (程序头表)**作用:描述进程运行时需要加载到内存的段信息,仅对可执行文件和共享库有用。字段描述
p_type段类型(如 PT_LOAD 表示加载段)
p_offset段在文件中的偏移
p_vaddr段在内存中的虚拟地址
p_paddr段在内存中的物理地址(通常忽略)
p_filesz段在文件中的大小
p_memsz段在内存中的大小
p_flags段的访问权限(读、写、执行)
p_align段在内存中的对齐粒度常见段类型:
0PT_LOAD0x000000400x080000000x001000000x00100000R+E
1PT_LOAD0x001000400x080010000x000010000x00001000RW
.....................新 Program Header Table(文件末尾):Entry Indexp_typep_offsetp_vaddrp_fileszp_memszp_flags
0PT_LOAD0x000000400x080000000x001000000x00100000R+E
1PT_LOAD0x001000400x080010000x000010000x00001000RW
.....................
5PT_LOAD文件尾偏移映射地址大小大小R使得我们添加在文件末尾的数据被真实的加载映射了修改动态段 (.dynamic):因为添加了新的字符串数目,对应的字符串表的虚拟地址以及字符串总数目也会改变更新 DT_STRTAB 和 DT_STRSZ:
| ELF Header | 包含文件元信息(如入口点、PHT/SHT 偏移等)
+------------------------+
| Program Header Table | PHT,描述 Segments 的加载信息
+------------------------+
| Segment 1 (.text) | 包含代码段
+------------------------+
| Segment 2 (.data) | 包含已初始化的全局和静态变量
+------------------------+
| Segment 3 (.bss) | 包含未初始化的全局和静态变量(运行时分配)
+------------------------+
| Section Header Table | SHT,描述 Sections 的信息
+------------------------+注入 .so 后的 ELF 文件结构:+------------------------+
| ELF Header | 更新了 e_phoff 指向新的 PHT 位置
+------------------------+
| (原) Program Header | 仍在文件起始,但未被使用
+------------------------+
| Segment 1 (.text) | 包含代码段
+------------------------+
| Segment 2 (.data) | 包含已初始化的全局和静态变量
+------------------------+
| Segment 3 (.bss) | 包含未初始化的全局和静态变量
+------------------------+
| Section Header Table | SHT,描述 Sections 的信息
+------------------------+
| 新字符串表 (.dynstr) | 新增,包含注入的 .so 名字
+------------------------+
| 新 Program Header Table| 移动到文件末尾,新增 PT_LOAD 表项
+------------------------+