引文php
在幾年前我買了一個海盜船 K95 Vengeance機械鍵盤,鍵盤有上有背光功能,因而我在考慮是否是能夠修改一下。但做者表示購買來的鍵盤上面沒有不少的資料可供利用,須要注意的是,新版的K95與舊版本的K95的CUE不太同樣,這一點須要注意(點擊我)。html
鍵盤包括一個可自定義安裝的驅動以及須要配置一個稍微麻煩點的應用程序,過去一直嘗試訪問(hid)鍵盤的一些功能,但不是很成功。USB的三種方式分別是, USB UART、USB HID、USB Memory。HID是人性化的接口。這一類通信適用於交互式,有這種功能的設備有:鍵盤,鼠標,遊戲手柄和數字顯示設備。每個USB設備(尤爲是HID或者Memory)都有一個供應商ID(Vendor Id)和產品識別碼(Product Id)。Vendor Id是用來標記哪一個廠商生產了這個USB設備。Product Id用來標記不一樣的產品。git
演示視頻:見文章結尾(主要是安裝驅動以及運行該程序實現的(1,2)github
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驅動編程
鍵盤usb驅動部分可被分紅三部分,MI_00、MI_0一、MI_02。下圖能夠展現出來, MI_02對應驅動與鍵盤兼容,應該單獨拿出來。app
可是如今我還不清楚MI_00與HID鍵盤驅動有什麼具體聯繫。cors
WinUSB驅動配置ide
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 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