驱动中实现模拟键盘按键

《Windows内核安全与驱动编程》-第八章-键盘的过滤学习-day-4 键盘的过滤 Hook 分发函数 8.5.4 端口驱动和类驱动之间的协作机制 ​ 当键盘一个键被按下时,产生一个 Make Code 引发键盘中断; 当键盘一个键被松开时,产生一个 Break Code 引发键盘中断。键盘中断导致键盘中断服务例程被执行,最终导致 i8042prt 的 I8042KeyboardInterruptService 被执行。 ​ 在 I8042KeyboardInte... 阅读详情
标 题: 驱动中实现模拟键盘按键
作 者: luocong

在ring3中实现模拟键盘按键有N^N种方式,比如SendInput()、keybd_event()……但在驱动中要怎么模拟呢?

1、写端口大法
#define defI8042_DATA_PORT ((PUCHAR)0x60)
#define defI8042_CTRL_PORT ((PUCHAR)0x64)
#define defOBUFFER_FULL 0x01

BOOLEAN
WaitForKeyboardWrite(VOID)
{
    INT i;
    UCHAR c;

    for (i = 0; i < 1000; ++i)
    {
        KeStallExecutionProcessor(50);
        c = READ_PORT_UCHAR(defI8042_CTRL_PORT);
        if ((c & defOBUFFER_FULL) == defOBUFFER_FULL)
            break;
    }

    return i ? TRUE : FALSE;
}

VOID PressKeyByScanCode(
    IN CONST BYTE ScanCode
)
{
    WRITE_PORT_UCHAR(defI8042_CTRL_PORT, 0xd2);

    WaitForKeyboardWrite();

    WRITE_PORT_UCHAR(defI8042_DATA_PORT, ScanCode);
}

搞定,简单易行!缺点是只对PS/2键盘有效,USB的就一边凉快去吧。

2、构造IRP大法
这个比较麻烦,而且由于某些原因,略……

3、调用KeyboardClassServiceCallback()大法
kbdclass驱动是在I8042prt和kbdhid这两个驱动之上的,所以直接调用它的KeyboardClassServiceCallback()是能对PS/2和USB同时生效的,由于某些原因偶也不想给出具体的代码来。大致指点一下方向:

KeyboaredClassServiceCallback函数的原型如下:

typedef VOID (* PFN_KeyboardClassServiceCallback)(
    IN PDEVICE_OBJECT DeviceObject,
    IN PKEYBOARD_INPUT_DATA InputDataStart,
    IN PKEYBOARD_INPUT_DATA InputDataEnd,
    IN OUT PULONG InputDataConsumed
    );

第一个参数DeviceObject是kbdclass的DeviceObject,怎么得到它呢?思路:先找到kbdclass的DriverObject,然后从DriverObject得到DeviceObject。
第二和第三个参数是KEYBOARD_INPUT_DATA,自己填充,想模拟什么按键就写什么MakeCode和Flags吧。注意第三个参数应该为第二个参数的指针地址值+1。
第四个参数,随便弄个ULONG型的变量给它就行了,反正是可以丢弃的。(I8042prt里面用到了它,但我们自己的模拟按键不用也行)

缺点:每个系统的kbdclass.sys中的KeyboardClassServiceCallback的RVA都不相同,要自己hardcode一下,不过写驱动本来就是那么麻烦,习惯了就好。
 
分享一位大佬开发的驱动级的虚拟键盘鼠标,支持DD键鼠接口 【交流QQ群:901271230】 【接口说明】 HIVM_BTN(int c) 或者 DD_btn 功能: 模拟鼠标点击 参数: 1 =左键按下 ,2 =左键放开 4 =右键按下 ,8 =右键放开 16 =中键按下 ,32 =中键放开 64 =4键按下 ,128 =4键放开 256 =5键按下 ,512 =5键放开 HIVM_MOV(long x,long y) 或者 DD_mo... 阅读详情

相关推荐

键盘驱动java_Java通过JNA调用WinRing0实现驱动模拟按键

package me.kagura;import com.sun.jna.Library;import com.sun.jna.Native;import com.sun.jna.Platform;import com.sun.jna.Pointer;import com.sun.jna.ptr.PointerByReference;import java.util.HashMap;import ...

weixin_35871519的博客 1814

hivm:高级VM(类似于LLVM的小弟)

艾滋病毒 现在,您可能只想阅读和。 入门 Hivm 使用,该应该在大多数 Ruby 安装或通过 Rubygems(通过[sudo] gem install rake )可用。 Hivm 还依赖于其他一些开源库: 3.5 版:JIT 编译器中使用的编译器基础结构 版本 2.*:通用 C 应用程序库 5.1 版:由调试器使用 在 Mac OS X 上,这些应该可以通过 Homebrew 轻松安装: brew install glib llvm lua51 然后你可以通过调用 Rake 来构建项目: git clone https://github.com/dirk/hivm.git cd hivm rake # Will build the library, headers, and so forth rake -T # Will show a list of all avail

java 驱动模拟键盘,纯Java实现跨平台鼠标键盘模拟、找图找色,Java版按键精灵...

/*** 鼠标、键盘、延迟等基本操作*/public static void simple(){Robot robot = new Robot();robot.delay(1000); //延迟等待1秒robot.mouseRightClick(400, 400);//点击鼠标右键robot.delay(300); //延迟等待0.3秒robot.mouseLeftClick(400, 400);...

weixin_39685459的博客 1079

KbdClass键盘过滤驱动以及书中几处错误

《寒江独钓》这本书中的键盘过滤驱动例子中,照着书上的例子抄完,代码有些错误的地方! 书上的例子有3处错误,分别如下: 1)对象类型声明错误 extern POBJECT_TYPE IoDriverObjectType; 修改为以下正确方式 extern POBJECT_TYPE *IoDriverObjectType; 在使用的*IoDriverObjectType地方,也需要修改成正确的方式...

