我们有一个程序,其中添加了一个名为.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二进制文件中的特定部分吗?
非常感谢任何帮助。
答案 0 :(得分:1)
您需要阅读章节标题(Elf64_Shdr
)以查找章节名称及其偏移量。相关信息位于sh_name
和sh_offset
字段中。因此,您需要将sh_name
与所需部分进行比较。在找到所需的部分后,您可以获得其偏移量(sh_offset
)及其大小sh_size
。现在,您可以轻松获取从sh_offset
到sh_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部分进行操作可能会影响程序的逻辑,如果它跳到不再存在的相对方向。