1

ELF ファイルを取得し、そのセクションの名前を印刷する必要があるという宿題を受け取りました。

ELF ヘッダーから直接受け取ったデータのみを使用してすべてを行うことになっています。つまり、「高レベル」の手順を使用することはできません。必要なデータに直接移動する必要があります。

だから、私は最初のセクションの名前を印刷しようとしています。名前が文字列テーブルにあるはずだと知っています。これは私がこれまでに持っているものです:

を使用してELFファイルの開始を取得していますmmap...

elfhead =(Elf32_Ehdr *) mmap...

ELFヘッダーのメンバーを使用してセクションオフセットを取得しています

sectionoffset = elfhead->e_shoff

それから

section = (Elf32_Shdr*)(elfhead + sectionoffset)
nameoffset = section->sh_name    
stringoffset = elfhead->e_shstrndx;

明確にするために-

  • elfhead私はエルフヘッダーを持っています
  • セクションにセクションヘッダーがあります
  • stringoffset文字列テーブルがあるはずのセクションテーブル内にインデックスがあります
  • 最初のセクション名があると思われる文字列テーブルにnameoffsetインデックスがあります。

上記のコードが与えられた場合、ファーストネームに移動して印刷するにはどうすればよいですか?

4

1 に答える 1

1

最初に、セクションの文字列テーブルにアクセスする必要があります。ヘッダーは ELF ファイルの最初のものであるため、次のようになります。

char* stringTable = elfhead + (section + header->stringoffset)->sh_offset;

それができたらあとは、あとはnameoffsetすでに入手したものを使って最初の 1 枚を印刷するだけです。

char* name = stringTable + nameoffset;
printf("%s\n",name);

参考までに、残りの名前を出力するのは単純なループです。

for(i=0;i<header->e_shnum;i++){
        char* name = stringTable + nameoffset;
        printf("%s\n",name);
        section++;
    }
于 2012-06-02T18:38:01.140 に答える