3

バイナリの文字列テーブルを読み取るプログラムを書きたい。BinaryはREDHATlinux32で実行されているELFにあります。私は次のことを行いました-

  1. エルフヘッダーを読む
  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で終了する文字列を実際に含む文字列テーブルへのインデックスであることを理解しています。このnullで終了する文字列を表示したいと思います。ここに質問があります-

  1. 上記の出力では、sh_type = 3(SHT_STRTAB)を持つセクションヘッダーのエントリが複数あることがわかります。だから私はどのようにインデックス(Elf32_Shdrのsh_name)をどのセクションにマップするのか分かりませんか?

sh_type = 3のセクションのElf32_Shdrを出力すると、次の出力が得られます-

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
--------------------------------------------------------------
4

2 に答える 2

9

私は自分で答えを見つけることができました:)。コーディングにはかなりの時間がかかりましたが。誰かが将来のためにそれを参照したい場合、これがどのように行われるかです-各バイナリには通常3つの文字列テーブルが含まれています-

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

上記の質問では、展開されたときに-Section HeaderSTRingTABleを表す.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.
于 2012-05-18T15:08:34.570 に答える
2

簡単に言うと、e_shstrndxELF実行可能ヘッダーのフィールドには、セクション名を保持するELF文字列テーブルのインデックスが含まれています。

libelfbyExample」チュートリアルには、ELF(3)APIの関数を使用してセクション名を取得する方法を示すサンプルコードとともに、より長い説明があります。

于 2012-05-18T14:55:06.603 に答える