2011-09-06 360 views
5

我想通过蓝牙发送击键从我的iPhone4从Ubuntu。 即开发一个非常原始的虚拟键盘。HID报告描述符(与iPhone)

问题有我的应用程序的谈话到iPhone(即使用报告协议,这是所有iPhone支持)。实际上,我的write(interruptChannelFD)调用不会返回错误,但 iPhone侧不会显示任何文本。 l2cap通道已经使用blueZ库打开。

问题1:鉴于没有虚拟键盘存在,它有多难?

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

问题2:我应该可以只将write()插入中断套接字而不用担心加密吧?我输入了密码,手机信任键盘。 (科林琢磨可能HID攻击,但我连诚实)

而且,我的理解是在HID设备,确切的报告 描述 在SPD specfied的引导协议是没有什么关系 - 报表格式无论如何都是固定的。所以...

问题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 

};

在此之后,我写了下面的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); 
        } 

回答

2

你好,先生。

让我亲切地指向你我的一个不起眼的节日timewaster,实际上是能够用一块垃圾的所谓的iPad,其软件堆栈使用应该是合理的接近iPhone你的:https://github.com/lkundrak/virtkbd

除了从实际的实施中,我会尽力回答你的问题。

问题1:

鉴于蓝牙HID轮廓规范的质量和长度,USB HID一个和工具可用,实际设备的细节,我想试错将带您进一步。有一个真正的蓝牙键盘,并写一个简单的协议中继器和翻车机,让你观察他们做什么 - 参考文档来解密正在发生的事情。

问题2:

权。对于我的iPad,我首先需要将设备与我的电脑配对,而不是是一个Keyboard类(我的猜测是iPad否则会尝试让我输入PIN码,这对于Bluez无法完成)。然后我需要将该类更改为Keyboard(通过运行我的bithdd程序)并强制iPad重新连接,以便它从SDP获取协议描述符并尝试连接到L2CAP端口17和19.

问题3:

是的,这很像 - 我不认为你错过任何重要的东西。

祝您有美好的一天!

+1

+1,顺便说一句,可以通过'org.bluez.Agent'' RequestPinCode'使用BlueZ输入一个PIN码(也就是说,您需要通过'org.bluez.Adapter'' RegisterAgent'注册为代理商。 )。如果您使用的是2.1蓝牙设备,则不必输入PIN码(因为那些设备允许安全简单配对) – Hasturkun