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