如果你看msdn中的setwindowshookex函数说明,你会发现,ms告诉你如果你想
hook全局数据,你必须把hook代码写在dll中,如果你的hook代码在.exe中,
则你只能hook本进程的数据.
你想过这是为什么吗?
win32抛弃了win16的全局内存的概念,每个进程有自己独立的内存空间,
并且不受其他进程影响.这样一来所有代码都只能访问局部资源,但很显然有些
应用必须是全局的,比如你的hook,所以ms必须提供一种折衷的安全的方法.好
在windows中的dll正好可以解决这个问题.
dll是一种代码摸块,它可以被映射进不同的进程空间,具体方法就不多谈了,如果
你有兴趣我们以后讨论.
基于以上原因,ms要求我们把全局hook放进dll,以便由win32映射进不同的进程
空间,每个进程空间中的hook代码只负责处理该进程中的数据.所有的局部
之和就是全局,这样既维护了进程空间的独立性,又可以处理全局数据.
你的问题是想hook一个进程的数据,但又不是本进程,所以你必须让win32帮你把
hook代码放到其他进程空间,又要有所选择.
win32在映射hook代码到其他进程空间中的方法很简单,就是在另一个进程中调用
loadlibrary
只有loadlibrary成功以后才能hook到该进程的数据.
如果某个进程执行loadlibrary失败,那么我们将无法hook到该进程的数据.
loadlibrary失败除了系统原因外,还有个重要因素就是dllmain没有返回TRUE!
根据以上理论,我们只要在非指定程序装载hook dll时让dllmain返回false,即可达到
你的目的了.
所以你需要在hook dll中添加下面的代码"
BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
{
switch(dwReason) {
case DLL_PROCESS_ATTACH:
............
if(不是指定程序)
return FALSE
break;
.................
........
}
return TRUE;
}