访问《化境编程界》| * Email:5xsoft@21cn.com
化境编程界 -> 技术文章 -> C/C++/VC
关于 HOOK
[ 作者: 陆麟 添加时间: 2001-6-2 0:04:44 ]
来源:lu0.126.com
大家讨论HOOK太多了.在网络中,概凡谈论到进程控制,十有八九最后会得到一句话:写HOOK.
嘿嘿,知道HOOK运作机理的有几个呢?下面,本人就MSDN文档中没有写到的一点东西稍微讲几句.
以下讲述乃针对全局HOOK而发.
1.设置HOOK过程时返回的前一HOOK地址必须被保存到一个全局共享的内存地址段中.这个共享段的地址不是什么本进程的全局变量,而是所有进程都可以看见的变量.因为,进程级变量进在本进程内可见.当其他进程加载HOOK DLL时,HOOK DLL里的所有变量都会被RESET.这也就是说:
HHOOK hk;
//set and get HHOOK here
return hk();
这样的描述是不能跳转到前一HOOK的.这一点,甚至在Jeffrey Richter的经典书籍<<Advance Windows>>里都描述错了.
正确的做法是:
#pragma data_seg("dt")
HHOOK prehook=0;
#pragma data_seg()
然后到VC的LINK OPITION里加上:
-SECTION:dt,RWS
这样,prehook就被搞到系统中被共享了.记住,一定要给prehook初始化.否则,MS编译器的编译器会LINK错误.
2.只有使用USER32.DLL的进程才会被INJECT.所以,HOOK并不是万能的.而且,用了USER32.DLL,也不一定会被INJECT.这里有个很好的例子就是整个OS启动中第一个被启动的WIN32进程:KERNEL32.DLL.大家很奇怪,KERNEL32.DLL是个DLL,怎么也会被作为进程加载?但是事实的确是这样的,顺便给大家再上一节98启动课吧.KERNEL32.DLL作为一个独立的进程,启动时加载了MSGSRV32.EXE.而MSGSRV32.EXE又启动了SPOOL32.EXE, SPOOL32.EXE启动了MPREXE.EXE.MPREXE.EXE可不能小看.我敢担保全中国没几个人真正知道它的作用的.MPREXE.EXE不仅是网络客户端部件启动的核心,更是WIN98的SERVICE的SCM.所有的WIN98的SERVICE都是由MPREXE.EXE启动的.WIN98的SERVICE都在HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices里呆者哩.大家都傻眼了吧.:DDD 有一点很令人奇怪, 那就是如果MPREXE.EXE运作不正常,那么SHELL绝对起不来.SHELL却是有MSGSRV32.EXE启动的.看来MPREXE和MSGSRV32有一套内部沟通机制啊.有了SHELL,就什么都有了.其他的东西被SHELL启动就难说准了.反正80%的程序是由SHELL启动的.好了,WIN98启动暂且讲到这里.我们继续原先的话题.KERNEL32.DLL居然就无法用HOOK入侵.大家如果不信的话,就试试看吧.
3.尽管使用USER32.DLL的进程会被INJECT. 但是这里还有一个技巧,那就是HOOK DLL是在进程第一次发出USER32调用的时候才被加载. 大家又目瞪口呆了吧.:) 这也就是说,在你发出USER32调用之前, HOOK DLL根本拿你没办法. 哇,真够幽默啊.:)))由于在启动HOOK前的进程绝对都是在调用GetMessage(...)/PeekMessage(...)中,那么HOOK DLL一下子满足了加载条件了.
4.加载HOOK时,HMODULE一定要正确,否则,系统就无法正确加载HOOK过程.千万不要用0代替HMODULE,因为0代表的是EXE映象的HINSTANCE(其实就是HMODULE).
好了.今天就写到这里.此文该算本主页里又一篇经典了吧.:)
相关内容:
- 怎样用程序取得CPU信息
- 详析VC中坐标系的建立
- OOP: 理解类和对象
- 后入为主-虚函数
- 实现网络蚂蚁在IE中右键菜单的“用xxxxxx下载”功能
--------------------------------------------------------------------------------
申明: 本站 所有内容均是从网上收集,若有侵范你版权的请指出,本站马上删除。
© Copyright By 稻香老农 2000.3 - Now | 站务联系: 5xsoft@21cn.com | OICQ:593737 (只用于站务联系,不做它用)