2011-09-06 16 views
5

Sto tentando di inviare sequenze di tasti tramite bluetooth sul mio iPhone4 da ubuntu. I.e., sviluppo di una tastiera virtuale molto primitiva.Descrittore report HID (con iPhone)

Problema Avere il mio discorso applicazione per iPhone (vale a dire utilizzando rapporto protocollo, questo è tutto iPhone supporta). Così com'è, le mie chiamate write(interruptChannelFD) non restituiscono errori, ma non viene visualizzato alcun testo sul lato iPhone. I canali l2cap sono stati aperti usando la libreria blueZ.

Domanda 1: Dato che non esiste una tastiera virtuale che lo faccia, quanto è difficile?

Sono nella fase in cui iPhone e la mia casella linux si connettono e rimangono connessi, nessun problema. Inoltre, tutte le chiamate perror() mi dicono che i socket del canale di controllo e di interrupt si connettono perfettamente. (Quello che faccio è hciconfig il mio dongle alla classe di dispositivo Keyboard e uso il codice noto da Collin Mulliner con una leggera modifica - Ho dovuto inserire un passcode una volta, come tutti gli smartphone richiedono).

Domanda 2: Dovrei riuscire a inserire write() nella presa di interrupt senza preoccuparmi della crittografia, giusto? Ho inserito il codice di accesso e il telefono si fida della tastiera. (Collin stava meditando un possibile attacco HID, ma io collegare onestamente)

Inoltre, è la mia comprensione che nel protocollo di avvio di un dispositivo HID, il rapporto esatto descrittore specfied in SPD è difficilmente rilevante - formato rapporto è fisso comunque. Quindi ...

Domanda 3: mi manca qualcosa di importante sul protocollo rapporto. Quello che faccio è modificare il descrittore del report della tastiera Apple e scrivere nel socket (vedi sotto).

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 

};

Dopo questo, scrivo i seguenti 10 byte nel canale di interrupt:

    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); 
        } 

risposta

2

Buon giorno, signore.

Fammi gentilmente segnalo a voi per un perditempo vacanze umile di mio che è in realtà in grado di essere utilizzato con un pezzo di spazzatura chiamato iPad, il cui stack software dovrebbero essere ragionevoli vicino al iPhone di tuo: https://github.com/lkundrak/virtkbd

parte dall'attuale implementazione, proverò a rispondere alle tue domande.

Domanda 1:

Data la qualità e la durata della specifica del profilo Bluetooth HID, USB HID uno e utensili specifici dispositivi disponibili e quelli effettivi, immagino prova ed errore vi porterà ulteriormente. Avere una tastiera Bluetooth e scrivere un semplice ripetitore di protocollo e dumper per consentire di osservare cosa fanno - fare riferimento alla documentazione per decifrare cosa sta succedendo.

Domanda 2:

destro. Per il mio iPad, ho prima bisogno di accoppiare i dispositivi con il mio computer non di una classe Keyboard (suppongo che l'iPad tenti di farmi inserire un PIN, cosa che non può essere eseguita con Bluez). Quindi ho bisogno di cambiare la classe in Keyboard (eseguendo il mio programma bithdd) e forzare iPad a riconnettersi, in modo che afferri il descrittore del protocollo da SDP e tenti di connettersi alle porte L2CAP 17 e 19.

Domanda 3:

Sì, è più o meno così, non credo che manchi qualcosa di importante.

Buona giornata!

+1

+1, btw, è possibile immettere un PIN utilizzando BlueZ, tramite 'org.bluez.Agent'' RequestPinCode' (ad esempio, è necessario registrarsi come agente tramite 'org.bluez.Adapter'' RegisterAgent'). Inoltre, non è necessario inserire un PIN se si utilizza un dispositivo Bluetooth 2.1 (poiché consentono l'accoppiamento semplice sicuro) – Hasturkun