0

DLLまたはexeを使用してディレクトリとヘッダーに関する情報を抽出するC/C++PE解析ライブラリをプログラミングしています。私の問題は、エクスポートアドレスを抽出して関数のアドレスを取得するときに、そのアドレスを使用して、エクスポートされたエクスポート関数の数を含む配列を指す方法がわかりません。

DWORD ExportRVA = PEHeader->optional.data_directory[0].virtual_address;
image_export_directory* Exports = (image_export_directory*)(RVAToOffset(ExportRVA)+BaseAddress);

ExportTable.nNames = Exports->number_of_names;
ExportTable.nFunctions = Exports->number_of_functions;
ExportTable.pFunctions = Exports->address_of_functions;
ExportTable.nNames = Exports->address_of_names;
ExportTable.pNamesOrdinals = Exports->address_of_name_ordinals;

次のような配列にポインタを割り当てる必要がありますか?

DWORD * AddrFunctions;

ポインタアドレスを変更しますか?

4

1 に答える 1

1

およびフィールドはaddress_of_functionsaddress_of_namesそれぞれ実際の関数エントリポイントおよび名前に対するRVAの配列に対するRVAですが、address_of_name_ordinalsフィールドはWORD値の配列に対するRVAです。例:

#define RVAToPtr(RVA) ( ((LPBYTE)BaseAddress) + ((DWORD)(RVA)) )

image_export_directory* Exports = (image_export_directory*) RVAToPtr(PEHeader->optional.data_directory[0].virtual_address); 

ExportTable.nFunctions = Exports->number_of_functions; 
ExportTable.nNames = Exports->number_of_names; 
ExportTable.pFunctions = (PDWORD) RVAToPtr(Exports->address_of_functions); 
ExportTable.pNames = (PDWORD) RVAToPtr(Exports->address_of_names); 
ExportTable.pNamesOrdinals = (PWORD) RVAToPtr(Exports->address_of_name_ordinals); 

for (DWORD i = 0; i < ExportTable.nFunctions; ++i)
{
    void *FuncPtr = (void*) RVAToPtr(ExportTable.pFunctions[i]);
    char* FuncName = (char*) RVAToPtr(ExportTable.pNames[i]);
    WORD FuncOrdinal = ExportTable.Base + ExportTable.pNamesOrdinals[i]; 
    ...
}

詳細については、 MSDNを参照してください。

于 2012-09-26T01:52:28.660 に答える