Reference

获取KeyboardClassServiceCallback函数的地址

SendMessage/PostMessage

是Ring3层的一种方法,SendMessage和PostMessage是User32.dll中的函数。可以直接在程序中调用,实现对另一个软件上的按钮的点击。发消息给固定HWND的窗口,不需要窗口是处于顶层。代码:

SendInput

这个函数发消息给Active window, 发消息之前需要将窗口置顶,主要使用结构体INPUT, 头文件#include

这个结构是一个联合体,可以发送KEYBOARD和MOUSE两种事件。MOUSE事件的结构体如下:

代码:

keybd_event/mouse_event

这两个函数头文件include,代码:

图 在MFC程序中,可以直接使用keybd_event和mouse_event这两个函数。

这两个函数keybd_event和mouse_event内部是调用SendInput函数实现的,所以消息是发给Active window的。所以,使用这两个函数发消息给窗口的时候,同样需要将窗口程序置顶。

图 mouse_event 内部实际是条用SendInput函数实现的。

图 keybd_event内部实际是调用SendInput函数实现的。

Kbdclass.sys-KeyboardClassServiceCallback/mouclass.sys-MouseClassServiceCallback

这个是底层的键盘鼠标事件回调函数。通过直接调用这两个函数可以实现模拟键盘鼠标输入的效果。代码是从看雪上下载的代码的基础上修改实现的。

主要思想:

1、找到KeyboardClassServiceCallback/MouseClassServiceCallback函数在内核中的地址,采用特征码搜索的方法;

使用ZwQuerySystemInformation函数,其参数为SystemModuleInformation = 11时,用于获取系统所有内核模块的相关信息,放在PSYSTEM_MODULE_INFORMATION结构体中,这个结构体中包含了模块名(module[Index].ImageName + module[Index].ModuleNameOffset),模块基址(module[Index].Base)的相关信息,这样就可以找到kbdclass.sys 和 mouclass.sys的基址。然后根据特征码搜索的方法,找到KeyboardClassServiceCallback/MouseClassServiceCallback的入口地址。

图 获取系统内核所有模块的信息,查找需要的模块基址

图 根据特征码搜索的方法查找内核函数的地址

2、构造函数的参数,直接调用这两个函数实现模拟按键。

KEYBOARD_INPUT_DATA结构在ntddkbd.h中;MOUSE_INPUT_DATA结构在ntddmou.h中。这两个头文件都在WDM的目录中可以找到。要使用这两个结构就需要将对应的头文件加入。

但是对这两个结构体的赋值,还是需要去查一下键盘的键值,鼠标的坐标表示方式等信息。我这里没有去查这些信息,特别是对应鼠标的坐标,查了一些资料,感觉不太好确定。所以还是从逆向分析的角度,获取要模拟的事件对应的该结构的值,然后用这个值进行模拟测试。对于键盘的模拟,以Caps Lock Click为例:

图 WinDbg查看Caps Lock按键过程中KEYBOARD_INPUT_DATA结构中每个变量的值。

图 根据获取的KEYBOARD_INPUT_DATA的值构造KeyboardClassServiceCallback函数的参数,调用该函数实现模拟按键。

对于鼠标的模拟,以鼠标左键Click为例:

图 构造KeyboardClassServiceCallback函数的参数,调用该函数实现鼠标左键Click事件。

这两个函数的调用都是在DriverEntry中直接实现的,所以最终的表现形式是:只在驱动加载的时候模拟点击一次,要实现重复多次的模拟,就需要将内核函数的调用写在IRP的分派函数中,然后在Ring3层读写驱动设备。

遇到的问题

1、双机调试过程中内核符号表的配置

要了解系统内核中的函数,需要配置双机调试环境,查看内核中的实现。其中我自己觉得比较难的一点是内核符号表的配置。如果内核符号表配置不好的话,无法在WinDBG中查看内核函数与对应的数据结构。

http://msdn.microsoft.com/en-us/windows/hardware/gg463028.aspx  可以在这个地址下载对应的内核符号表,然后安装到对应的目录,如E:WindowsSymbils.然后在WinDBG的Symbol File Path目录中输入该目录E:\Windows\Symbils,.reload加载符号表。

我这里一直加载不到符号表的问题出在了转义字符“”上。

2、如何获取MOUSE_INPUT_DATA与KEYBOARD_INPUT_DATA参数的问题

在MSDN上面可以查到这两个数据结构,对于参数的赋值还是需要仔细研究。我使用的方法是在系统的MouseClassServiceCallback和KeyboardClassServiceCallback函数的地址处下断点,然后获取实际按键过程中这两个数据结构的值,然后用这个数据做模拟按键。

3、内核函数的调用方式

这里考虑到驱动编写的过程中,是采用过滤驱动还是直接调用内核函数两种方式。过滤驱动就是在原有的驱动对象的基础上,在设备堆栈上注册自己的驱动对象,实现自己的驱动回调函数,但是过滤驱动也是在当IRP发生的时候,调用的。模拟按键的话,我认为是要绕过硬件触发,绕过IRP,直接调用底层的函数来实现对应的功能。所以,最后还是选择的是直接调用内核函数。

4、设备对象:DEVICE_OBJECT的获取

