在几年前我买了一个海盗船 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用来标记不同的产品。
演示视频:见文章结尾(主要是安装驱动以及运行该程序实现的( 1 , 2 )
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 = 0; i < 10000; 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(150); } } catch (Exception ex) { Console.WriteLine(ex.ToString()); usb.Disconnect(); }
键盘usb驱动部分可被分成三部分,MI_00、MI_01、MI_02。下图可以展示出来, MI_02对应驱动与键盘兼容,应该单独拿出来。
但是现在我还不清楚MI_00与HID键盘驱动有什么具体联系。
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数据包,而其它的一些工具仅仅可以浏览一些日志文件信息。值得注意的是,它们是免费的。当然需要对我的海盗船键盘进行驱动检测,否则就无法捕获目标数据了。
安装winshare时候会自动安装winpcap,同时它提供给wireshark可以接受不同类型的数据包。但现在需要用到USBPcap,最难的一点是利用Wireshark来分析USB协议信息。
第一次运行USBPcapCMD.exe,需要注意的是需要在K95键盘(设备名称)下运行。下面的程序代码中就有关于此(USBPcap2)的信息
C:/>"C:/Program Files/USBPcap/USBPcapCMD.exe" Following filter control devices are available 1 //./USBPcap4 /??/USB#ROOT_HUB#4&39169944&0#{f18a0e88-c30c-11d0-8815-00a0c906bed8} 2 //./USBPcap5 /??/USB#ROOT_HUB#4&3a448a3b&0#{f18a0e88-c30c-11d0-8815-00a0c906bed8} 3 //./USBPcap1 /??/USB#ROOT_HUB#4&dde9a6a&0#{f18a0e88-c30c-11d0-8815-00a0c906bed8} [Port 1] Xbox 360 Big Button IR Controller for Windows (Custom) 4 //./USBPcap6 /??/USB#ROOT_HUB#4&1c7c1fae&0#{f18a0e88-c30c-11d0-8815-00a0c906bed8} 5 //./USBPcap2 /??/USB#ROOT_HUB#4&29e1bf0e&0#{f18a0e88-c30c-11d0-8815-00a0c906bed8} [Port 1] USB Composite Device Corsair K95 Gaming Keyboard Driver USB Input Device HID-compliant consumer control device USB Input Device HID Keyboard Device [Port 2] USB Input Device HID-compliant mouse 6 //./USBPcap7 /??/USB#ROOT_HUB20#4&1602901b&0#{f18a0e88-c30c-11d0-8815-00a0c906bed8} 7 //./USBPcap3 /??/USB#ROOT_HUB20#4&18f82c2c&0#{f18a0e88-c30c-11d0-8815-00a0c906bed8} [Port 4] 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 == 2 && usb.device_address == 1 && (usb.transfer_type == 0x2 || usb.transfer_type == 0x3) Only OUT traffic: usb.bus_id == 2 && usb.device_address == 1 && (usb.transfer_type == 0x2 || usb.transfer_type == 0x3) && usb.endpoint_number.direction == 0
现在就可以点击应用程序上面的按钮然后看到一些信息(URB_CONTROL OUT)。而现在你也可以了解到USB数据传输的重要性。在按键方面可以参照图中的方式,点击右上角那个按键来调节背光灯亮度
我监控到了应用程序和键盘之间传输的数据,但我仅仅强调一条信息就是,背光灯被关闭/开启了(0%-100%)
诠释到自己的程序(WinUSB ): 点击我
// Off usb.ControlOut(0x40, 0x31, 0x0000, 0); // 100% brightness usb.ControlOut(0x40, 0x31, 0x0003, 0);
如果对这个项目感兴趣的小伙伴可以透过文章思路一起来逆向破解键盘吧,在以后的文章中将会对键盘的一些硬件信息进行讨论,比如板载芯片等。以后会在这一方面更多的介绍。
视频观看:
*参考来源: sverrirs ,饭团君投递,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)