Win32API インポートアドレステーブルに書かれているモジュール名を取得する

インポートアドレステーブル(IAT)に書かれているモジュール名を取得し、表示する。

#include <windows.h>
#include <tchar.h>
#include <dbghelp.h>
#include <string>

#pragma comment(lib, "dbghelp.lib")

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
	UNREFERENCED_PARAMETER(hPrevInstance);
	UNREFERENCED_PARAMETER(lpCmdLine);

	ULONG ulSize;

	//.idataセクションの先頭のIMAGE_IMPORT_DESCRIPTOR構造体
	PIMAGE_IMPORT_DESCRIPTOR pImportDesc;

	//自分自身のモジュールハンドル
	HMODULE hmodCaller;

	//自分自身の実行ファイル名
	TCHAR szMyExecuteName[MAX_PATH];

	GetModuleFileName(NULL, szMyExecuteName, 
		sizeof(szMyExecuteName)/sizeof(szMyExecuteName[0]));

	//自分自身のモジュールハンドルを取得
	hmodCaller = ::GetModuleHandleW(szMyExecuteName);
	
	//IMAGE_IMPORT_DESCRIPTOR構造体へのポインタを取得
	pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)
				ImageDirectoryEntryToData(hmodCaller, 
							TRUE, 
							IMAGE_DIRECTORY_ENTRY_IMPORT, 
							&ulSize);

	std::string dllnames;
	while (pImportDesc->Name) {
		//pszDllName(DLL名) = ImageBase + Name(DLL名を示すRVA);
		PSTR pszDllName = (PSTR)((PBYTE)hmodCaller + pImportDesc->Name);
		dllnames += pszDllName;
		dllnames += '\n';
		pImportDesc++;//次のIMAGE_IMPORT_DESCRIPTORへ
	}

	MessageBoxA(GetActiveWindow(), 
		dllnames.c_str(), "Imported DLL", MB_OK);

	return 0;
}



  • 実行結果