ELF文件格式
这一节文章的标题叫做<提取so文件的特征值>,在这里就不得不说ELF文件的格式. 因为像.o , .so, .exe 为后缀名的文件都是elf格式的文件. ELF 文件格式是一种二进制的文件.它被叫做可执行链接的格式(
Executable and Linking Format).
ELF格式文件标准被选作为一种可移植的目标文件被分为三种类型:
- 可重定位文件(Relocatable File) (*.0) 其包含适用于与其他目标文件链接来创建可执行文件或者共享目标文件的代码和数据.
- 可执行文件(Executable File)(*.exe) 包含使用于执行的一个程序,此文件规定了exec()如何创建一个程序的映像.
- 共享目标文件(Shared Object File)(*.so)包含可在两种上下文链接的代码和数据.首先链接编辑器可以将它和其他的可重定位文件和共享文件一起处理
ELF的数据类型
ELF文件的头部结构
typedef struct{
Elf32_Word sh_name; //节区名,是节区头部字符串表节区(Section Header String Table Section)的索引。名字是一个 NULL 结尾的字符串。
Elf32_Word sh_type; //为节区类型
Elf32_Word sh_flags; //节区标志
Elf32_Addr sh_addr; //如果节区将出现在进程的内存映像中,此成员给出节区的第一个字节应处的位置。否则,此字段为 0。
Elf32_Off sh_offset; //此成员的取值给出节区的第一个字节与文件头之间的偏移。
Elf32_Word sh_size; //此 成 员 给 出 节 区 的 长 度 ( 字 节 数 )。
Elf32_Word sh_link; //此成员给出节区头部表索引链接。其具体的解释依赖于节区类型。
Elf32_Word sh_info; //此成员给出附加信息,其解释依赖于节区类型。
Elf32_Word sh_addralign; //某些节区带有地址对齐约束.
Elf32_Word sh_entsize; //某些节区中包含固定大小的项目,如符号表。对于这类节区,此成员给出每个表项的长度字节数。
}Elf32_Shdr;
每次我看到ELF文件的时候,总会想到的东西就是虫子,因为它们都是一节一节的.(或许这个表述不准确) ELF文件包括了很多的节区(section),这些节区有的是系统预定好的,有些是用户通过.section命令自定义的.
在这里我们需要强调的是一些特殊节区, 这些节区是系统预定的,我们在这里要提一下我们之后需要的提取的节区的特征值
.dynamic 动态链接信息
.dynsym 此节区包含了动态链接符号表
.got 此节区包含了全局偏移表