ABOUT HOOK

1 view
Skip to first unread message

wangw469

unread,
Mar 17, 2006, 9:30:05 AM3/17/06
to NenuSo...@googlegroups.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).

好了.今天就写到这里.此文该算本主页里又一篇经典了吧.:)))

Reply all
Reply to author
Forward
0 new messages