Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过检查USB上的字节反向工程HID握手_Usb_Hid_Libusb_Handshake_Hidapi - Fatal编程技术网

通过检查USB上的字节反向工程HID握手

通过检查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

我正试图从一个数据库中提取实时数据

Roel Janssen已经检查了数据包:

我正试图用一个非常小的API()重写这段代码

现在我打算尝试使用
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