马大哈 发表于 2005-4-22 12:20:24

[原创]关于VB与全局HOOK的看法

<P>大概在四五年前,偶还是一只小小菜青虫时,便在网上听说了一句"名言":

VB是不可能独立做出全局HOOK的!

对于当时的我来说,HOOK是个虾米东东都不知道,所以也没去管,学!~~~

直到有一天,我决定做一个木马时,才发现,好象只用VB是无法记录键盘鼠标的....因为以上的"名言"!!!

当时的木马是使用一个别人做的DLL来工作的(是用汇编语言做的,偶自己改了一下HOOK类型).后来,木马制作相当成功,可以拦截到所有的键盘鼠标动作,并采用了本人独创的(应该是"独创"的吧??偶还没有见到过类似的木马)时间轴定位方法,使任何键盘与鼠标的操作都可以重现,并与当时的工作焦点相结合,使任何操作都难逃"法"眼("贼"眼也许合适点....).经过自己的使用,觉得相当不错!!

但在后来的某一天的某一论坛上,我发现有人使用VB本身的功能就完成了全局HOOK,于是便立刻当下来学习.

经过分析,发现程序基本是MS所说的DLL式HOOK的标准应用!只是,这些标准的应用是在ActiveX DLL上实现的!

当时偶差点晕了,不是有人说过,"VB是不可能独立做出全局HOOK"吗??-------等一下!!仔细想想,在听到那句话时,我真的从来都没有去怀疑过它的真假,因为我当时根本就不懂.现在,让我自己来找找答案吧!!

当下新建一ADLL工程,做好类的事件接口,并把HOOK过程放在一个标准模块里,编译,生成.

再建立一EXE工程,引用DLL,编写简单的代码,OK,编译,运行,按按键,动鼠标................晕,真的可以呀!!!

回头想想,其实是自己的鼻子让人牵着走了N年....不过,这下也让我知道了一句话的重要性:

<B>学习WHY,而不是学习HOW!</B>

很多东西,其实自己就可以搞明白的.

最后,也附上代码,让大家看看,VB是如何独立做到全局HOOK的:

http://m5home.vicp.net:85/pubfile/m5/Hook.rar</P>
<P>
</P>
[此贴子已经被作者于2005-4-22 12:29:15编辑过]

小吧 发表于 2005-4-22 12:27:22

<P>哎 !</P><P>我刚学vb几个星期基本的东西才有个了解</P><P>这么高深的东东 怕是还没能力弄懂,但我相信不久就可以自己弄了!</P><P>对了 </P><P>这个联接地址好象下不了 </P><P>老是提示服务器忙 下不来!</P><P>是不是网站有些东西还没弄好啊???????</P>

马大哈 发表于 2005-4-22 12:29:52

<P>不好意思,那台电脑今天没有开机,我现在上传到空间里了~~</P><P>可以正常下载! </P>

小吧 发表于 2005-4-22 13:06:15

恩 好谢谢马哥 哈!

马大哈 发表于 2005-4-26 14:58:32

楼上的朋友,有问题可以单独发帖,不用在这里跟的-----------我们不会嫌帖子多的........

马大哈 发表于 2005-5-20 15:13:50

我是新来的报个到~~~~

<P>但却是很有用的东西。</P>

小吧 发表于 2005-5-20 18:04:01

<P>我也不太明白,呵呵~!</P>

小吧 发表于 2005-6-13 03:05:16

<P>这两天再看这个东西,也在看你的那个包里所谓的钩子呵呵 </P><P>早日揭开他神秘的面纱!!!!!!</P>

马大哈 发表于 2005-6-24 22:48:10

<P>这个也是全局的吗?</P><P>以前只是知道可以用HOOK而已.</P><P>其实我也是在想做木马时才去学习HOOK的,呵呵.做完那个木马,我的代码水平提高了不少.</P><P>最后的木马是可以用了,但我最终还是把它收藏起来了.</P>

马大哈 发表于 2005-6-28 19:50:33

<P>我大概查了一下这个函数,觉得使用上还是有问题.</P><P>它的用处其实是用于判断指定的键是否按下,比如在程序启动时如果用户按着F8就会出现启动菜单....(只是个例子....WINDOWS当然不会在那时用这个函数实现此功能的)</P><P>如果用它来记录键盘,我觉得会有CPU占用太高的问题-----毕竟是用的TIMER来拼命地循环.</P>

马大哈 发表于 2005-7-23 20:59:10

<P>呵呵,就怪我太菜了!</P><P>谢谢指点!!</P>

马大哈 发表于 2005-10-27 16:46:11

好象不行.....那个组合键的优先级太高了.......

马大哈 发表于 2006-1-4 20:52:10

既然你有时间回3个帖子,为什么就没时间看公告或置顶帖呢?????

如果你只是想下载东西,并不需要注册!!

我不想论坛里僵尸账号太多!!!

马大哈 发表于 2006-1-6 18:57:21

你怎么不好好看看代码结构呢?

马大哈 发表于 2006-1-19 19:18:52

不用向我致敬....应该向代码作者.

其实VB很多东西都可以办到,只是在某些方面,需要使用者拥有更高的水平(比如本例,目前为止我都还不会)

这也是一些人放弃VB的原因.

但我不会放弃VB,同时也会把其它语言学好.

