龙空技术网

ELF格式详解 (二)

深思数盾加密锁 101

前言:

目前大家对“elf加密解密”大体比较注意,大家都想要剖析一些“elf加密解密”的相关资讯。那么小编在网上汇集了一些关于“elf加密解密””的相关知识,希望姐妹们能喜欢,姐妹们一起来了解一下吧!

节与静态链接

常规的 ELF 文件,ET_REL, ET_DYN 以及 ET_EXEC 类型都含有节,对于 ET_REL 类型 的ELF文件,节是必须存在的,而对于 ET_DYN 和 ET_EXEC 是可以没有节的,但由于Linux系统的版本碎片化比较严重,可执行文件也可能要求含有节,否则无法执行(如安卓后期版本的系统),这依赖于系统动态链接器的实现。

ET_REL 类型的 ELF,节中包含了一些符号定义、节属性(可读可写可执行)。通过 readelf 工具可以方便查看这些信息:

以上readelf 对一个 .o 文件 (ET_REL类型) 的输出,其中 .text 段中存放可执行的代码,.data 中存放数据(如全局变量,静态变量等),.rodata 存放了常量数据(如字符串等),.bss 中存放未初始化或初始化为零的数据,本节将介绍这些细节。

节表

节表是节头(Section Header)数组,位置和个数由 Elf_Ehdr 的 e_shoff 和 e_shnum 指定。

节头包含了节名称,节属性,文件偏移等内容,定义如下:

sh_name

节名称,这是一个节字符串表的偏移,节字符串的索引在 Elf_Ehdr 的 e_shstrndx 中指定。

sh_type

节类型,以下为 ET_REL 常见的节类型定义:

sh_flags

节的标志位可以组合,描述了节的属性,定义如下:

sh_addr

节的虚拟地址,对于 ET_REL 一般都为0。

sh_offset

节的文件偏移。

sh_size

节的大小。

sh_link

关联到其它节(不同节代表不同的意义,后面会有介绍)。

sh_info

附加的节信息(不同节代表不同的意义,后面会有介绍)。

sh_addralign

地址对齐。

sh_entsize

如果节内容是特定元素的数组,该值代表了元素大小,如对于 SHT_SYMTAB,该址为的大小为sizeof(Elf_Sym)。

各个节类型的 sh_info 与 sh_link 的意义如下:

符号节与字符串节

符号节分静态符号节(ST_SYMTAB)与动态符号节(SHT_DYNSYM),可以通过枚举节表得到。每种符号节在一个 ELF 文件中只存在一个,动态符号节只在 ET_EXEC 和 ET_DYN 类型的 ELF 中存在,不会在 ET_REL 类型的 ELF 中出现。

符号节中包含了 Elf_Sym 类型的符号表,Elf_Sym 的定义如下:

32位定义:

64位定义:

st_name

符号名,该值为符号节所关联的字符串节的字符串索引。

st_info

符号信息,描述了符号类型与符号绑定信息。

符号类型可以通过 ELF_ST_TYPE(st_info) 获取,符号类型的定义如下:

符号绑定可以通过 ELF_ST_BIND(st_info) 获取,符号绑定的定义如下:

st_other

描述了符号的可见性,定义如下:

STV_INTERNAL 和 STV_PROTECTED 是很少见的(至少笔者没有见过),对于SO库(ET_DYN)来说,符号是否导出,不是通过遍历符号表,而是通过查找哈希表,再检查符号类型,后续章节会介绍哈希表。

st_shndx

符号所在节的节索引,还有一些特殊定义:

st_value

符号的地址

st_size

符号大小

标签: #elf加密解密