HID报告描述符(带iPhone)

use*_*235 6 iphone usb bluetooth hid usb-descriptor

我正试图通过蓝牙将键盘从ubuntu发送到我的iPhone4.即,开发一个非常原始的虚拟键盘.

问题让我的应用程序与iPhone通信(即使用报告协议,这是所有iPhone支持).实际上,我的write(interruptChannelFD)调用没有返回任何错误,但iPhone端没有文字出现.已使用blueZ库打开l2cap通道.

问题1:鉴于没有虚拟键盘可以做到这一点,它有多难?

我正处于iPhone和我的linux盒连接并保持连接的阶段,没问题.此外,所有perror()调用都告诉我控制和中断通道套接字连接正常.(我所做的是hciconfig我的加密狗到键盘设备类,并使用Collin Mulliner的着名代码稍作修改 - 我必须输入一次密码,因为所有智能手机都需要).

问题2: 我应该能够在write()不担心加密的情况下进入插槽,对吧?我输入了密码,手机信任键盘.(科林正在考虑可能的隐藏攻击,但我诚实地联系)

另外,据我所知,在HID设备的启动协议中,SPD中指定的确切报告描述符几乎不相关 - 报告格式无论如何都是固定的.所以...

问题3:我是否会错过报告协议的主要内容.我所做的是修改Apple键盘报告描述符并写入套接字(见下文).

const uint8_t hid_spec[] = { 
    0x05, 0x01, // usage page
    0x09, 0x06, // keyboard
    0xa1, 0x01, // collection (Application)
    0x85, 0x01, // report id (0x01)
    0x05, 0x07, // usage page(keyboard)
    0x19, 0xe0, // usage min
    0x29, 0xe7, // usage max
    0x15, 0x00, // logical min
    0x25, 0x01, // logical max
    0x75, 0x01, // report size
    0x95, 0x08, // report count
    0x81, 0x02, // input (dat var abs)

    0x75, 0x08, // report size 
    0x95, 0x01, // report count 
    0x81, 0x01, // input (const)

            // The following two outputs I don't seem to receive
    0x75, 0x01, // report size
    0x95, 0x05, // report count
    0x05, 0x08, // usage page (LEDs)
    0x19, 0x01, // usage min
    0x29, 0x05, // usage max 
    0x91, 0x02, // OUTPUT1 (dat var abs) 

    0x75, 0x03,
    0x95, 0x01,
    0x91, 0x01, // OUTPUT2 (arr,const) 

    0x75, 0x08, // report size
    0x95, 0x06, // report count
    0x15, 0x00, // logical min
    0x26, 0xff, 0x00 // logical max

    0x05, 0x07
    0x19, 0x00
    0x2a, 0xff, 0x00,
    0x81, 0x00,

            // A total of 9 bits sent by now
            // I tried remove the following fields
            /********** BEGIN SNIP
    0x75, 0x01,
    0x95, 0x01,
    0x15, 0x00,
    0x25, 0x01,

    0x05, 0x0c,
    0x09, 0xb8,
    0x81, 0x06,


    0x09, 0xe2,
    0x81, 0x06,


    0x09, 0xe9,
    0x81, 0x02,
    0x09, 0xea,
    0x81, 0x02,
    0x75, 0x01,
    0x95, 0x04,
    0x81, 0x01,
            **** END SNIP/

    0xc0         // end coll
Run Code Online (Sandbox Code Playgroud)

};

在此之后,我将以下10个字节写入中断通道:

                    pkg[0] = 0xa1;   // BT HDR (DATA)
                    pkg[1] = 0x01;   // REPORT ID 0x1 == kbd
                    pkg[2] = modifiers; // Ctrl, Shift, etc
                    pkg[3] = 0x00;    // constant 0 (see descr)
                    // pkg[4] = 0x00; // the key code - entered before this point, according to HID usage tables.
                    pkg[5] = 0x00;
                    pkg[6] = 0x00;
                    pkg[7] = 0x00;
                    pkg[8] = 0x00;
                    pkg[9] = 0x00;

                    if (write(is, pkg, 10) <= 0) {
                        perror("write");
                        exit(-1);
                    }
Run Code Online (Sandbox Code Playgroud)

小智 3

美好的一天,先生。

让我向您介绍我的一个不起眼的假期浪费程序,它实际上可以与一个名为 iPad 的垃圾一起使用,其软件堆栈应该与您的 iPhone 相当接近:https ://github.com/lkundrak/虚拟库

除了实际实施之外,我将尽力回答您的问题。

问题一:

考虑到蓝牙 HID 配置文件规范、USB HID 配置文件规范和可用工具以及实际设备细节的质量和长度,我想尝试和错误会让您走得更远。拥有一个实际的蓝牙键盘,并编写一个简单的协议中继器和转储器,让您观察它们的作用 - 请参阅文档来解密正在发生的事情。

问题2:

正确的。对于我的 iPad,我首先需要将设备与属于键盘类的计算机配对(我的猜测是 iPad 会尝试让我输入 PIN,而 Bluez 无法做到这一点)。然后我需要将类更改为 Keyboard(通过运行我的 bithdd 程序)并强制 iPad 重新连接,以便它从 SDP 获取协议描述符并尝试连接到 L2CAP 端口 17 和 19。

问题3:

是的,几乎就是这样——我认为你不会错过任何重要的事情。

祝你今天过得愉快!