2011-11-24 23 views
2

インポート名に奇妙なRVAを与えるWin32 NTヘッダーに問題があります。ここでは私の問題与えている、関連するコードです:インポートアドレステーブルが正しくインポートされません。インポート名が正しくないRVAが返されます。

//Get a pointer to the import table 
PIMAGE_IMPORT_DESCRIPTOR piidImportTableAddr; 
piidImportTableAddr = (PIMAGE_IMPORT_DESCRIPTOR)(pImgNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress + (DWORD)pMemFile); 

while(piidImportTableAddr->Name != 0) 
{ 
    //Itterate over every IMAGE_IMPORT_DESCRIPTOR structure, extracting the names of the DLLs to import 
    char* name = (char*)((DWORD)piidImportTableAddr->Name + (DWORD)pMemFile); 

    //Do nothing for now 

    piidImportTableAddr++; 
} 

しかし、piidImportTableAddr構造体のメンバーが悪いのポインタであるアドレスが含まれているが、ここではメンバーの表には、次のとおりです。

Characteristics 0x42746553 
OriginalFirstThunk 0x42746553 
TimeDateStamp 0x646f4d6b 
ForwarderChain 0x02260065 
Name 0x54746547 
FirstThunk 0x4d747865 

これらが全てです悪いRVAとメモリの場所。このメソッドでDLL名を調べるときに間違っていることがありますか?私はインポートテーブルのRVAとPEのLordに表示されているRVAを比較しています。それらは同じなので、なぜIMAGE_IMPORT_DESCRIPTORが間違っているのか分かりません。 http://pastebin.com/32MBEvWU

答えて

1

インポートテーブルのRVAがありますが、モジュールがロードされていないため、セクションはまだ物理的な位置にあります。インポートセクションの物理オフセットは、通常、RVAとは異なります。セクションヘッダー(_IMAGE_SECTION_HEADER)を反復処理し、VirtualAddressVirtualSizeの値を使用すると、インポートテーブルを含むセクションが見つかります。その後、そのセクションの物理アドレスをPointerToRawDataから取得します。

だから、あなたがしたい、実際のアドレスは、このようなものです:

importTableRVA - importSectionRVA + importSectionPhysicalAddress + pMemFile 
+0

申し訳ありません、それ以上説明できますか?私はあなたが言っていることの要約を理解していますが、私は "インポートテーブル"と "インポートセクション"の違いをよく理解していません。 – dymk

+0

@Dylan:PEファイルは、セクション、コード、データ、インポート、エクスポートなどのセクションが分かれています。通常、インポートセクションの名前は ".idata"です。しかし、ファイル内のセクションレイアウトはロードされたモジュールのレイアウトと同じではないので、アドレスを調整する必要があります。 http://msdn.microsoft.com/en-us/windows/hardware/gg463125 – Timo

+0

@Dylan:そしてわかりやすくするために、インポートセクションは通常、インポートテーブルとインポートテーブルを含んでいますアドレステーブルとその他のデータがあります。仕様は非常に魅力的なので、どのセクションにもほとんど何も含めることができません。 – Timo

1

あなたのコードは、あなたの意志IATを意味します(メモリにロードされた)、すでに仮想化されて、モジュールのthatsのIATを、検査している印象を与える:それは全体です。ここ

は、ソースコードへのリンクですRVAは含まれていませんが、アドレスはWindowsローダーによって必要な動的オフセットに調整されています。

しかし、LordPEによって報告されたデータは疑わしいものです。バイナリモジュールが実際に有効な場合(つまり、Windowsがロードして実行できる場合)、難読化されたファイルを処理している可能性があります。バイナリが壊れているか、win32 PEファイルではありません。

+0

ああ、私は検査していますモジュールは、メモリマップドファイルなどのプログラムにロードされ、そしてそれは、Windows PEで触れられていませんローダ。私がテストしているモジュールはnotepad.exeなので、難読化されていません。 – dymk

関連する問題