键盘和鼠标驱动函数MouseClassServiceCallback和KeyboardClassServiceCallback的第一个参数是DEVICE_OBJECT对象。所以,需要在调用之前创建对应的设备对象。键盘设备对象的符号名:L”\Device\KeyboardClass0”;鼠标设备对象的符号名:L”\Device\PointerClass0”;理论上这个值是跟MOUSE_INPUT_DATA与KEYBOARD_INPUT_DATA中的UintID参数对应的,但是好像没有那么严格。

c语言模拟按键win d,Windows平台模拟按键方法总结相关推荐

  1. linux平台及windows平台mysql重启方法

    linux平台及windows平台mysql重启方法 Linux下重启MySQL的正确方法: 1.通过rpm包安装的MySQL service mysqld restart 2.从源码包安装的MySQ ...

  2. python模拟按键_Python实现windows下模拟按键和鼠标点击的方法

    本文实例讲述了Python实现windows下模拟按键和鼠标点击的方法.分享给大家供大家参考.具体如下: 这段代码可以模拟在窗口上按下按键.鼠标左键点击.鼠标右键点击.鼠标双击等等. 前提先要安装 p ...

  3. python驱动级模拟按键_Python实现windows下模拟按键和鼠标点击的方法

    本文实例讲述了Python实现windows下模拟按键和鼠标点击的方法.分享给大家供大家参考.具体如下: 这段代码可以模拟在窗口上按下按键.鼠标左键点击.鼠标右键点击.鼠标双击等等 # # _*_ c ...

  4. win7自带c语言编译器在哪里,在Windows平台如何选择C语言编译器?

    学习到了这个阶段,我们不仅要问在Windows平台如何选择C语言编译器呢?这个是因人而异的,Windows 下的C语言 IDE 众多,每个人开发习惯不同,所以用哪款的都有,不过本文是从大众角度出发对C ...

  5. Windows平台安装dlib方法汇总

    环境参考: Anaconda with Python 3.7.0 Cmake version 3.18.4 注:经过实验,Python3.6及以下可以直接使用方法1,Python3.7可以直接使用方法 ...

  6. 在windows上模拟linux环境,MSYS2——Windows平台下模拟linux环境的搭建-Go语言中文社区...

    最近从MSYS1.0迁移到了MSYS2.0,简单讲,MSYS2.0功能更强大,其环境模拟更加符合linux.虽然本身来自cygwin,但其集成了pacman软件管理工具,很有linux范,并且可以直接 ...

  7. C/C++ Windows平台 模拟键盘 / 鼠标操作

    原理:调用Windows API 头文件: Windows.h 鼠标 参考:MSDN :mouse_event function 按键 使用定义在Winuser.h中的mouse_event函数(Wi ...

  8. QT Linux平台屏蔽按键事件(installEventFilter使用) 自定义拦截按键输入

    文章目录 背景 焦点 focus focusPolicy keypress和keyrelease installEventFilter 重写事件过滤器 过滤组件的按键事件 最终效果 Qt是一个跨平台开 ...

  9. MT4外汇平台模拟交易对新手投资者有什么好处?

    外汇交易看似简单,任何人都可以交易货币.基本上就是买入或卖出一定数量的货币.但事实上是不是真的这么简单呢?外汇交易的过程牵涉很多不同的选择和决定,例如账户类型.点差.存款和杠杆水平,这些因素都将影响你 ...

最新文章

  1. python正则提取mysql中文数据
  2. ArcGIS JavaScript API 实现基本的地图功能
  3. C#中System.ServiceProgress报错
  4. 试题 基础练习 回文数
  5. IIS中“使用 XSL 样式表无法查看 XML 输入”问题的解决
  6. 中国制造2025变革,背后的大数据来龙去脉
  7. android 屏幕旋转流程,android自动屏幕旋转流程分析.doc
  8. PHP可不可以调用opengl库,opengl,_苹果能不能用 OpenGL 3 或以上写代码?,opengl - phpStudy...
  9. 因服务器配置不当,热门直播平台 Twitch 的125GB 数据和源代码被泄露
  10. 十-二进制数的最少数目
  11. psp2000 M33 自制固件---恢复模式说明(基本所有版本都适用)
  12. CUDA版本与显卡驱动匹配
  13. matlab单服务台排队系统仿真,matlab单服务台排队系统实验报告.doc
  14. 电子产品检验-检验中心
  15. 文件服务器批量权限修改,服务器文件批量权限设置权限
  16. [论文解读] Rank Sort Loss for Object Detection and Instance Segmentation
  17. 九型性格心理测试 (From Ulla Zang荣格的个人性格测验题目)
  18. DocSearcher:文档搜索引擎
  19. FCM公式详细推及代码
  20. 2022年中国海洋大学计算机及电子信息考研分析【待完善】

热门文章

  1. 读稻盛和夫《干法》后的几点感悟
  2. 医疗大数据在学习型健康医疗系统中的应用
  3. java字符串从后截取_java 字符串截取的几种方式(转)
  4. html如何追加兄弟元素,CSS 相邻兄弟选择器
  5. codeforces1474D. Cleaning
  6. Java之List详解
  7. 初步学习My SQL
  8. 5分钟带你了解会员营销!
  9. 全国省会及副省级以上城市GDP、固定资产投资总额和城镇居民人均消费支出数(1949-2019年)
  10. AutoCAD Electrical 2022—项目特性