如何在C++中找到ELF二进制文件所需的动态库?

Joh*_*ith 6 c++ linux binary decompiling elf

如何使用C++获取linux中elf二进制文件所需的所有动态库列表?

一旦我设法从二进制文件中提取信息(文件名?),我可以通过搜索找到实际文件PATH,但我无法找到有关从ELF二进制文件中提取未编码信息的任何信息.

思考?

Igo*_*sky 8

所需的共享对象列表存储在可执行文件的所谓动态部分中.获取必要信息的粗略算法将是这样的:

  1. 解析ELF头,检查该文件是否为动态可执行文件(ET_EXECET_DYN).
  2. 获取程序头(e_phoff/e_phnum/e_phentsize)的偏移量和计数,检查它们是否为非零且有效.
  3. 解析程序头,寻找PT_DYNAMIC一个.还要记住段的虚拟地址 - >文件偏移映射PT_LOAD.
  4. 找到后,解析动态部分.寻找DT_NEEDEDDT_STRTAB条目.

条目的d_val字段DT_NEEDEDDT_STRTAB字符串表的偏移量,它将是所需库的SONAME.请注意,由于DT_STRTABentry是运行时地址而不是字符串表的偏移量,因此您需要使用步骤3中存储的信息将其映射回文件偏移量.

  • AFAIK大多数人在他们的*程序*中不需要它,所以他们依靠`readelf`,`objdump`或`ldd`来编写脚本.对于程序化访问,这里的`libelf`但是它没有为这个特定任务提供现成的API - 你仍然需要手动解析动态部分. (3认同)

小智 5

你可以调用"readelf -d"程序并解析输出:

readelf -d /usr/bin/readelf | grep NEEDED
 0x0000000000000001 (NEEDED)             Shared library: [libz.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
Run Code Online (Sandbox Code Playgroud)