日期:2014-05-16  浏览次数:20821 次

创建远程线程,在远程线程里再去创建全局键盘勾子
问题是这样的,我有三个文件 shell.exe,NetStatistics.dll,keyBd.dll,我使用 shell.exe 将 Netstatistics.dll 远程线程注入到explorer.exe 中,然后,Netstatistics.dll的 Dllmain 会开启多个线程(Dllmain中没有使用 WaitforsingleObject之类的等待函数),在这些线程里面,会执行不同的网络统计任务,其中有一个线程是接受来自远程主机的控制命令并执行,根据这些命令,Netstatistics.dll中的线程会执行不同的任务。其中,有一个命令是要禁用用户的键盘,在命令接受/执行线程里面,我使用了 SetWindowsHookEx去挂载全局勾子,使用的 dll 是keyBd.dll。

问题是,对于 32 位windows系统,我将 shell.exe,NetStatistics.dll,keyBd.dll 这三个文件都编译成32位的程序,是完美运行的。

但对于 64 位系统,我将这三个文件都编译成 64位程序,此时,其它部分也是完美运行的,但只有键盘勾子那块有问题,具体的问题是,虽然成功禁用了键盘,但是,我在任意一个进程里面键入键盘,那个进程就会假死,我卸载键盘勾子没有任意作用,那个进程仍处于假死的状态,任何操作都不予以响应,只要我终止远程线程(使用 unshell.exe,这个文件是用来从 explorer.exe 中卸载远程线程的),则那个假死的进程立即被激活了,而且,我还发现,虽然那个进程之前处于假死,但它还是接受到了键盘消息,因为在远程线程结束后,假死的进程会将我键入的字符显示出来(比如 那个假死的进程是某个文本编辑器)。

我已经排除了是 键盘勾子 dll 的代码问题,我将键盘勾子回调函数里面什么也不写,只简单的返回CallNextHook,此时,之前的64位上的问题依然会重现。

但为什么只有64位windows系统会有这样的问题呢?
windows 远程线程 全局键盘勾子

------解决方案--------------------
64位下远程线程怎么注进去的?
------解决方案--------------------
今天看到你在我空间的留言,过来看了一下,你遇到所的确实是个大问题,因为windows钩子这种技术在64位环境中是与在32位环境有很大不同。我以前做的此类工具程序,放到64位系统中就没有任何效果。由于现在的工作重心已不在开发方面,故没有去深究解决方案,所以很遗憾,不能帮到你,辜负了你的信任,不好意思。