宿主系统是XP。
打开VMWare Player,进入Win2000。Win2000里开个记事本。
Xp中打开spy++,抓VMWare的窗口。其中最低层的一个窗口就是显示子操作系统的窗口是vmware-vmx.exe创建的,上层的窗口是vmplayer.exe创建的。把焦点放Win2000里,用spy++拦截这些vmware窗口的消息,发现就键盘消息拦不到,其余消息能拦到。自己写程序,用全局钩子,钩子类型试过多种,有WH_GETMESSAGE,WH_DEBUG,WH_KEYBOARD,WH_KEYBOARD_LL,发现以下情况:
用鼠标点Vmplayer的边框,然后按键,能拦截到键盘消息,(说明Dll已经注入vmplayer.exe中)。但焦点放Win2000里,拦截不到键盘消息。按照《Windows核心编程》中“使用Windows挂钩来插入DLL”一节的方法,使用WH_GETMESSAGE钩子,将Dll注入vmware-vmx.exe的进程,用冰刃查看,发现Dll注入成功。然后成功安装局部钩子(有文章说局部钩子优先级高于全局钩子),试过WH_DEBUG,WH_KEYBOARD两种类型,依然拦截键盘消息失败。用DeviceTree查看驱动层次结构,发现kbdclass驱动上面并无可疑过滤驱动程序。不知道VMWare是怎样处理键盘消息的,难道非要用Driver来拦截?

解决方案 »

  1.   

    不是我吃饱饭没事做,是某地的某Bank要求我们实现这样的功能。拦截到VMware里的按键后输入一些字符串。宿主系统是XP,我们的软件在XP下运行,VMWare Player里装的是Linux,业务系统在Linux里面。
      

  2.   

    建议使用驱动级别的钩子,
    可以参照一下
    rootkit源代码中的键盘钩子KLog程序
    代码下载:http://www.rootkit.com/vault/Clandestiny/Klog%201.0.zip
      

  3.   

    写了个NT式驱动挂接到KeyboardClass0上,成功拦截按键输入,至于USB键盘以后再考虑,结贴。