创建远程线程,在远程线程里再去创建全局键盘勾子

lizhihaoweiwei 2013-05-30 01:16:42
问题是这样的,我有三个文件 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系统会有这样的问题呢?
...全文
288 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
鲫鱼跃龙门 2013-07-03
  • 打赏
  • 举报
回复
今天看到你在我空间的留言,过来看了一下,你遇到所的确实是个大问题,因为windows钩子这种技术在64位环境中是与在32位环境有很大不同。我以前做的此类工具程序,放到64位系统中就没有任何效果。由于现在的工作重心已不在开发方面,故没有去深究解决方案,所以很遗憾,不能帮到你,辜负了你的信任,不好意思。
lizhihaoweiwei 2013-06-01
  • 打赏
  • 举报
回复
引用 4 楼 jha334201553 的回复:
根据微软的官方文档说的:
引用:
在 x64 版本的 Windows 中,从 64 位可执行文件启动的进程(如 Explorer.exe)只能加载 Win64 DLL,而从 32 位可执行文件启动的进程只能加载 Win32 DLL。当 Win32 进程调用内核模式(例如,读取文件)时,WOW64 代码会安静地截断该调用,并在适当的位置调用正确的 x64 等效代码。
嗯,谢谢!那如果我要实现在64位进程里面向32位的进程注入键盘勾子,应该怎么办呢?换言之,在64位上实现全局键盘勾子岂不是不能实现的了?因为64位系统里有很多32位进程,当这些32位的进程处于活动的状态时,全局键盘勾子是毫无作用的,除非64位进程处于活动状态。
lizhihaoweiwei 2013-06-01
  • 打赏
  • 举报
回复
引用 3 楼 jha334201553 的回复:
64位下远程线程怎么注进去的?
你这个倒提醒我了,那说明64位的keyBd.dll并没有映射到所有的进程空间中,只映射到了64位的进程中,但为什么32位的进程会假死呢?
「已注销」 2013-05-31
  • 打赏
  • 举报
回复
根据微软的官方文档说的:
引用:
在 x64 版本的 Windows 中,从 64 位可执行文件启动的进程(如 Explorer.exe)只能加载 Win64 DLL,而从 32 位可执行文件启动的进程只能加载 Win32 DLL。当 Win32 进程调用内核模式(例如,读取文件)时,WOW64 代码会安静地截断该调用,并在适当的位置调用正确的 x64 等效代码。
「已注销」 2013-05-31
  • 打赏
  • 举报
回复
64位下远程线程怎么注进去的?
lizhihaoweiwei 2013-05-30
  • 打赏
  • 举报
回复
我大概知道是什么原因了,因为我都是64位的dll,当安装全局键盘勾子时操作系统把 keyBd.dll 映射到了所有活动进程的进程空间,但这些进程里面也包括32位的进程,但32位进程不认识64位的指令,所以,它找不到回调函数,即它就对键盘没有反应,导致系统认为其假死。 但我现在必须要在一个64位的进程里面去创建键盘勾子,现在应该怎么做呢?
夜予 2013-05-30
  • 打赏
  • 举报
回复
弄清楚64位和32位的区别

9,506

社区成员

发帖
与我相关
我的任务
社区描述
Windows专区 安全技术/病毒
社区管理员
  • 安全技术/病毒社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