インポートしている関数を表示(C言語)

説明:

user32.dllが(非遅延)インポートしている関数のリストを表示する。

キーワード:

ImageDirectoryEntryToData

サンプルコード:

void DispImportFuncs(void)
{
	DWORD BaseAddress;
	ULONG Size;
	PIMAGE_IMPORT_DESCRIPTOR pImportDescriptor;
	PIMAGE_THUNK_DATA pThunkData;
	PIMAGE_IMPORT_BY_NAME pImportByName;

	/* user32.dllを読み込み */
	BaseAddress = (DWORD)LoadLibrary("user32.dll");

	/* インポートディレクトリを取得 */
	pImportDescriptor = ImageDirectoryEntryToData(
		(LPVOID)BaseAddress, 
		TRUE, 
		IMAGE_DIRECTORY_ENTRY_IMPORT, 
		&Size);

	/* 各インポート関数名を表示 */
	while(pImportDescriptor->OriginalFirstThunk != 0) {
		printf("DLL名: %s\n", BaseAddress + pImportDescriptor->Name);

		pThunkData = (PIMAGE_THUNK_DATA)(BaseAddress + pImportDescriptor->OriginalFirstThunk);

		while(pThunkData->u1.Ordinal != 0) {
			if(IMAGE_SNAP_BY_ORDINAL(pThunkData->u1.Ordinal)) {
				printf("\t序数: %d\n", IMAGE_ORDINAL(pThunkData->u1.Ordinal));
			} else {
				pImportByName = (PIMAGE_IMPORT_BY_NAME)(BaseAddress + (DWORD)pThunkData->u1.AddressOfData);
				printf("\tヒント: %d, 関数名: %s\n", pImportByName->Hint, pImportByName->Name);
			}

			pThunkData++;
		}

		printf("\n");
		pImportDescriptor++;
	}

	/* 後処理 */
	FreeLibrary((HMODULE)BaseAddress);
}
(original text:2000/03/22 更新)

本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。