モジュールのエクスポートテーブルを解析中にFowarder文字列を正規関数アドレスと区別できるように思えます。
もっと簡単な方法があるので、Forwarder文字列を知る前にこのForwarder文字列を解析することはお勧めしません。トリックは、エクスポートされた関数のアドレスがエクスポートセクションのメモリ範囲内にあるかどうかをチェックすることです。これは、PE/COFF仕様の「エクスポートアドレステーブル」セクションに記載されている公式の方法です。
申し訳ありませんが、下のサンプルコードはPythonではなくC言語で書かれていますが、それでもあなたには分かります。また、以下のチェックはPE32とPE64の画像にも適用されます。
エクスポートテーブルを解析するときに、IMAGE_DATA_DIRECTORYエクスポートのセクションへのポインタが既にあります。そこからIMAGE_EXPORT_DIRECTORYへのポインタを取得します。例えば。
IMAGE_DATA_DIRECTORY* pExportEntry = pOptHeader->DataDirectory->arDataDirectory + IMAGE_DIRECTORY_ENTRY_EXPORT;
...
//code to convert pExportEntry->VirtualAddress into file offset and store in dwExportTableFileOffset
...
IMAGE_EXPORT_DIRECTORY* pExportTable = (IMAGE_EXPORT_DIRECTORY*)(ImageFileBase + dwExportTableFileOffset);
あなたはpExportTable-> AddressOfFunctionsから関数の配列ポインタを取得したと仮定すると、以下の次のチェックは関係なく、関数が名前やoridinalによってエクスポートされているかどうかの動作します。ファンクション#iの関数アドレス(下のarFuncs [i]で示される)がエクスポートセクション(すでに解析中)にある場合、アドレスは<MODULE>という形式のフォワーダ文字列を指しています。 <ExportName>、それ以外の場合は通常の機能です。
if (arFuncs[i] >= pExportEntry->VirtualAddress && arFuncs[i] < pExportEntry->VirtualAddress+pExportEntry->Size)
{
//function address is RVA to Forwarder String; e.g. NTDLL.RtlDecodePointer
}
else
{
//function address is RVA to actual code within current module
}
ありがとうございました。私は手術の原則についてもっと学ぶ必要があると思う: ' – Vanz