15,473
社区成员




void CApiHook::FixupNewlyLoadedModule(PCSTR pszModPath, HMODULE hmod, DWORD dwFlags)
{
if ((hmod != NULL) &&
(hmod != ModuleFromAddress(FixupNewlyLoadedModule)) &&
((dwFlags & LOAD_LIBRARY_AS_DATAFILE) == 0) &&
((dwFlags & LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE) == 0) &&
((dwFlags & LOAD_LIBRARY_AS_IMAGE_RESOURCE) == 0)
)
{
for (CApiHook* p = sm_pHead; p != NULL; p = p->m_pNext)
{
// 如果某个对象的原函数地址为NULL,可能是延迟加载等原因导致原来DLL不在内存中而引起的
// 因此在这里根据模块名获得函数现在的地址
if (p->m_pfnOrig == NULL)
{
// OutputDebugStringW(L"p->m_pfnOrig == NULL : m_pszCalleeModName,pszModPath\n");
OutputDebugStringA(p->m_pszCalleeModName);
OutputDebugStringA(pszModPath);
if (lstrcmpiA(p->m_pszCalleeModName, pszModPath) == 0)
{
p->m_hMod = hmod;
p->m_pfnOrig = p->GetProcAddressRaw(hmod, p->m_pszFuncName);
}
}
if (p->m_pfnOrig != NULL)
{
ReplaceIATEntryInAllMods(p->m_pszCalleeModName, p->m_pfnOrig, p->m_pfnHook);
}
}
}
}
FARPROC WINAPI CApiHook::GetProcAddress_Hook(HMODULE hmod, PCSTR pszProcName)
{ OutputDebugStringA("GetProcAddress_Hook : ");
OutputDebugStringA(pszProcName ? pszProcName : "error pszProcName");
OutputDebugStringA("\n");
FARPROC pfn = GetProcAddressRaw(hmod, pszProcName);
return pfn;
CApiHook * p = sm_pHead;
for (; (pfn != NULL) && (p != NULL); p = p->m_pNext)
{
if (pfn == p->m_pfnOrig)
{
pfn = p->m_pfnHook;
break;
}
}
return pfn;
}