私がIDAで分析したPEファイルには.rdata
セクションだけでなく.idata
。違いは何ですか?
.rdata
はconstデータ用です。これは、.dataセグメントの読み取り専用バージョンです。
.idata
はインポートディレクトリ(エクスポートの場合は.edata)を保持します。これは、インポートおよびエクスポートされた関数を指定するために、EXEおよびDLLによって使用されます。詳細については、PE形式の仕様( http://msdn.Microsoft.com/library/windows/hardware/gg463125 )を参照してください。
一般的なセグメント名の要約:
.text: Code
.data: Initialized data
.bss: Uninitialized data
.rdata: Const/read-only (and initialized) data
.edata: Export descriptors
.idata: Import descriptors
.reloc: Relocation table (for code instructions with absolute addressing when
the module could not be loaded at its preferred base address)
.rsrc: Resources (icon, bitmap, dialog, ...)
.tls: __declspec(thread) data (Fails with dynamically loaded DLLs -> hard to find bugs)
Martin Rosenauが述べているように、セグメント名は典型的なものにすぎません。真のセグメントタイプは、セグメントヘッダーで指定されるか、セグメントに格納されたデータの使用によって定義されます。
実際、セグメント名はWindowsでは無視されます。
異なるセグメント名を使用するリンカーがあり、個別のセグメントを使用する代わりに、インポート記述子、エクスポート記述子、リソースなどを「.text」セグメントに格納することも可能です。
ただし、そのようなメタデータ用に個別のセクションを作成する方が簡単なようで、ほとんどのリンカーは個別のセクションを使用します。
つまり、セクション「.idata」、「。rdata」、「。rsrc」、... do notにはプログラムデータが含まれます(ただし、その名前は「data」で終わります)が、メタ情報が含まれています。オペレーティングシステムによって使用されます。たとえば、「。rsrc」セクションには、エクスプローラーで実行可能ファイルを表示したときに表示されるアイコンに関する情報が含まれています。
「.idata」には、プログラムに必要なすべてのDLLファイルに関する情報が含まれています。