深入浅出HOOKS(之叁)

类别:VC语言 点击:0 评论:0 推荐:

访问《化境编程界》| * Email:[email protected]

   化境编程界 -> 技术文章 -> 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 | 站务联系: [email protected] | OICQ:593737 (只用于站务联系,不做它用)

 

 

本文地址:http://com.8s8s.com/it/it1854.htm