SetWindowsHookEx定义如下:
Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
idHook是钩子类型,如WH_KEYBOARD捕捉键盘消息,而WH_MOUSE捕捉鼠标消息。hmod用于全袜银启局钩子,VB要实现钩子,必须设为0。dwThreadId用于线程钩子VB中可以设置为App.ThreadID。lpfn为钩子函数,在VB中可以使用AddressOf获得钩子函数的地址。这个函数因搏运为钩子类型不同而有所不同。如键盘钩子为:
Public Function KeyboardProc(ByVal nCode As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
如果Code不为0,钩子函数必须调用CallNextHookEx,将消息传递给下面的钩子。wParam和lParam不是按键。
可以到这里看看:http://nhzzljp.vicp.net/Article/show.asp?id=110
钩子是什么意思如下:
钩子
钩子是悬挂或探取东西用的器具,形状弯曲,头端尖锐,有时专指鱼钩。分弯钩和直钩两种。
HOOK分为三种:LOCAL HOOK 和 REMOTE HOOK,还有一种是SYSTEM-WIDE LOCAL HOOK。LOCAL HOOK就是指程序HOOK的就是本程序中的线程。
REMOTE HOOK有两种形式:一种是对其他程序中某个特定的线程;一种是对整个系统。
SYSTEM–WIDE LOCAL HOOK 是一种比较特殊的。它具有REMOTE HOOK的功能,又可以用LOCAL HOOK 的表现手法,实际上就是WH_JOURNALRECORD和WH_JOURNALPLAYBACK两种HOOK。
REMOTE HOOK 必须封装在DLL中。这是因为REMOTE HOOK是针对整个系统或其他进程的线程,因此HOOK必须封装成DLL,蠢迅才可以植入到其他进程进行监控。
而SYSTEM-WIDE LOCAL HOOK采用的是另外一种架构,系漏胡统中的线程请求或获得一个硬件消息的话,系统会调用那个安装返档拦有HOOK的线程,并执行它的FILTER FUNCTION.然后再返回给请求硬件消息的线程。
这种架构有一个缺点就是如果HOOK FILTER FUNCTION的处理中进入无限循环的话,那么整个系统将停留再循环中,无法切换到其他线程。
为了处理这个缺陷,WINDOW使用了一个办法来处理:就是CTRL+ESC键,如果用户按下CTRL+ESC键,则系统将会发送一个WM_CANCELJOUNAL消息到有挂上JOUNAL 系列HOOK的线程上面
研究到大半夜得出结论是VB做不到这一点,具体原因入下:VB可以写出标准DLL,用一些特殊的插件或者自己编写一些小工具可以做到这一点,百度上我也回答消段过,验证是可行的,你写的注入代码除了我前面提到过的那一点之外,也都是正确的,但是VB确实每次都会让目标进程崩溃,用IDA查了一下,发现总是死在这个函数里vbaSetSystemError ,在CSDN上查了一下,这个函数是VB编译时候自动加上的,它会检查每次调用API的返回值,但是因为我们是在DLL内部掉API,VB本身设计时没考虑这一点,所以到这个函数里头,它就崩溃了,而我们也没办法阻止我们自己的代码调用这个函数,所以这个只能说是VB自身的问题,确实没办法用VB做线程钩子,只能用VC去做。
查了一下,如何去掉这个函数网上也提了一些说法,液和不过整体上感觉过于复杂,不值得使用,其中主要的手段就是修改汇编指令,把这个函数从内存里改掉,这个办法通用性差,不值得使用,拿埋誉别的方法就不太有效了。
所以最后总结下来VB就是不支持这么做,没有办法了
============================
Private Declare Function CallNextHookEx Lib "user32" (ByVal hhook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
这个API是从API浏览器上拷贝下来的吧?这么干是不行的。。
必须这样:
Private Declare Function CallNextHookEx Lib "user32" (ByVal hhook As Long, ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
你代码里没有callnexthook,这样恐怕不行吧
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)