windows 全局hook
最近有用到全局hook,其实可参考windows核心编程,全局hook也是Dll注入的一种方式。首先,必须是一个Dll,可导出一个接口,在其中设置全局hook,类型为WH_GETMESSAGE(这样,应该是所有进程都会被hook到了),这样成功后,系统会把这个Dll注入到有getmessage的所有进程中,即会为每个进程隐式调用下loadlibrary。
然后每次getmessage时,都会回调进回调函数中,你就可以做一些自己的处理了。
当不需要hook时,可通过unhook,这样系统会为那些hook上的进程隐式调用freelibrary,卸载掉dll。
我们设 设置hook的进程为 P,hook Dll为D,则经试验发现,
即使是P退出前不调用 D的unhook,或P被强杀或挂掉,系统仍然会发现,仍然会帮着为那些hook上的进程调用freelibrary,也就是会进入到D的proc_detach中。
不过也会有些意外,偶尔有些进程也会未卸载掉D,比如chrome、svncache,或者需要点时间才能卸掉的其他进程 (但64位系统貌似没问题?)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
static HHOOK _myHook = NULL;
LRESULT CALLBACK MyHookProc(
_In_int nCode,
_In_WPARAM wParam,
_In_LPARAM lParam
)
{
return CallNextHookEx(NULL, nCode, wParam, lParam);// HHOOK parameter is optional and ignored
}
bool hookStart()
{
if (_myHook)
return true;
_myHook = SetWindowsHookEx(
WH_GETMESSAGE,
(HOOKPROC)&MyHookProc,
GetMainDll(),
0);
if (NULL == _myHook)
{
assert(false && "hook false!");
return false;
}
return true;
}
bool hookEnd()
{
if (NULL == _myHook)
return true;
if (FALSE == UnhookWindowsHookEx(_myHook))
{
assert(false && "unhook false!");
return false;
}
_myHook = NULL;
return true;
}
页:
[1]