毕竟在一些VB下很不容易实现的东西,使用其它语言也许会有更简单的解决方式.

马大哈 发表于 2006-3-16 12:11:27

你也许可以试试系统日志HOOK,它会把当前活动窗口,及此窗口的一些信息都拦截下来(比如创建,激活,销毁等),这样你就可以处理了.

以下是我转的HOOK类型,你可以参考一下:

HOOK类型

WH_CALLWNDPROC 和 WH_CALLWNDPROCRET HOOK


      WH_C ALLWNDPROC 和WH_CALLWNDPROCRET HOOK可以监视SendMessage发送的消息。系统在向窗体过程发送消息前,将调用WH_CALLWNDPROC;在窗体过程处理完该消息后系统将调用WH_CALLWNDPROCRET。
WH_CALLWNDPROCRET HOOK会向HOOK过程传送一个CWPRETSTRUCT结构的地址。该结构包含了窗体过程处理系统消息后的一些信息。

WH_CBT Hook

      系统在激活,创建,消毁,最小化,最大化,移动,改变窗体前;在完成一条系统命令前;在从系统消息队列中移去鼠标或键盘事件前;在设置输入焦点前,或同步系统消息队列前,将调用WH_CBT HOOK。你可以在你的HOOK 过程拦截该类HOOK,并返回一个值,告诉系统,是否继续执行上面的操作。

WH_DEBUG HOOK

      系统在调用与某种HOOK类型联系的HOOK过程前,将调用WH_DEBUG ,应用程序可以使用该HOOK决定是否让系统执行某种类型的HOOK。

WH_FOREGROUNDIDLE Hook

      系统在空闲时调用该HOOK,在后台执行优先权较低的应用程序。

WH_GETMESSAGE Hook

      WH_GETMESSAGE Hook使应用程序可以拦截GetMessage 或 PeekMessage的消息。应用程序使用WH_GETMESSAGE HOOK监视鼠标、键盘输入和发送到队列中的其它消息。

WH_JOURNALRECORD Hook

      WH_JOURNALRECORD Hook使应用程序可以监视输入事件。典型地,应用程序使用该HOOK记录鼠标、键盘输入事件以供以后回放。该HOOK是全局HOOK,并且不能在指定线程中使用。

WH_JOURNALPLAYBACK Hook

      WH_JOURNALPLAYBACK Hook使应用程序可以向系统消息队列中插入消息。该HOOK可以回放以前由WH_JOURNALRECORD HOOK录制的鼠标、键盘输入事件。在WH_JOURNALPLAYBACK Hook安装到系统时,鼠标、键盘输入事件将被屏蔽。该HOOK同样是一个全局HOOK,不能在指定线程中使用。
WH_JOURNALPLAYBACK Hook返回一个时间暂停值,它告诉系统,在处理当前回放的消息时,系统等待百分之几秒。这使得此HOOK可以控制在回放时的时间事件。

WH_KEYBOARD Hook

      WH_KEYBOARD Hook使应用程序可以监视由GetMessage和PeekMessage返回的WM_KEYDOWN 及WM_KEYUP消息。应用程序使用该HOOK监视发送到消息队列中的键盘输入。

WH_MOUSE Hook

      WH_MOUSE Hook 使应用程序可以监视由GetMessage和PeekMessage返回的消息。应用程序使用该HOOK监视发送到消息队列中的鼠标输入。

WH_MSGFILTER and WH_SYSMSGFILTER Hooks

      WH_MSGFILTER 和WH_SYSMSGFILTER Hooks使应用程序可以监视菜单、滚动条、消息框、对话框,当用户使用ALT+TAB或ALT+ESC来切换窗体时,该HOOK也可以拦截到消息。WH_MSGFILTER仅在应用程序内部监视菜单、滚动条、消息框、对话框,而WH_SYSMSGFILTER则可以在系统内监视所有应用程序的这些事件。

WH_SHELL Hook

      一个SHELL程序可以使用WH_SHELL Hook来接收重要的信息。当一个SHELL程序被激活前或当前窗体被创建、消毁时,系统会调用WH_SHELL Hook过程

马大哈 发表于 2006-12-29 21:28:01

<p>你要先卸载HOOK</p><p></p><p>另外,调试前最好保存工程</p><p></p><p>点方块是很不好的习惯,最好在程序的代码里处理好,让程序能正常退出.</p>

chenhui530 发表于 2007-1-25 08:44:50

呵呵说的不错

chenhui530 发表于 2007-1-25 08:45:56

<p>下载不了</p>

马大哈 发表于 2007-1-25 08:48:36

<p><strong><font face="Verdana" color="#61b713">chenhui530???</font></strong></p><p>CSDN里的那位朋友吗?</p><p>&nbsp;</p><p>水平很不错的说!!!!欢迎来到寒舍~~~</p>

CodeMaster 发表于 2009-1-20 14:47:02

<p>学习学习...</p>

sunshinebean 发表于 2011-12-13 16:05:29

挖坟来了,WH_JOURNALRECORD与WH_JOURNALPLAYBACK很经典,可以做到消息记录与回放,这2个好像是唯一不用做全局dll来实现的全局钩子汗。。。
页: [1]
查看完整版本: [原创]关于VB与全局HOOK的看法