ELF文件结构之依赖共享库的查找

由于特殊的需求,必须要用C来实现一个轮子,通过解析文件结构来获得一个ELF文件的依赖库的名字,IDA可以做到,那么我们也一定可以做到。造了一个简单的轮子,感谢小花椒和母鸡的科普。

ELF文件有多个节组成,平时一般关注text、data、rodata、bss等,在linux下使用命令可以打出来。

这里主要关注两个节,dynstr和dynamic,它们与依赖库相关,配合010editor我们可以看一下。

dynstr存放的是常量字符串,没啥好说的,用\0来隔开的一堆字符串。

后者存放的是一堆叫Elf32_Dyn的结构体,在elf.h里有定义。

这些d_tag有种叫DT_NEEDE,表示依赖库的名字,使用Elf32_Addr作为offset,含义是在dynstr中的偏移。那么现在我们的目标已经比较明确,找到这两个section,挨个遍历,打印出字符串即可。

但是我们并不知道dynstr和dynamic的位置,需要借助ELF文件头里的信息来判断,是Elf32_Ehdr,在elf.h里有定义。

关注其中的e_shoff,代表section headers存放于文件的offset处;e_shnum代表section headers的个数;e_shstrndx,代表shstrtab位于section header list的第几项。

所以需要访问e_shoff位置的内容,这个地方存放的是Elf32_Shdr[e_shnum],在elf.h里有定义。

需要关注sh_name,表示该section的name位于shstrtab的偏移;sh_offset,表示section内容存放于文件的offset处。而shstrtab的位置我们是知道的,所以可以根据section headers的描述来找到dynstr和dynamic的偏移和大小。

到现在基本已经打通逻辑了,贴下代码(随手写的,很丑,见谅)。

  1. 解析文件头,拿到section headers的位置、个数和shstrtab的下标
  2. 遍历section headers,找到名字是dynstr和dynamic的section,记录其offset
  3. 遍历dynamic的每一项,若是DT_NEEDED,就打印dynstr对应位置的字符串

运行结果:

完结,撒花~~~

《ELF文件结构之依赖共享库的查找》有6个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*

code