驱动级键盘模拟(C#)(高手请飘过)

2023-05-16

   游戏外挂一般分为三个级别:初级是鼠标、键盘模拟,中级是Call游戏内部函数,读写内存,高级是抓包,封包的“脱机挂”(完全模拟客户端网络数据,不用运行游戏)。用C#写外挂的不是很多,大部分是C++,主要原因是MS的C#目前不支持内联汇编功能。因此用C++写底层库,然后用C#调用成为DONET爱好者开发外挂的首选。

点击此处下载DEMO

点击此处察看针对《拳皇》的“八神”小特效。


      对于鼠标键盘模拟的外挂而言,很多人认为没有什么技术含量,因为无非就是SendMessage或者Key_event,再高级点就是Hook进入程序内部操作。我也曾用这种技术开发过一些游戏辅助程序。但最近我在研究XNA的时候遇到了一点麻烦,这种屡试不爽方法居然失效了。游戏对于消息命令一点也不“服从”,我们有这样的疑问:它是如何识别真实键盘的按键的呢?难道是程序中有判断吗?

      如果抛开上面的疑问,换另外一个角度思考。在DOS时代,还记得那个经典的去除BIOS密码的Debug命令吗?其原理就是利用了BIOS中断,其实对于键盘按键,不管Windows怎样封装,到最后都会调用BIOS中断来识别按键。然而消息发送毕竟是Windows系统的玩意儿,不管在Windows层面上怎样判断,我们只要让BIOS下一道“圣旨”,看哪个游戏还敢如此嚣张!!!

      在解释更详细的原理之前,我们先来抓出幕后黑手,看看是哪个给游戏撑腰?让它有胆子违抗Windows消息命令。究竟是判断了真实键盘信息,还是有其他原因。结果在DirectX编程中发现了DirectInput这个API。就是它绕过了Windows的消息机制,它的目的是为了让游戏的实时性控制更好、更快。Windows消息是队列形式的,在传递过程中会有延时,比如格斗类游戏对实时性控制要求是非常高的,Window消息机制不能满足这个需求。而DirectInput直接和键盘驱动程序打交道,效率当然要高出一大截。我认为大部分游戏不响应消息的真正的原因在这里,而不是故意写了反作弊系统。

      既然知道了是DirectInput在搞鬼,可是我们该怎么办呢?前面我们提到了一点思路,因此最实际的办法就是直接读写键盘端口的方法来模拟硬件事件。在DOS时代每按下一个键就会产生一个键盘中断,这样程序会跳到BIOS中的键盘中断去处理程序执行。在曾经的那个年代我最牛X的是QBasic程序了。QBasic中有一个OUT函数可以向指定端口写入数据,用INP函数可以从指定端口读取数据。因此用QBasic来做硬件级别的键盘模拟非常简单。

假如这个键的扫描码为0x51,先模拟按下这个键:
OUT &H64,&HD2 '把数据0xD2发送到0x64端口。
OUT &H60,&H51 '把扫描码0x51发送到0x60端口,表示模拟按下扫描码为0x51的这个键
下面再模拟释放这个按键:
OUT &H64,&HD2 '把数据0xD2发送到0x64端口。
OUT &H60,(&H50 OR &H80) '把扫描码0x50与数据0x80进行或运算,表示释放这个键。

      当然DOS时代早已经一去不复返,只是刚才提到QBasic时候让我感慨了一下其曾经的强大而已。如果真的用QBasic来写模拟程序,在Win98下可以成功,但是在Win2000以后的版本就不行了,因为进入NT时代后DOS只是一个虚拟机系统了。

      现在的问题很清晰了,就是如何在Windows环境下来进行端口操作。由于比较底层,Windows不会那么轻松让你得逞。一般会有两种方法:其一就是利用驱动,在驱动里面还有什么事情不能做?其二就是利用“调用门”从Ring3跳到Ring0去进行相关操作。在网上搜一搜应该都会找到相关的资料。我听格格说过有个VB做的叫做“按键精灵”的貌似比较牛X,下载下来研究后发现其使用了老外的WINIO驱动的原理。用WINIO就容易多了,因为我在驱动方面的能力实在是&*^%$^&*。

      于是在WINIO的基础上,我使用C#进行了简单的二次封装,使其适用于DONET平台上使用驱动级别的按键模拟。在我的DLL中提供了以下几个方法:

InitSuperKeys() 安装WINIO驱动,一般用于Form_Load事件中调用

CloseSuperKeys() 卸载WINIO驱动,一般用于Form_Closed事件中调用

KeyDown(Key) 模拟普通Key键按下。

KeyDownEx(Key)模拟扩展Key键按下。

KeyUp(Key)模拟普通Key键弹起。

KeyUpEx(Key)模拟扩展Key键弹起。

KeyPress(Key)模拟普通Key键按下并弹起一次。其中按下和弹起的默认时间间隔是200毫秒

KeyPress(Key,Int32)模拟普通Key键按下并弹起一次。其中按下和弹起的时间间隔是第二个参数,单位为毫秒。

KeyPressEx(Key)模拟扩展按键Key按下并弹起一次。其中按下和弹起的默认时间间隔是200毫秒,写入扩展按键信息间隔时间为100毫秒

KeyPressEx(Key,Int32)模拟扩展按键Key按下并弹起一次。其中按下和弹起的时间间隔是第二个参数,单位为毫秒,写入扩展按键信息间隔时间为100毫秒。

KeyPressEx(Key,Int32,Int32)模拟扩展按键Key按下并弹起一次。其中按下和弹起的时间间隔是第二个参数,单位为毫秒,写入扩展按键信息间隔时间是第三个参数,单位为毫秒。

特别说明:
1、 在执行模拟按键之前必须先执行InitSuperKeys()进行驱动的安装,在窗体关闭之后最好可以卸载驱动。

2、 以上方法中的参数Key为我在WinIoSys类中定义的一个枚举,并非DONET系统的Key枚举。

3、 普通Key是指A,B,C,Space这种标准键盘按键。而扩展按键是指“方向键”等特殊按键,系统在处理这种扩展键的时候会先有一个写扩展按键信息的时间。因此没有Ex结尾的方法都是用于标准普通按键的,有Ex结尾的方法是用于特殊的扩展按键的。其中他们都有重载,用户可以自己设置间隔时间。至于按键详细分类,请自己上Google搜索。

4、 模拟一次按键事件后,一定要让程序Sleep一些毫秒,否则下一个按键是无法正常模拟出的。

5、 貌似USB走的是总线,和端口操作无关,因此该方法理论上不支持USB接口的键盘。

6、 部分杀毒软件会提醒用户安装驱动,或者将WinIo.sys报为病毒,其实这是正常现象。如果搞这种非正常的事情,杀毒软件当然看不过去。请不要质疑本程序有病毒或木马,最简单的方法就是关闭杀毒软件~。不放心者,请勿使用。

     既然有了这么方便的接口,我们来尝试写个小东西看看威力如何。我们就拿《拳皇》来举例子吧。这款游戏就号称针对Window消息绝对无效。

我们先新建一个EXE工程,并引用我的SuperKeys.dll。定义一个全局变量
WinIoSys m_IoSys = new WinIoSys();
在Load事件中安装驱动
m_IoSys.InitSuperKeys();
在Closed事件中卸载驱动
m_IoSys.CloseSuperKeys();

      我们当然可以写一个全局钩子,在游戏执行的时候,按下某键就可以进行一系列的按键模拟。但是这仅仅是个DEMO,不用搞那么正式,直接写一个计时器来触发好了。为了节约时间,在每次点击button三秒后执行模拟按键操作,在这三秒中要记得把拳皇游戏窗口激活哦。
我们先来统一下键盘设置,如图所示:

      我们决定来模拟“八神”的最简单一招: 暗杀炎(就是从地上放把火过去),如果“八神”在左侧,其键盘操作为::↓↘→+A或C。就是上图中的SDU或SDJ按键。以SDJ为例子,在模拟这个键盘时要非常细心才行,我一开始这样模拟:

m_IoSys.KeyPress(WinIoSys.Key.VK_S);
Thread.Sleep(200);
m_IoSys.KeyPress(WinIoSys.Key.VK_D);
Thread.Sleep(200);
m_IoSys.KeyPress(WinIoSys.Key.VK_J,200);

      结果没有成功。仔细研究了一下,其实我们按SDJ按键的时候,是先将S 按下,再将D键按下,然后弹起S键,再弹起D键,最后再按下J键的。那么真正的过程应该这样写:

m_IoSys.KeyDown(WinIoSys.Key.VK_S);
Thread.Sleep(100);
m_IoSys.KeyDown(WinIoSys.Key.VK_D);
Thread.Sleep(100);
m_IoSys.KeyUp(WinIoSys.Key.VK_S);
Thread.Sleep(100);
m_IoSys.KeyUp(WinIoSys.Key.VK_D);
Thread.Sleep(10); //这个地方不能间隔太大,太大就整个动作连不起来了。
m_IoSys.KeyPress(WinIoSys.Key.VK_J, 200);

经过测试,成功模拟我们想要的操作。大家可以看到实际的模拟按键效果。

 

点击此处下载DEMO

点击此处察看针对《拳皇》的“八神”小特效。

本程序在VS2008 + WinXP SP3 + WinKawaks1.48XP + KOF 2000 + P/S键盘 下调试通过。

让驱动级键盘模拟做更多的事情
除了写游戏外挂外,这个东东还能做什么呢?听说新版的QQ在键盘防盗技术上很好很强大……。

 

转载于:https://www.cnblogs.com/chengchen/archive/2010/03/24/1694260.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

驱动级键盘模拟(C#)(高手请飘过) 的相关文章

随机推荐

  • OpenStack入门篇(二十二)之实现阿里云VPC的SDN网络

    1 修改 etc neutron neutron conf配置 root 64 linux node1 vim etc neutron neutron conf defalut core plugin 61 ml2 service plug
  • 不想说再见~北京

    从事软件开发工作已经第九个年头 慢慢觉得人生就像编程 xff0c 需要不停的面对各种需求通过各种分析对比找到最优技术方案 以往的每次技术问题 xff0c 都能通过各种途径找到最优方案 但是人生很多时候不能尽善尽美 这次的需求有点棘手 xff
  • windows 下 putty 登陆服务器 显示matlab图形界面

    本文需要下载 putty exe 和 pscp exe xff1a http www chiark greenend org uk sgtatham putty download html Xming 主程序和字体 https source
  • 软件工程概论--课后作业1

    作业概况 xff1a 1 网站系统开发所需技术 1 基础内容 网页设计概述 网站设计制作的基本流程 色彩搭配在网站中的应用 网站用户界面的设计 网站广告的设计 网站中表格的使用 网站中层的应用 框架网站的制作 模板网站的制作 使用行为和Ja
  • VNC-Server安装及配置

    一 什么是VNC VNC Virtual Network Computer 是虚拟网络计算机的缩写 VNC 是一款优秀的远程控制工具软件 xff0c 由著名的 AT amp T 的欧洲研究实验室开发的 VNC 是在基于 UNIX 和 Lin
  • (转)Windows 内存管理

    1 xff0e Windows的内存结构 Windows 系统中的每个进程都被赋予它自己的虚拟地址空间 对于 32 位进程来说 xff0c 这个地址空间是 4GB xff0c 因为 32 位指针可以拥有从 0x00000000 至 0xFF
  • Kali系统换源

    安装好kali系统后要选择更换软件源 xff0c 尽量选择国内源 xff0c 更新速度快 在终端中输入 gedit etc apt sources list 打开源列表文件 xff0c 将以下源选择加入其中 xff0c 原来的内容要删除 k
  • SerialPort IOException Workaround in C#

    ref http zachsaw blogspot com 2010 07 serialport ioexception workaround in c html As promised I 39 ve whipped up a quick
  • LVM-逻辑卷常用命令和示意图

    功能 命令物理卷管理卷组管理逻辑卷管理扫描pvscanvgscanlvscan建立pvcreatevgcreatelvcreate显示pvdisplayvgdisplaylvdisplay删除pvremovevgremovelvremove
  • 卷基于快照进行恢复

    基于P版本 xff0c 对卷基于快照进行恢复的源码分析 1 特性描述 在pike版本中 xff0c openstack官网增加了一个新特性 xff0c Cinder volume revert to snapshot xff0c 该特性支持
  • 计蒜客 2019 蓝桥杯省赛 B 组模拟赛(一)

    D题 xff1a 马的管辖 二进制枚举方案 判断该方案是否全部能被覆盖 xff0c 将最优方案存下来并进行剪枝 include lt iostream gt include lt cstring gt include lt cstdio g
  • [bash] 查找替换文件

    bash 查找替换文件 写这个脚本也加深了对 bash 数组的理解 bin bash 2015 11 23 echo e 34 说明 n将文件放在 app tmp class目录下 xff0c 保证该目录下没有其他文件 n备份目录在 app
  • Mac M1芯片 安装Homebrew

    MacBook M1芯片安装代码如下 xff0c 打开终端输入 bin bash c 34 curl fsSL https cdn jsdelivr net gh ineo6 homebrew install install sh 34 看
  • 1.学习大纲

    1 朱有鹏嵌入式Linux核心课程 xff1a https item taobao com item htm spm 61 a230r 1 14 1 1fca1869rWwNpJ amp id 61 45153106151 amp ns 6
  • [工具整理] Debain(KDE)下常用工具

    前言 xff1a Debian安装了KDE桌面环境后 xff0c 发现好多有用的功能没有集成 xff0c 需要自己安装 这里主要介绍 xff1a 截图工具 云盘工具以及KDE上的网络管理工具 0x01 截图工具 xff1a 推荐使用 fla
  • 【转】汽车CAN总线

    概述 CAN xff08 Controller Area Network xff09 总线协议是由 BOSCH 发明的一种基于消息广播模式的串行通信总线 xff0c 它起初用于实现汽车内ECU之间可靠的通信 xff0c 后因其简单实用可靠等
  • 轻松搭建CAS 5.x系列(1)-使用cas overlay搭建SSO SERVER服务端

    概要说明 cas的服务端搭建有两种常用的方式 xff1a 1 基于源码的基础上构建出来的 2 使用WAR overlay的方式来安装 官方推荐使用第二种 xff0c 配置管理方便 xff0c 以后升级也容易 本文就是使用第二种方式 安装步骤
  • vnc连接报错“connection refused (10061)”

    排除 防火墙等等 xff0c 网络设置的错误外 xff0c 登录putty exe 使用以下命令来启动 vnc server 共两行 xff1a service vncserver start vncserver 之后弹出两个warning
  • ST-LINK V2 DIY笔记(一)

    最近一段时间调试STM32板子的时候 xff0c 都是用JLINK 43 杜邦线 xff0c 或者拿官方板子当STLINK用 xff0c 可以用 xff0c 但是体积比较大 xff0c 有时候觉得比较麻烦 正好前一阵手头项目少 xff0c
  • 驱动级键盘模拟(C#)(高手请飘过)

    游戏外挂一般分为三个级别 xff1a 初级是鼠标 键盘模拟 xff0c 中级是Call游戏内部函数 xff0c 读写内存 xff0c 高级是抓包 xff0c 封包的 脱机挂 xff08 完全模拟客户端网络数据 xff0c 不用运行游戏 xf