HID дескриптор отчета (с iPhone) - PullRequest
6 голосов
/ 06 сентября 2011

Я пытаюсь отправить нажатия клавиш через Bluetooth на мой iPhone4 из Ubuntu.Т.е. разработка очень примитивной виртуальной клавиатуры.

Проблема Попросите мое приложение общаться с iPhone (т. Е. Используя протокол отчетов , это все, что поддерживает iPhone).На самом деле, мои write(interruptChannelFD) звонки не возвращают никаких ошибок, но на стороне iPhone нет текста.Каналы l2cap были открыты с использованием библиотеки blueZ.

Вопрос 1: Учитывая, что не существует виртуальной клавиатуры, которая делает это, насколько она сложна?

Я вэтап, на котором iPhone и мой linux box соединяются и остаются на связи, нет проблем.Кроме того, все вызовы perror() говорят мне, что сокеты канала управления и прерывания подключаются очень хорошо.(Что я делаю, так это hciconfig мой ключ к классу устройств Keyboard и использую известный код 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

};

После этого я записываю следующие 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);
                    }

1 Ответ

3 голосов
/ 02 января 2012

Добрый день, сэр.

Позвольте мне любезно указать вам на мой скромный праздник времени, который на самом деле можно использовать с куском мусора под названием iPad, стек программного обеспечения которого должен быть достаточно близок кВаш iPhone: https://github.com/lkundrak/virtkbd

Помимо фактической реализации, я постараюсь ответить на ваши вопросы.

Вопрос 1:

Учитываякачество и длина спецификации профиля Bluetooth HID, USB HID и инструментария, а также специфика устройства, я полагаю, проб и ошибок приведет вас еще дальше.Имейте настоящую клавиатуру Bluetooth и напишите простой ретранслятор протокола и дампер, чтобы вы могли наблюдать за тем, что они делают - обратитесь к документации, чтобы расшифровать происходящее.

Вопрос 2:

Верно.Для моего iPad мне сначала нужно соединить устройства с моим компьютером , а не , принадлежащим к классу Keyboard (я предполагаю, что iPad в противном случае пытается заставить меня ввести PIN-код, что невозможно сделать с помощью Bluez).Затем мне нужно изменить класс на Keyboard (запустив программу bithdd) и принудительно подключить iPad, чтобы он извлекал дескриптор протокола из SDP и пытался подключиться к портам L2CAP 17 и 19.

Вопрос 3:

Да, это очень похоже - я не думаю, что вы упускаете что-то важное.

Хорошего дня!

...