Sven的忘却日记 2044

所有键盘鼠标模拟方式原理及实现

前言: 有一些使用DirectX接口的游戏程序,它们在读取键盘操作时绕过了windows的消息机制,而使用DirectInput.这是因为有些游戏对实时性控制的要求比较高,比如赛车游戏,要求以最快速度响应键盘输入。而windows消息由于是队列形式的,消息在传递时会有不少延迟,有时1秒钟也就传递十几条消息,这个速度达不到游戏的要求。而DirectInput则绕过了windows消息,直接与键盘驱动程序打交道,效率当然提高了不少。因此也就造成,对这样的程序无论用PostMessage或者是keybd_eve

THMAIL的博客 2万+

【原创】驱动实现模拟键盘按键

标 题: 【原创】驱动实现模拟键盘按键 作 者: luocong 时 间: 2007-04-19,11:35:07 链 接: http://bbs.pediy.com/showthread.php?t=42980 在ring3中实现模拟键盘按键有N^N种方式,比如SendInput()、keybd_event()……但在驱动中要怎么模拟呢? 1、写端口大法 #define d

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 2386

驱动模拟按键键盘过滤驱动实现原理与实战

Windows内核驱动开发中,键盘过滤驱动是一种在输入设备栈上插入过滤层、实现驱动模拟按键的关键技术。它通过拦截和构造IRP(I/O请求包),直接在内核态填充KEYBOARD_INPUT_DATA扫描码数据,使注入的按键事件从驱动栈内部产生,比应用层SendInput更难以被检测和屏蔽。这种底层输入模拟能力在自动化测试、远程控制、游戏外挂防护研究及无障碍输入工具中具有重要价值。理解键盘驱动与端口驱动之间的IRP流转,是掌握过滤驱动绑定的核心。从概念到原理,再到环境搭建与代码实现,本文基于VS2013与W

weixin_30954817的博客 345

开发键盘过滤驱动实现模拟按键过程中遇到的问题

如何动态御载键盘过滤驱动     最近写个键盘过滤驱动,遇到的问题是动态御载后再有按键操作就会蓝屏,看了些资料终于明白了原因,写出来供大家参考,免得后来的朋友再重复这个郁闷的过程。     要做到动态御载键盘过滤驱动,明白其工作运行的原理是很重要的。首先必须要知道键盘过滤驱动是工作在异步模式下的,这一点很重要。为了得到一个按键操作,首先需要发送一个IRP_MJ_READ到驱动的设备栈,驱动

rageliu的专栏 5747

WinIO3驱动键盘模拟:绕过钩子实现端口级按键输入

在自动化测试、软件调试和远程控制等场景中,模拟键盘输入是常见需求,但常规API如SendInput、keybd_event依赖Windows消息队列,容易被钩子或安全软件拦截,导致目标程序无响应或被判定为注入。更深层的方案是直接操作键盘控制器(8042)的端口寄存器,从硬件层面写入扫描码,从而绕过消息过滤链路。WinIO3库提供用户态读写I/O端口的能力,无需编写内核驱动即可加载驱动并控制端口0x60,实现接近真实硬件的按键事件。这种驱动模拟在兼容性上表现突出,适用于带有输入校验的办公软件、遗留财务系统及

weixin_42567497的博客 306

开发键盘过滤驱动实现模拟按键过程中遇到的问题___续

上次解决了动态加载和御载的问题,这里主要说说模拟按键的问题.最开始我采用直接保存IRP_MJ_READ后向下CallDriver()传递,要模拟的时候就填数据后IoComplateRequest完成 保存的irp,这样是可以模拟,不过清理过程处理不好,所以模拟后一段时间就出现了蓝屏,提示好象还不是我驱动的错误,居然是kbdclass驱动里面出了问题,显然是我处理irp出了问题.所以我改成了

rageliu的专栏 3180

Windows驱动模拟按键:内核驱动注入键盘事件的原理与实现

在操作系统交互中,模拟键盘输入是一项常见的自动化需求。用户态API(如SendInput)虽能应对普通场景,却难以满足系统级自动化、对抗钩子或登录界面等特殊环境的要求。理解设备驱动与内核输入栈的交互原理,成为突破这些限制的关键。通过编写Windows内核驱动利用键盘过滤设备挂载到输入设备栈,借助IOCTL与应用层通信,能够将伪造的按键事件注入系统输入链,使其如同真实硬件输入般被处理。该技术广泛应用于驱动开发、安全测试、无窗口环境自动化等领域。本文以C++与VS2013为工具,从驱动程序设计到IRP处理,完

weixin_31569671的博客 339

驱动键盘模拟实战:用WinIO3绕过注入检测实现真实按键

在自动化测试、工控软件和外设开发中,模拟键盘输入是绕不开的课题。应用层API如SendInput虽然方便,但会留下注入标志,容易被目标程序识别。驱动键盘模拟通过Ring0层面直接读写8042键盘控制器的I/O端口,将扫描码送入硬件缓冲,使系统无法区分模拟与真实按键。WinIO3作为经典端口访问库,以其体积小、源码开放、接口直接等优势,成为实现该方案的实用工具。本文从键盘输入路径、扫描码原理出发,介绍WinIO3驱动加载、0x60/0x64端口操作及完整代码示例,并分享驱动签名、杀毒拦截、按键丢失等工程坑位

weixin_29315569的博客 345
上一篇: 反NP监视原理(+Bypass NP in ring0
下一篇: 必备绝技--Hook大法( 上 )
iiprogram
博客等级 码龄25年 1066粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值