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; }