从C对Linux的阅读ELF字符串表(Reading ELF String Table on Lin

2019-09-17 06:41发布

我想编写一个程序,读取二进制文件的字符串表。 二是在RedHat Linux 32.我做了以下运行ELF -

  1. 阅读ELF头
  2. 阅读所有部分

下面是我的编程'的输出。

Entry Address of Binary - 0x8048340
Start of Program Header - 52
Start of section header - 3272
Size of header - 52
Number of section headers - 36
Size of each section headers - 40
Number of section headers - 36
Section header Offset - 3272
string tbl index for section[0] is 0
string tbl index for section[1] is 27
string tbl index for section[7] is 35
string tbl index for section[1879048182] is 49
string tbl index for section[11] is 59
string tbl index for section[3] is 67
string tbl index for section[1879048191] is 75
string tbl index for section[1879048190] is 88
string tbl index for section[9] is 103
string tbl index for section[9] is 112
string tbl index for section[1] is 121
string tbl index for section[1] is 116
string tbl index for section[1] is 127
string tbl index for section[1] is 133
string tbl index for section[1] is 139
string tbl index for section[1] is 147
string tbl index for section[1] is 157
string tbl index for section[1] is 164
string tbl index for section[1] is 171
string tbl index for section[6] is 176
string tbl index for section[1] is 185
string tbl index for section[1] is 190
string tbl index for section[1] is 199
string tbl index for section[8] is 205
string tbl index for section[1] is 210
string tbl index for section[1] is 219
string tbl index for section[1] is 234
string tbl index for section[1] is 250
string tbl index for section[1] is 262
string tbl index for section[1] is 276
string tbl index for section[1] is 288
string tbl index for section[1] is 301
string tbl index for section[1] is 312
string tbl index for section[3] is 17
string tbl index for section[2] is 1
string tbl index for section[3] is 9

我明白在这个Elf32_Shdr是sh_name基本上是一个索引字符串表实际上包含NULL结尾的字符串。 我想显示此空结束的字符串。 我有一个问题在这里 -

  1. 在上面的输出,可以看出,有对于具有sh_type = 3(SHT_STRTAB)节头的多个条目。 所以,我不明白我怎么映射指数(以个Elf32_Shdr sh_name)哪个部分?

一旦打印个Elf32_Shdr对于具有sh_type = 3 I得到以下输出部分 -

Section header Offset - 3272
sh_name - 67
sh_type - 3
sh_flags - 2
sh_addr - 80481e8
sh_offset - 488
sh_size - 94
sh_link - 0
sh_info - 0
sh_addralign - 1
sh_entsize - 0
--------------------------------------------------------------
sh_name - 17
sh_type - 3
sh_flags - 0
sh_addr - 0
sh_offset - 2948
sh_size - 323
sh_link - 0
sh_info - 0
sh_addralign - 1
sh_entsize - 0
--------------------------------------------------------------
sh_name - 9
sh_type - 3
sh_flags - 0
sh_addr - 0
sh_offset - 6008
sh_size - 664
sh_link - 0
sh_info - 0
sh_addralign - 1
sh_entsize - 0
--------------------------------------------------------------

Answer 1:

我能找到自己的答案:)。 虽然花了很多时间来代码。 下面是它是如何,如果有人想要引用它为未来做 - 每个二进制通常包含三个字符串表 -

1. .dynstr
2. .shstrtab
3. .strtab

在以上的问题,我们关心的是.shstrtab其展开时代表 - 节头字符串表。 在阅读ELF头,我们发现中的以下ELF头 - e_shstrndx。 这是我们可以找到.shstrtab索引。 下面的公式可用于计算将如何做 -

offset = ((elfHdr.e_shstrndx)*elfHdr.e_shentsize)+elfHdr.e_shoff

每个参数的意义 -

elfHdr.e_shstrndx = index where we can find .shstrtab
elfHdr.e_shentsize = Size of each Section Header
elfHdr.e_shoff = Offset at which section header starts.


Answer 2:

总之, e_shstrndx ELF可执行文件头的字段包含ELF字符串表保持部名称索引。

所述“ libelf的通过实施例 ”教程具有更长的说明中,与示出了如何使用ELF(3)API中的函数来检索的节名示例代码一起。



文章来源: Reading ELF String Table on Linux from C
标签: elf ptrace