首页
社区
课程
招聘
[求助]帮我解惑,API挂接疑问
发表于: 2008-7-5 15:36 4145

[求助]帮我解惑,API挂接疑问

2008-7-5 15:36
4145
《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()函数吗?它的写入时复制机制吗?

请各位帮我解惑一下,多谢!

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 375
活跃值: (12)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
2
因为DLL已经注入到了目标进程空间了。
所以就使用伪句柄就可以了。
2008-7-5 22:05
0
雪    币: 115
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
疑问已经解决了。
原因是:加载钩子时,如果设置的是加载一个全局钩子,那么就会将DLL加载到所有的进程中去。
如果指定一个进程,则只加载到那一个进程中
2008-7-7 10:26
0
游客
登录 | 注册 方可回帖
返回
//