Beispiel #1
0
// すべてのモジュールに対して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;
	}
}
Beispiel #2
0
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);
}
Beispiel #3
0
// すべてのモジュールに対して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);
}
Beispiel #4
0
// 新たにロードされた関数をフックする関数
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);
		}
	}
}
Beispiel #5
0
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;
		}
	}
}
Beispiel #6
0
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);
      }
   }
}
Beispiel #7
0
// すべてのモジュールに対して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);
}