Android PLTHook

132 阅读2分钟

plt hook

blog.csdn.net/spinchao/ar…

ELF 文件结构

ELF文件由4部分组成,分别是

  • ELF头(ELF header)、
  • 程序头表(Program header table)、
  • 节(Section)
  • 节头表(Section header table)

汇编器的链接视角与程序的执行视角

链接视图角度看和执行视角看 ELF 文件

image.png

执行视图

链接视图-可重定位目标文件:包含代码、数据、定位信息(指出哪些符号引用处需要重定位)等。可被链接合并,生成可执行文件或共享目标文件(.so文件)或静态链接库文件(.a文件)。

执行视图-可执行目标文件

image.png

翻译后

image.png

ELF文件各个部分解释:

  • ELF头:描述整个文件的组织,说明文件类型、大小、各个节区表的偏移地址

  • 程序头表(PHT):描述与程序执行直接相关的目标文件结构信息。用来在文件中定位各个段的映像。同时包含其他一些用来为程序创建映像所必须的信息

  • 节/段(SHT):sections主要给Linker用,从链接的角度来描述elf文件。segments主要给Loader用,从加载的角度来描述elf文件。

  • Linker需要关心.text, .rel.text, .data, .rodata等等,关键是Linker需要做 relocation。

  • 而Loader只需要知道Read/Write/Execute的属性,加载ELF文件时候,把多个sections组成segments来加载,所以一个segment包含若干个section。

  • 节区头表:描述 文件节区的信息,大小、偏移等

image.png

3. 重定位

系统是如何加载的 ELF 文件的?

  1. 读 ELF 的程序头部表,把所有 PT_LOAD 的节区 mmap 到内存中。
  2. 从“.dynamic”中读取各信息项,计算并保存所有节区的虚拟地址,然后执行重定位操作。
  3. 最后 ELF 加载成功,引用计数加一。

.dynamic 来修复 section

未完待续