《Windows核心编程》中 22.9.2 通过操作模块的导入部分来实现API挂接中的疑问。下面是两个挂接的函数
void CAPIHook::ReplaceIATEntryInAllMods(PCSTR pszCalleeModName, PROC pfnOrig,
PROC pfnHook, BOOL fExcludeAPIHookMod)
{
HMODULE hmodThisMod = fExcludeAPIHookMod ? ModuleFromAddress(ReplaceIATEntryInAllMods) : NULL;
//
get the list of modules in this process
// 这里得到的是当前进程中的所有模块
CToolhelp th(TH32CS_SNAPMODULE, GetCurrentProcessId());
MODULEENTRY32 me = { sizeof(me) };
BOOL bOK = th.ModuleFirst(&me);
for (; bOK; bOK = th.ModuleNext(&me))
{
// NOTE: we don't hook function in our own module
if (me.hModule != hmodThisMod)
{
// Hook this function in this module
ReplaceIATEntryInOneMod(pszCalleeModName, pfnOrig, pfnHook, me.hModule);
}
}
}
/////////////////////////////////////////////////////////////////////////////////
void CAPIHook::ReplaceIATEntryInOneMod(PCSTR pszCalleeModName, PROC pfnOrig,
PROC pfnHook, HMODULE hmodCaller)
{
……
……
// the address match, change the import section address
// GetCurrentProcess(),怎么是当前进程的
// 这里是修改当前进程中某个模块中导入部分的一个函数地址
WriteProcessMemory(
GetCurrentProcess(), ppfn, &pfnHook, sizeof(pfnHook), NULL);
return; //we did it, get out
}
上面两个函数中挂接API,都是在操作当前进程中的模块,没有操作系统中其他进程中的模块。但程序运行的效果,已经挂接了其他进程的API
我想不明白,它是怎么修改其他进程中模块的导入部分的?
是WriteProcessMemory()函数吗?它的写入时复制机制吗?
请各位帮我解惑一下,多谢!
[课程]Linux pwn 探索篇!