引文

在几年前我买了一个海盗船 K95 Vengeance机械键盘,键盘有上有背光功能,于是我在考虑是不是可以修改一下。但作者表示购买来的键盘上面没有很多的资料可供利用,需要注意的是,新版的K95与旧版本的K95的CUE不太一样,这一点需要注意(点击我)。

键盘包括一个可自定义安装的驱动以及需要配置一个稍微麻烦点的应用程序,过去一直尝试访问(hid)键盘的一些功能,但不是很成功。USB的三种方式分别是, USB UART、USB HID、USB Memory。HID是人性化的接口。这一类通讯适用于交互式,有这种功能的设备有:键盘,鼠标,游戏手柄和数字显示设备。每一个USB设备(尤其是HID或者Memory)都有一个供应商ID(Vendor Id)和产品识别码(Product Id)。Vendor Id是用来标记哪个厂商生产了这个USB设备。Product Id用来标记不同的产品。

演示视频:见文章结尾(主要是安装驱动以及运行该程序实现的(12

K95Device usb = new K95Device();
try
{
usb.Connect();
var[] ledbrightness = {LedBrightness.Off, LedBrightness.Low, LedBrightness.Medium,
LedBrightness.High, LedBrightness.Medium, LedBrightness.Low };
// Now cycle through the brightness intensities for the keyboard
for ( int i = ; i < ; i++)
{
usb.SetLedBrightness(ledbrightness[i % ledbrightness.Length]);
// Short wait to let the hardware get ready again and the user to notice the change
Thread.Sleep();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
usb.Disconnect();
}

键盘USB驱动

键盘usb驱动部分可被分成三部分,MI_00、MI_01、MI_02。下图可以展示出来, MI_02对应驱动与键盘兼容,应该单独拿出来。

但是现在我还不清楚MI_00与HID键盘驱动有什么具体联系。

WinUSB驱动配置

Windows USB (WinUSB) 是 Microsoft 提供的 USB 设备的通用驱动程序。WinUSB 体系结构由内核模式驱动程序 (Winusb.sys) 和用户模式动态链接库 (Winusb.dll) 组成。

当前一步完成之后可以按标准来进行WinUSB驱动配置这一步了,在这里我要利用hardware id标识的方法来标记之前每一个需要用到的部分。这里我们将忽略MI_02部分,同时在系统中默认安装USB驱动程序。详细信息:点击我

[MyWinUSBDevice.NTx86]
%DeviceName0%=USB_Install, USB\VID_1B1C&PID_1B08&MI_00
%DeviceName1%=USB_Install, USB\VID_1B1C&PID_1B08&MI_01
; Don't register interface 2 as it is the hid device for the keyboard, let Windows install the default for that
;%DeviceName2%=USB_Install, USB\VID_1B1C&PID_1B08&MI_02
[MyWinUSBDevice.NTamd64]
%DeviceName0%=USB_Install, USB\VID_1B1C&PID_1B08&MI_00
%DeviceName1%=USB_Install, USB\VID_1B1C&PID_1B08&MI_01
; Don't register interface 2 as it is the hid device for the keyboard, let Windows install the default for that
;%DeviceName2%=USB_Install, USB\VID_1B1C&PID_1B08&MI_02
... DeviceName0="Corsair K95 Gaming Keyboard Driver (Custom M0)"
DeviceName1="Corsair K95 Gaming Keyboard Driver (Custom M1)"
; Don't register interface 2 as it is the hid device for the keyboard, let Windows install the default for that
;DeviceName2="Corsair K95 Gaming Keyboard Driver (Custom M2)"

为了更好的区分它们之间的关系,我在它们后面都加上了独特的后缀(自定义Mx),这在设备管理器里面更容易体现出来。

如果想要自定义安装驱动,选择目标驱动然后点击右键,打开“属性”,然后点击“更新驱动程序”,然后选择安装的位置,就开始安装吧。

Winusb.sys 是一种内核模式驱动程序,可在 USB 设备的内核模式设备堆栈的协议驱动程序之上作为筛选器驱动程序或功能驱动程序进行安装。当 Winusb.sys 作为设备的功能驱动程序安装

后,应用程序可以使用这些功能与其进行通信。用户模式流程通过使用一组设备 I/O 控制请求或调用 WinUSB 功能 ( WinUsb_Xxx 函数 )来与 Winusb.sys 进行通信。在这里就是利用WinUSB

来获取键盘数据信息(InPipe)。在下面的测试程序代码可以看出响应信息在第三字节处(其余为0)。

通过测试我可以得出下面的一些结论

MI_00-主要负责LED灯控以及可编程按键按键部分,宏录制功能(MR)、键盘上caps/scroll/num lock键部分。

MI_01-负责音量控制即多媒体功能键(播放、暂停等)

MI_02-负责键盘主要功能(WinUSB),可停止键盘工作。

键盘通信协议

这步相对的难点就是关于通信协议,键盘通信时序按键扫描码存放到内部缓冲存储器后,键盘通过串行通讯,将扫描码传输给计算机。解决问题的最好方法就是在应用程序与键盘之间下手。

最简单的方式就是利用USBPcap以及Wireshark来捕获USB数据包,而其它的一些工具仅仅可以浏览一些日志文件信息。值得注意的是,它们是免费的。当然需要对我的海盗船键盘进行驱动检测,否则就无法捕获目标数据了。

使用USBPcap

安装winshare时候会自动安装winpcap,同时它提供给wireshark可以接受不同类型的数据包。但现在需要用到USBPcap,最难的一点是利用Wireshark来分析USB协议信息。

开始

第一次运行USBPcapCMD.exe,需要注意的是需要在K95键盘(设备名称)下运行。下面的程序代码中就有关于此(USBPcap2)的信息

C:\>"C:\Program Files\USBPcap\USBPcapCMD.exe"
Following filter control devices are available
\\.\USBPcap4
\??\USB#ROOT_HUB#&&#{f18a0e88-c30c-11d0--00a0c906bed8}
\\.\USBPcap5
\??\USB#ROOT_HUB#&3a448a3b&#{f18a0e88-c30c-11d0--00a0c906bed8}
\\.\USBPcap1
\??\USB#ROOT_HUB#&dde9a6a&#{f18a0e88-c30c-11d0--00a0c906bed8}
[Port ] Xbox Big Button IR Controller for Windows (Custom)
\\.\USBPcap6
\??\USB#ROOT_HUB#&1c7c1fae&#{f18a0e88-c30c-11d0--00a0c906bed8}
\\.\USBPcap2
\??\USB#ROOT_HUB#&29e1bf0e&#{f18a0e88-c30c-11d0--00a0c906bed8}
[Port ] USB Composite Device
Corsair K95 Gaming Keyboard Driver
USB Input Device
HID-compliant consumer control device
USB Input Device
HID Keyboard Device
[Port ] USB Input Device
HID-compliant mouse
\\.\USBPcap7
\??\USB#ROOT_HUB20#&1602901b&#{f18a0e88-c30c-11d0--00a0c906bed8}
\\.\USBPcap3
\??\USB#ROOT_HUB20#&18f82c2c&#{f18a0e88-c30c-11d0--00a0c906bed8}
[Port ] USB Mass Storage Device
Portable USB Device

1.再次运行USBPcapCMD.exe,但需要修改一些参数信息(修改“USBPcap2”以及安装路径)“C:\Program Files\USBPcap\USBPcapCMD.exe” -d “\\.\USBPcap2″ -o – | “C:\Program Files\Wireshark\Wireshark.exe” -k -i -”

2.使用其监控键盘来捕获信息,创建一个窗口之后所有的信息都会在上面。由于捕获的信息过多所以需要设置过滤器(更新(bus_id)即更新设备信息(USBPcapX))

USB URB_CONTROL only:
usb.bus_id == && usb.device_address == && (usb.transfer_type == 0x2 || usb.transfer_type == 0x3) Only OUT traffic:
usb.bus_id == && usb.device_address == && (usb.transfer_type == 0x2 || usb.transfer_type == 0x3) && usb.endpoint_number.direction ==

现在就可以点击应用程序上面的按钮然后看到一些信息(URB_CONTROL OUT)。而现在你也可以了解到USB数据传输的重要性。在按键方面可以参照图中的方式,点击右上角那个按键来调节背光灯亮度

我监控到了应用程序和键盘之间传输的数据,但我仅仅强调一条信息就是,背光灯被关闭/开启了(0%-100%)

诠释到自己的程序(WinUSB ):点击我

// Off
usb.ControlOut(0x40, 0x31, 0x0000, ); // 100% brightness
usb.ControlOut(0x40, 0x31, 0x0003, );

结束语

如果对这个项目感兴趣的小伙伴可以透过文章思路一起来逆向破解键盘吧,在以后的文章中将会对键盘的一些硬件信息进行讨论,比如板载芯片等。以后会在这一方面更多的介绍。

视频观看:

*参考来源:sverrirs

技术分享:逆向海盗船k95机械键盘的更多相关文章

  1. fir.im Weekly - 8 个不能错过的 iOS / Android 技术分享

    本期 fir.im Weekly 收集了 2 月下旬新鲜出炉的 iOS /Android 技术分享.源码等,iOS 中图片技术的解压缩.逆向实战.iOS SDK 实践,Android架构思考.Andr ...

  2. iOS逆向工程,(狗神)沙梓社大咖免费技术分享。

    序言 简介:本文针对于广大iOS开发者,作为一名开发者,仅仅专注于一门语言可能已经不适用现在的市场需求,曾经因高薪和需求量巨大,而火爆一时的移动端开发者(Android,ios),如今的路却是不再那么 ...

  3. 20145328 《网络对抗技术》逆向及Bof基础实践

    20145328 <网络对抗技术>逆向及Bof基础实践 实践内容 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回 ...

  4. 20145210姚思羽《网络对抗技术》逆向及Bof基础实践

    20145210姚思羽<网络对抗技术>逆向及Bof基础实践 实践目标 1.本次实践的对象是一个名为pwn1的linux可执行文件. 2.该程序正常执行流程是:main调用foo函数,foo ...

  5. 普通键盘Windows上虚拟Cherry机械键盘效果的方法

    草台班子--普通键盘Windows上虚拟Cherry机械键盘效果的方法    ​ 机械键盘以其独特的手感.绚丽的外形,还有那人神共愤的音效吸引着大批爱好者.最近iQQO 3的机械键盘效果更是吸引了更多 ...

  6. 从零DIY机械键盘/主控方案

    自从有了第一套机械键盘,先后修改了接口方案,安装了LED灯等,但是始终无法满足自己的DIY欲望. 于是想到最简单的方法就是用现成的主控,而主控来源于废弃的键盘,如下图: 这种主控也是矩阵方式,只需要测 ...

  7. 【技术分享】小乖乖的 Linux/Ubuntu 历险记

    本文将同步发布于 WHU-TD 的博客. 这是一篇自带故事背景的博客. 总所周知,写的多,错的多,更何况一个刚刚接触 Linux 的小白.虽然只是介绍一些非常基础的内容,还是希望大家在发现错误时可以及 ...

  8. 老J的技术分享之总结

    老J做IT这块有二十多个年头了,算是中国IT的见证者与参与者.那个时候刚开始接触和了解时,对于他的一些建议,我不是很乐于去接受,因为我觉得他的那一套技术体系不是很适合如今的情况,当时间久了后发现,他对 ...

  9. fir.im Weekly - 新开发时代,需要什么样的技术分享

    "2016年,当我们迎来了如Xcode 8.Swift 3.SiriKit.Android N.Android Instant Apps.React Native等诸多移动开发技术.开发工具 ...

随机推荐

  1. 安装Ubuntu Linux系统时硬盘分区最合理的方法

    无论是安装Windows还是Linux操作系统,硬盘分区都是整个系统安装过程中最为棘手的环节,网上的一些Ubuntu Linux安装教程一般都是自动分区,给初学者带来很大的不便,下面我就根据多年来在合 ...

  2. backbonejs中的模型篇(三)

    一:在模型中使用嵌套属性 Backbone的扩展插件 Backbone-Nested下载并添加引用 1:定义一个新的模型对象,使用Backbone.NestedModel作为其基类对象 var _mo ...

  3. offsetLeft,Left,clientLeft的区别

    offsetLeft,Left,clientLeft的区别 假设 obj 为某个 HTML 控件. obj.offsetTop 指 obj 相对于版面或由 offsetParent 属性指定的父坐标的 ...

  4. Generic泛型

    1.问题 未使用泛型时,元素的类型不安全:操作麻烦,可能需要强制转换import java.util.ArrayList;import java.util.List;import org.junit. ...

  5. 推荐10款非常优秀的 HTML5 开发工具

      HTML5 发展如火如荼,随着各大浏览器对 HTML5 技术支持的不断完善以及 HTML5 技术的不断成熟,未来 HTML5 必将改变我们创建 Web 应用程序的方式.今天这篇文章向大家推荐10款 ...

  6. java入门第五步之数据库项目实战【转】

    在真正进入代码编写前些进行一些工具的准备: 1.保证有一个可用的数据库,这里我用sql server 2000为例,2.拥有一个ide,如ecelise或myeclipse等,这里我使用的是myecl ...

  7. php include

    get_include_path  获取当前 include_path 配置选项的值,在当前代码目录未找到include文件时,则到include_path去include. set_include_ ...

  8. spring mvc与mybatis收集到博客

    mybaits-spring 官方教程 http://mybatis.github.io/spring/zh/ SpringMVC 基础教程 框架分析 http://blog.csdn.net/swi ...

  9. TFS错误 TF31004:在连接带xxx.xxx.xxx.xxx上的Team Foundation Server时遇到错误。请等待几分钟,然后重试。如果问题仍然存在,请与服务器管理员联系

  10. JAVA与指针

    首先,提个问题:JAVA中没有指针,JAVA中有指针,哪个一个对呢? 答:都对,JAVA中没有指针,因为我们不能对指针直接操作,像C++那样用->来访问变量. JAVA有指针,因为JDK中封装了 ...