我本来想在ring3下全局hook,大约有这么几种方法:
1: 用SetWindowsHookEx,安装的钩子类型,如WH_GETMESSAGE,WH_KEYBOARD等,但这种方法只能挂接系统中的所有GUI线程。
2: 还有一种通过插入注册表来实现 HKEY_LOCAL_MACHINE/Software/Microsoft/Windows NT/CurrentVersion/Windows/AppInit_DLLs,这种方法简单,但是还是只能挂钩GUI 程序,并且这个键值已经被广大HIPS所关注,吃力不讨好。
3: 用CreateRemoteThread注入到系统所有进程,但这种方法效率太低,特别是实时性太差,因为它要不停循环扫描所有进程,如果突然新建一个进程可能要过好久才能注进去,可能会漏掉很多API。
4: 通过挂钩NtResumeThread实现全局Hook,这种方法比较好,可以看http://www.xfocus.net/articles/200805/981.html
5: 禁用Copy-On-Write机制实现全局hook,但是难度很大,最终还是要去ring0禁用,http://www.xfocus.net/articles/200510/830.html (它是非PAE的)
说起Copy-On-Write,先看一个结构
struct _hardware_pte_x86 (sizeof=4)