6

Bluetooth経由でubuntuからiPhone4にキーストロークを送信しようとしています。つまり、非常に原始的な仮想キーボードの開発です。

問題アプリケーションが iPhone と通信するようにします (つまり、レポート プロトコルを使用します。iPhone がサポートするのはそれだけです)。そのままでは、私のwrite(interruptChannelFD)呼び出しはエラーを返しませんが、iPhone 側にはテキストが表示されません。l2cap チャネルは、blueZ ライブラリを使用して開かれています。

質問 1:それを行う仮想キーボードが存在しないことを考えると、どれくらい難しいですか?

私は、iPhone と Linux ボックスが接続され、接続を維持する段階にいます。問題ありません。また、すべてのperror()呼び出しは、制御チャネル ソケットと割り込みチャネル ソケットが正常に接続されていることを示しています。(私が行っているのは、ドングルを Keyboard デバイス クラスに hciconfig し、Collin Mullinerによるよく知られているコードを少し変更して使用することです。すべてのスマートフォンで要求されるように、パスコードを 1 回入力する必要がありました)。

質問 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);
                    }
4

1 に答える 1

3

良い一日を。

iPadと呼ばれるジャンクで実際に使用できる私の謙虚な休日の時間の浪費を親切に指摘させてください。そのソフトウェアスタックはあなたのiPhoneにかなり近いはずです:https ://github.com/lkundrak/ virtkbd

実際の実装とは別に、私はあなたの質問に答えようとします。

質問1:

Bluetooth HIDプロファイル仕様の品質と長さ、USB HID 1と利用可能なツール、および実際のデバイスの詳細を考えると、試行錯誤によってさらに進むと思います。実際のBluetoothキーボードを用意し、簡単なプロトコルリピーターとダンパーを作成して、それらが何をしているのかを観察できるようにします。ドキュメントを参照して、何が起こっているのかを解読してください。

質問2:

右。私のiPadの場合、最初にデバイスをキーボードクラスではないコンピューターとペアリングする必要があります(iPadはそれ以外の場合はPINを入力させようとしますが、Bluezでは実行できません)。次に、クラスをキーボードに変更し(bithddプログラムを実行して)、iPadを強制的に再接続して、SDPからプロトコル記述子を取得し、L2CAPポート17および19に接続しようとする必要があります。

質問3:

はい、それはほとんどそのようなものです-私はあなたが重要なものを見逃しているとは思わない。

良い1日を!

于 2012-01-02T08:34:28.163 に答える