作者: BITS, 出处:XFOCUS Team, 责任编辑: 韩博颖, 2008-06-17 09:58
挂钩一直是Hack 编程中永恒的主题,基本高级的Rootkit 程序多多少少都会使用Hook 技术。
挂钩一直是Hack编程中永恒的主题,基本高级的Rootkit程序多多少少都会使用Hook 技术。似乎Hook 都被讲烂了,不论是Ring3 的还是Ring0 的网上都有例子。Ring0 的毋庸置疑当然是全局的了,这里说说ring3 的全局hook。Ring 3 有Ring 3 的优势,稳定是压倒一切的,因此Mcafee和其他一些商业的安全软件都还是使用了Ring3 的Hook 技术,无论如何用户是无法接受蓝屏和死机的。
1. 以往的Ring 3全局Hook
纵观网上流行的全局Hook 程序都只用了一个Windows API, SetWindowsHookEx,此函数原型:
HHOOK SetWindowsHookEx(
int idHook,
HOOKPROC lpfn,
HINSTANCE hMod,
DWORD dwThreadId
);
idhook 安装的钩子类型,如 WH_GETMESSAGE,WH_KEYBOARD 等
lpfn hook procedure 的指针
hmod 包含 hook procedure DLL 的handle
dwThread 为0
使用这个这个API时候有问题的,只能挂接系统中的所有G U I线程,换句通俗的话说就是有界面
的程序,Windows console 类的程序就无能为力了。
还有一种通过插入注册表来实现
HKEY_LOCAL_MACHINESoftwareMicrosoftWindows NTCurrentVersionWindowsAppInit_DLLs
这种方法简单,但是还是只能挂钩GUI程序,并且这个键值已经被广大HIPS 所关注,吃力不讨好。
以上两种效果不好,因此有人有开始另外的做法,枚举所有进程,插入和挂钩 NtCreateProcess
这是非常自然的想法,似乎也把问题解决了,但是仔细思考一下,就会发现很多问题。
a. 时机不对,在NtCreateProcess函数被调用时进程并没有真正被创建,我们无法执行HOOK操作,
而当NtCreateProcess返回时,进程又已经开始运行
b. 如果是Windows console 创建的进程,你如何去监控这个调用呢?这么说似乎比较抽象,你可
以这么理解,直接在命令行下,cmd,cmd,cmd .... 你可以监控到最后一个cmd 吗,如果只
用SetWindowsHookEx
c. 是否正好站在了华容道,是否足够底层。