2011-09-06 3 views
5

우분투에서 iPhone4로 블루투스를 통해 키 스트로크를 보내려고합니다. 즉, 매우 원시적 인 가상 키보드를 개발한다.HID 보고서 설명자 (iPhone 사용)

문제는 아이폰에 내 응용 프로그램 대화 되세요 (즉 보고서 프로토콜를 사용하여, 그 아이폰이 지원하는 모든입니다). 그대로, 내 write(interruptChannelFD) 호출은 오류를 반환하지 않지만 아이폰쪽에 텍스트가 표시되지 않습니다. l2cap 채널은 blueZ 라이브러리를 사용하여 열었습니다.

질문 1 : 가상 키보드가 없으므로 얼마나 힘들습니까?

저는 iPhone과 내 리눅스 박스가 연결되어 있고 연결되어있는 상태입니다. 아무 문제 없습니다. 또한 모든 perror() 호출은 제어 및 인터럽트 채널 소켓이 잘 연결된다는 것을 알려줍니다. (내가하는 일은 키보드 장치 클래스에 내 동글을 hciconfig하고 Collin Mulliner으로 약간 변경하여 잘 알려진 코드를 사용합니다. 모든 스마트 폰이 필요로하는 것처럼 한 번 비밀번호를 입력해야했습니다.)

질문 2 : 암호화에 대해 걱정하지 않고 인터럽트 소켓에 write()을 입력 할 수 있어야합니다. 맞습니까? 패스 코드를 입력하고 전화가 키보드를 신뢰합니다.

또한

는, 그것이 HID 장치, 설명 이 SPD에 specfied 정확한 보고서의 부트 프로토콜에 거의 관련이 나의 이해이다 (콜린이 가능한 HID 공격을 숙고했지만, 솔직히 연결) - 보고서 형식 어쨌든 해결되었습니다. 그래서 ...

질문 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

좋은 하루, 선생님. 이외에도 https://github.com/lkundrak/virtkbd

:

나를 친절하게 실제로 당신의 아이폰에 합리적인 가까이 있어야 그 소프트웨어 스택 아이 패드라는 정크의 조각, 함께 사용하도록 할 수있다 광산의 겸손 휴가 timewaster로 가리 보자 실제 구현에서 나는 귀하의 질문에 대답하려고합니다.

질문 1 : 블루투스 HID 프로파일 규격의 품질과 길이 감안할 때

는, USB는 하나 개 금형 가능하고 실제 장치의 세부 사항을 HID 내가 더 당신을 데려 갈 것이다 시행 착오를 생각한다. 실제 블루투스 키보드를 가지고 간단한 프로토콜 중계기와 덤퍼를 작성하여 그들이하는 일을 관찰하게하십시오. 문서를 참고하여 무슨 일이 일어나는지 해독하십시오.

질문 2 :

오른쪽. 내 iPad의 경우 먼저 기기를 내 컴퓨터와 페어링해야합니다. 이 아니고이 키보드 클래스입니다 (내 생각에 iPad는 Bluez에서 수행 할 수없는 PIN 입력을 시도합니다). 그런 다음 클래스를 키보드로 변경 (bithdd 프로그램 실행)하고 iPad를 다시 연결하여 SDP에서 프로토콜 설명자를 가져 와서 L2CAP 포트 17 및 19에 연결하려고 시도해야합니다.

질문 3 :

예, 꽤 많이 있습니다. 중요한 것은 놓친다 고 생각하지 않습니다.

좋은 하루 되세요!

+1

+1, btw, 'org.bluez.Agent''RequestPinCode'를 통해 BlueZ를 사용하여 PIN을 입력 할 수 있습니다 (즉, org.bluez.Adapter'를 통해 에이전트로 등록해야합니다.'RegisterAgent').). 또한 2.1 블루투스 기기를 사용하는 경우 PIN을 입력하지 않아도됩니다 (Secure Simple Pairing이 가능하기 때문에) – Hasturkun