Это потому, что оригинальный CAPIHook не заменяет локальный IAT (в вашем случае проект DLL, который содержит двоичные файлы для CAPIHook).
Причина этого состояла в том, чтобы защитить себя от бесконечной рекурсии, которая приводит к stackoverflow (который пользователи также опубликуют в SO: D).
Чтобы гарантировать, что все последующие загруженные модули будут импортировать «правильную» функцию,
поиск CAPIHook и перенаправление LoadLibrary и GetProcAddress после строительства.
Однако эти функции используются и самим CAPIHook, поэтому замена локального IAT на прокси-функцию (CAPIHook :: LoadLibrary или CAPIHook :: GetProcAddress) вызовет бесконечную рекурсию, поскольку прокси-серверы непреднамеренно вызывали себя при попытке вызвать API-интерфейс ОС!
Один из способов решить эту проблему - изменить CAPIHook, чтобы проверить, можно ли заменить локальный IAT.
1.) Новый атрибут m_bIncludeLocalIAT добавлен в CAPIHook, а ctor / dtor изменены соответствующим образом.
class CAPIHook
{
...
CAPIHook(PSTR pszCalleeModName, PSTR pszFuncName,
PROC pfnHook, BOOL bIncludeLocalIAT = TRUE);
...
BOOL m_bIncludeLocalIAT;
...
};
CAPIHook::CAPIHook( PSTR pszCalleeModName, PSTR pszFuncName,
PROC pfnHook, BOOL bIncludeLocalIAT) {
...
m_bIncludeLocalIAT = bIncludeLocalIAT;
...
ReplaceIATEntryInAllMods(m_pszCalleeModName, m_pfnOrig, m_pfnHook, m_bIncludeLocalIAT);
}
CAPIHook::~CAPIHook() {
ReplaceIATEntryInAllMods(m_pszCalleeModName, m_pfnHook, m_pfnOrig, m_bIncludeLocalIAT);
...
}
2.) В статическую функцию добавлен новый параметр CAPIHook :: ReplaceIATEntryInAllMods .
static void WINAPI ReplaceIATEntryInAllMods(PCSTR pszCalleeModName,
PROC pfnOrig, PROC pfnHook, BOOL bReplaceLocalIAT){
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)) {
if (bReplaceLocalIAT || (me.hModule != hmodThisMod)) {
// Hook this function in this module
ReplaceIATEntryInOneMod(
pszCalleeModName, pfnCurrent, pfnNew, me.hModule);
}
}
}
3.) Обновление статических экземпляров CAPIHook
CAPIHook CAPIHook::sm_LoadLibraryA ("Kernel32.dll", "LoadLibraryA",
(PROC) CAPIHook::LoadLibraryA, FALSE);
CAPIHook CAPIHook::sm_LoadLibraryW ("Kernel32.dll", "LoadLibraryW",
(PROC) CAPIHook::LoadLibraryW, FALSE);
CAPIHook CAPIHook::sm_LoadLibraryExA("Kernel32.dll", "LoadLibraryExA",
(PROC) CAPIHook::LoadLibraryExA, FALSE);
CAPIHook CAPIHook::sm_LoadLibraryExW("Kernel32.dll", "LoadLibraryExW",
(PROC) CAPIHook::LoadLibraryExW, FALSE);
CAPIHook CAPIHook::sm_GetProcAddress("Kernel32.dll", "GetProcAddress",
(PROC) CAPIHook::GetProcAddress, FALSE);