通过检查USB上的字节反向工程HID握手
我正试图从一个数据库中提取实时数据 Roel Janssen已经检查了数据包: 我正试图用一个非常小的API()重写这段代码 现在我打算尝试使用通过检查USB上的字节反向工程HID握手,usb,hid,libusb,handshake,hidapi,Usb,Hid,Libusb,Handshake,Hidapi,我正试图从一个数据库中提取实时数据 Roel Janssen已经检查了数据包: 我正试图用一个非常小的API()重写这段代码 现在我打算尝试使用hid\u write,但这次握手可能会发送一个 有没有人可以看看bytestream,看看到底发生了什么 编辑:看起来墨迹暴露了FlashDrive和HID接口,所以我猜这个字节码一定是选择了HID接口并告诉它开始发送数据。但是我可以用一种更优雅的/人类可读的形式来编写它吗 编辑:我有它的工作!hid\u write和hid\u send\u feat
hid\u write
,但这次握手可能会发送一个
有没有人可以看看bytestream,看看到底发生了什么
编辑:看起来墨迹暴露了FlashDrive和HID接口,所以我猜这个字节码一定是选择了HID接口并告诉它开始发送数据。但是我可以用一种更优雅的/人类可读的形式来编写它吗
编辑:我有它的工作!hid\u write
和hid\u send\u feature\u report
都可以工作
hid_device* handle = hid_open(inklingVendorId, inklingProductId, NULL);
jassert(handle != nullptr);
int bytes_written =
hid_send_feature_report(handle, (const unsigned char *)"\x80\x01\x03\x01\x02\x00\x00\x00", 8) +
hid_send_feature_report(handle, (const unsigned char *)"\x80\x01\x0a\x01\x01\x0b\x01\x00", 8) +
hid_send_feature_report(handle, (const unsigned char *)"\x80\x01\x0b\x01\x00\x00\x00\x00", 8) +
hid_send_feature_report(handle, (const unsigned char *)"\x80\x01\x02\x01\x01\x00\x00\x00", 8) +
hid_send_feature_report(handle, (const unsigned char *)"\x80\x01\x0a\x01\x01\x02\x01\x00", 8);
jassert(bytes_written == 5*8);
const int enable_nonblocking = 1, disable_nonblocking = 0;
jassert( hid_set_nonblocking(handle, disable_nonblocking) != FAIL); // want to block
while(true) {
int bytes_got = hid_read(handle, usb_data, 10);
。。。然而,我仍然想了解发生了什么。这是相当令人讨厌的
编辑:lsusb的输出(来自Roel,我手头没有Linux):
1) 验证墨水是否使用HID USB设备类。尝试lsusb-v
并检查输出中的bDeviceClass
或bInterfaceClass
字段(USB人机界面设备类可用于描述设备和接口类。当USB设备可包含多个功能时,使用接口类。从)在手册()据说它是一个USB闪存驱动器,在这种情况下,它使用USB大容量存储设备类(批量传输)
2) 如果是USB HID设备类,您可以尝试获取与此网站类似的功能报告(如果提示发送任何)
libusb\u get\u描述符
发出标准get\u描述符请求,其中
bmRequestType
字段为0x80。必须执行DT_报告描述符请求
指示收件人是一个接口,它需要
bmRequestType
为0x81
你有两个很好的选择。报告描述符均包含在
配置描述符,因此您应该能够获取整个
配置描述符,并对其进行解析以提取报告
描述符
或者,libusb\u get\u描述符
是一个非常薄的层
libusb\u control\u transfer
,因此您可以手动将其展开:
这是USB控制请求的缩写形式
memcpy (&usb_data, "\x80\x01\x0a\x01\x01\x0b\x01\x00", 8);
bytes += libusb_control_transfer (handle, 0x21, 9, 0x0380, 0, usb_data, 33, 0);
因此,所有的字节序列,如
“\x80\x01\x03\x01\x02\x00\x00\x00”
都是用于配置墨迹(“握手”)的命令代码,只有墨迹和Wacom人员能够理解 这是您通过USB发送的一份报告:
80 01 03 01 02 00 00 00 .... (in total the buffer is 1+32 = 33 bytes)
^^ Report ID
这是HID描述符中的相关部分:
...
Item(Global): Report ID, data= [ 0x80 ] 128
Item(Global): Report Size, data= [ 0x08 ] 8
Item(Global): Report Count, data= [ 0x20 ] 32
Item(Main ): Feature, data= [ 0x02 ] 2
Data Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile Bitfield
这意味着报告ID 0x80的数据必须被解释为32乘以一个字节(其含义由驱动程序决定)。这是一项功能,意味着它可以通过控制端点上的GET\u功能
/SET\u功能
报告来配置设备
有关如何解释此描述符的更多信息,请参阅中的HID v1.1规范。谢谢,在我消化此处信息的同时,我更新了我的问题,主要是为了确认您所说的关于lsusb的内容。
memcpy (&usb_data, "\x80\x01\x03\x01\x02\x00\x00\x00", 8);
bytes += libusb_control_transfer (handle,
0x21, // bmRequestType
9, // bRequest
0x0380, // wValue
0, // wIndex
usb_data, // data
33, // wLength
0); // timeout
memcpy (&usb_data, "\x80\x01\x0a\x01\x01\x0b\x01\x00", 8);
bytes += libusb_control_transfer (handle, 0x21, 9, 0x0380, 0, usb_data, 33, 0);
80 01 03 01 02 00 00 00 .... (in total the buffer is 1+32 = 33 bytes)
^^ Report ID
...
Item(Global): Report ID, data= [ 0x80 ] 128
Item(Global): Report Size, data= [ 0x08 ] 8
Item(Global): Report Count, data= [ 0x20 ] 32
Item(Main ): Feature, data= [ 0x02 ] 2
Data Variable Absolute No_Wrap Linear
Preferred_State No_Null_Position Non_Volatile Bitfield