访问ELF中的特定部分

时间:2015-10-15 03:02:28

标签: c++ c linux elf

我们有一个程序,其中添加了一个名为.proghead的部分。

我可以使用以下命令

来读取elf .proghead部分数据
$ readelf -x .proghead  elf-binary-file

Hex dump of section '.proghead':
  0x0058b960 00112233 00000000 00010000 00000000 .."3............
  0x0058b970 15200704 00000000 00016904 00000000 . ........i.....

现在我必须使用C / C ++程序访问此部分。

有人可以帮我编写C / C ++代码来阅读elf二进制文件中的特定部分吗?

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

您需要阅读章节标题(Elf64_Shdr)以查找章节名称及其偏移量。相关信息位于sh_namesh_offset字段中。因此,您需要将sh_name与所需部分进行比较。在找到所需的部分后,您可以获得其偏移量(sh_offset)及其大小sh_size。现在,您可以轻松获取从sh_offsetsh_offset+sh_offset+sh_size的循环数据。这在理论上是正确的,希望您能获得所需部分的数据。如需进一步的帮助,请查看以下链接Get elf sections offsets How to get a pointer to an specific section of a program from within itself? (Maybe with libelf)

答案 1 :(得分:0)

通常,修改链接器命令文件以为.proghead部分的第一个地址指定名称。

然后,在C文件中编写一个结构来覆盖.proghead部分的内容。

然后设置上述结构类型的C指针变量,指向.proghead部分。

从那时起,指针 - > fieldName将访问结构中的每个字段,即.proghead部分

答案 2 :(得分:0)

您可以使用 binutils 包中的objcopy命令将二进制文件的一部分复制到文本文件中:

$ objcopy -O binary --only-section=<section> <binary> <output>

所以在你的情况下:

$ objcopy -O binary --only-section=.proghead elf-binary-file output.proghead

之后,您可以简单地编写一个读取二进制文件的C ++程序。只要您需要做的就是阅读该部分而不是修改二进制文件,这种方法就可以正常工作。

如果您需要修改二进制文件,则需要开始阅读 size 字节的 size 部分的偏移部分。可以使用readelf来了解某个部分的偏移量及其大小:

$ readelf --wide -S /bin/ls
There are 28 section headers, starting at offset 0x1c760:
Section Headers:
  [Nr] Name               Type     Address          Off    Size   ES Flg Lk Inf Al
  [ 0]                    NULL     0000000000000000 000000 000000 00      0   0  0
  [ 1] .interp            PROGBITS 0000000000400238 000238 00001c 00   A  0   0  1
  [ 2] .note.ABI-tag      NOTE     0000000000400254 000254 000020 00   A  0   0  4
  [ 3] .note.gnu.build-id NOTE     0000000000400274 000274 000024 00   A  0   0  4
  [ 4] .gnu.hash          GNU_HASH 0000000000400298 000298 000068 00   A  5   0  8
  [ 5] .dynsym            DYNSYM   0000000000400300 000300 000c18 18   A  6   1  8
  [ 6] .dynstr            STRTAB   0000000000400f18 000f18 000593 00   A  0   0  1

但是,请记住,只要没有添加新数据或删除数据,直接修改二进制文件就可以了。添加新数据会增加一个部分,导致其他部分的覆盖数据和组织索引的混乱。缩小一个部分并填充填充可能没问题,但是例如,在.text部分进行操作可能会影响程序的逻辑,如果它跳到不再存在的相对方向。