// すべてのモジュールに対してAPIフックを行う関数 bool ReplaceIATEntryInAllMods( PCSTR pszModuleName, PROC pfnCurrent, PROC pfnNew, HMODULE hmodCaller) { if( hmodCaller ) { return ReplaceIATEntryInOneMod(pszModuleName, pfnCurrent, pfnNew, hmodCaller); } else { bool bResult = false; // モジュールリストを取得 HANDLE hModuleSnap = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, GetCurrentProcessId()); if(hModuleSnap == INVALID_HANDLE_VALUE) { return bResult; } MODULEENTRY32 me; me.dwSize = sizeof(me); BOOL bModuleResult = Module32First(hModuleSnap, &me); // それぞれのモジュールに対してReplaceIATEntryInOneModを実行 while(bModuleResult) { // OutputDebugString(">>"); // OutputDebugString(me.szModule); // OutputDebugString("\n"); if( ReplaceIATEntryInOneMod(pszModuleName, pfnCurrent, pfnNew, me.hModule) ) { bResult = true; } bModuleResult = Module32Next(hModuleSnap, &me); } CloseHandle(hModuleSnap); return bResult; } }
void CAPIHook::ReplaceIATEntryInAllMods(LPSTR pszExportMod, PROC pfnCurrent, PROC pfnNew, BOOL bExcludeAPIHookMod) { // 取得当前模块的句柄 HMODULE hModThis = NULL; if (bExcludeAPIHookMod) { MEMORY_BASIC_INFORMATION mbi; if (::VirtualQuery(ReplaceIATEntryInAllMods, &mbi, sizeof(mbi)) != 0) hModThis = (HMODULE)mbi.AllocationBase; } // 取得本进程的模块列表 HANDLE hSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ::GetCurrentProcessId()); // 遍历所有模块,分别对它们调用ReplaceIATEntryInOneMod函数,修改导入地址表 MODULEENTRY32 me = { sizeof(MODULEENTRY32) }; BOOL bOK = ::Module32First(hSnap, &me); while (bOK) { // 注意:我们不HOOK当前模块的函数 if (me.hModule != hModThis) ReplaceIATEntryInOneMod(pszExportMod, pfnCurrent, pfnNew, me.hModule); bOK = ::Module32Next(hSnap, &me); } ::CloseHandle(hSnap); }
// すべてのモジュールに対してAPIフックを行う関数 void CAPIHook::ReplaceIATEntryInAllMods( PCSTR pszModuleName, PROC pfnCurrent, PROC pfnNew) { // 自分自身(API_Hook_Lib.dll)のモジュールハンドルを取得 MEMORY_BASIC_INFORMATION mbi; if(VirtualQuery(ReplaceIATEntryInAllMods, &mbi, sizeof(mbi)) == 0) return; HMODULE hModThisMod = (HMODULE) mbi.AllocationBase; // モジュールリストを取得 HANDLE hModuleSnap = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, GetCurrentProcessId()); if(hModuleSnap == INVALID_HANDLE_VALUE) return; MODULEENTRY32 me; me.dwSize = sizeof(me); BOOL bModuleResult = Module32First(hModuleSnap, &me); // それぞれのモジュールに対してReplaceIATEntryInOneModを実行 // ただし自分自身(API_Hook_Lib.dll)には行わない while(bModuleResult) { if(me.hModule != hModThisMod) ReplaceIATEntryInOneMod(pszModuleName, pfnCurrent, pfnNew, me.hModule); bModuleResult = Module32Next(hModuleSnap, &me); } CloseHandle(hModuleSnap); }
// 新たにロードされた関数をフックする関数 void CAPIHook::FixupNewlyLoadedModule(HMODULE hMod, DWORD dwFlags) { if ((hMod != NULL) && ((dwFlags & LOAD_LIBRARY_AS_DATAFILE) == 0)) { for (CAPIHook *p = sm_pHead; p != NULL; p = p->m_pNext) { ReplaceIATEntryInOneMod( p->m_pszModuleName, p->m_pfnOrig, p->m_pfnHook, hMod); } } }
void WINAPI CAPIHook::HookNewlyLoadedModule(HMODULE hModule, DWORD dwFlags) { //// 如果一个新的模块被加载,挂钩各CAPIHook对象要求的API函数 if ((hModule != NULL) && ((dwFlags&LOAD_LIBRARY_AS_DATAFILE) == 0)) { CAPIHook *p = sm_pHeader; while (p != NULL) { ReplaceIATEntryInOneMod(p->m_pszModName, p->m_pfnOrig, p->m_pfnHook, hModule); p = p->m_pNext; } } }
void CAPIHook::ReplaceIATEntryInAllMods(PCSTR pszCalleeModName, PROC pfnCurrent, PROC pfnNew) { HMODULE hmodThisMod = ExcludeAPIHookMod ? ModuleFromAddress(ReplaceIATEntryInAllMods) : NULL; // Get the list of modules in this process CToolhelp th(TH32CS_SNAPMODULE, GetCurrentProcessId()); MODULEENTRY32 me = { sizeof(me) }; for (BOOL bOk = th.ModuleFirst(&me); bOk; bOk = th.ModuleNext(&me)) { // NOTE: We don't hook functions in our own module if (me.hModule != hmodThisMod) { // Hook this function in this module ReplaceIATEntryInOneMod( pszCalleeModName, pfnCurrent, pfnNew, me.hModule); } } }
// すべてのモジュールに対してAPIフックを行う関数 void ReplaceIATEntryInAllMods( PCSTR pszModuleName, PROC pfnCurrent, PROC pfnNew) { // モジュールリストを取得 HANDLE hModuleSnap = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, GetCurrentProcessId()); if(hModuleSnap == INVALID_HANDLE_VALUE) return; MODULEENTRY32 me; me.dwSize = sizeof(me); BOOL bModuleResult = Module32First(hModuleSnap, &me); // それぞれのモジュールに対してReplaceIATEntryInOneModを実行 while(bModuleResult) { ReplaceIATEntryInOneMod(pszModuleName, pfnCurrent, pfnNew, me.hModule); bModuleResult = Module32Next(hModuleSnap, &me); } CloseHandle(hModuleSnap); }