이 문서는 COBRA IRAD 900 레이더 탐지기의 Bluetooth 프로토콜을 리버스 엔지니어링하기 위해 진행 한 프로세스를 간략하게 설명합니다. 나의 초기 목표는 iOS/Android 애플리케이션을 사용하지 않고도 경고를 처리하기 위해 Bluetooth를 통해 장치와의 Raspberry Pi 3 인터페이스를 사용하여 결국 Raspberry Pi "Carputer"와의 멋진 인터페이스 역할을하는 것이 었습니다.
Bluetooth 프로토콜에 대한 초기 경험이 없었지만 전반적으로 재미있는 학습 경험이었습니다.
이 프로젝트를 처음 시작했을 때 어디서부터 시작 해야할지 전혀 몰랐습니다. 나는 정기적 인 웹 트래픽을 스니핑하는 방법을 알고 있었지만 Bluetooth는 나에게 약간의 블랙 박스였습니다. 빠른 검색으로 Pybluez 라이브러리와 RFCOMM을 통한 의사 소통에 관한 예제를 찾았습니다. 또한 Travis Goodspeed의 흥미로운 블로그 게시물을 포함하여 몇 가지 좋은 리소스를 찾았습니다.
그러나 주제에 대한 지침이 거의 없을 것입니다. 또한 Bluetooth Le가 내가 찾고 있던 것이라고 생각하면서 이와 같은 자원에 많은 시간을 보냈습니다.
오래된 Jailbroken iPhone 5와 함께 놀면서 Btserver를 사용하여 iPhone에서 보내고받은 Bluetooth 트래픽을 기록 할 수있었습니다. 여러 Bluetooth 장치로 둘러싸여 있으면 로그 파일은 빠르게 성장했지만 문제는 많지 않았습니다. 고맙게도 로그는 .pklg 파일로 출력되어 Wireshark에서 관련 패킷을 쉽게 필터링 할 수 있습니다.
패킷 필터 bluetooth.src == B8:92:1D:00:3F:61 사용하여 iOS 앱이 레이더 탐지기로 보내는 원시 패킷을 볼 수있었습니다. 나는 휴대 전화와 레이더 탐지기 사이의 커뮤니케이션에 대한 몇 가지 샘플 기록을 가져 갔고, 일부는 경고가 생성되고 일부는 없었다.
Bluetooth 데이터는 RFCOMM 프로토콜을 통해 전송됩니다. 장치가 처음 연결되면 정보를 앞뒤로 보냅니다. 아마도 설정을 동기화 할 것입니다 (나중에 자세한 내용). 그 후, 두 장치는 서로 예측 가능한 패턴을 따릅니다. 레이더 탐지기는 정기적으로 1/2 초 간격으로 블루투스를 통해 RFComm 패킷을 보냅니다. 시간과 인내심으로 레이더 탐지기에서 iPhone으로 보낸 페이로드 구조를 해독 할 수있었습니다.
페이로드 구조 : 레이더 탐지기 → iPhone
| 목 | 값 (16 진) | 크기 |
|---|---|---|
| 전문 | 55 | 1 바이트 |
| 페이로드 크기 | xx xx | 2 바이트 |
| 행동 | 더블 엑스 | 1 바이트 |
| 예약된 | 00 | 1 바이트 |
| 서열 | 더블 엑스 | 1 바이트 |
| 예약된 | xx xx xx xx xx xx | 6 바이트 |
| 알리다 | 더블 엑스 | 1 바이트 |
| 경고 유형 | 더블 엑스 | 1 바이트 |
| ... | ... | ... |
레이더 탐지기가 실행됨에 따라 위의 형식으로 패킷을 전송합니다. 컴퓨터 네트워킹은 내 전문 분야의 영역이 아니지만 최대한 최선을 다해 설명하려고 노력할 것입니다.
전송 된 프리앰블 바이트는 항상 값 0x55 로 전송됩니다. 이는 이전 패킷에서 계속되는 대신 장치에서 새로운 페이로드 메시지의 시작임을 지정합니다. 그 후에는 나머지 메시지의 크기가 포함 된 2 바이트 값 (처음 3 바이트 이후의 모든 것)입니다. 행동 값은 패킷이 보내는 정보 유형을 지정합니다.
서열 번호는 일이 흥미로워지기 시작하는 곳입니다. 네트워킹에 대한 수업을 들었거나 TCP에 대해 조금 알고 있다면 아마도 그것이 무엇인지 이미 알고있을 것입니다. 레이더 탐지기는 1 바이트 값을 iPhone에 보내고 iOS 응용 프로그램은 동일한 값의 ACK 번호로 응답 해야합니다 . 그렇지 않으면 레이더 탐지기는 무언가가 잘못되었다는 것을 깨닫고 스스로 연결을 끊을 것입니다.
Alert 바이트는 경고가 트리거되는지 여부를 지정합니다. 그렇다면 값 0x41 세트이며 다음 바이트는 전송되는 경보 유형을 지정하는 데 사용됩니다. 실제 레이더 건을 소유하지 않았기 때문에 값에 대해 너무 많이 알 수 없었습니다. 그러나 지시자들의 한 남자는 Arduino를 사용하여 Lidar Gun 시뮬레이터를 만들었습니다. 그것은 패킷을 분석하는 데 많은 도움이되었습니다.
iOS 앱으로 장치에 대한 연결을 유지하려면 올바른 형식으로 응답을 보내야합니다. 고맙게도 레이더 탐지기에 대한 응답은 훨씬 간단하며 9 바이트입니다.
응답 : iPhone → 레이더 탐지기
| 목 | 값 (16 진) | 크기 |
|---|---|---|
| 전문 | 55 | 1 바이트 |
| 페이로드 크기 | xx xx | 2 바이트 |
| 행동 | 02 | 1 바이트 |
| 예약된 | 00 | 1 바이트 |
| ACK | 더블 엑스 | 1 바이트 |
| 예약된 | 00 42 | 2 바이트 |
| 계수기 | 더블 엑스 | 1 바이트 |
앞에서 언급했듯이 ACK 값은 이전에받은 SEQ 값과 동일한 값이어야합니다. 그렇지 않으면 연결이 연결이 끊어집니다. 그것은 충분히 쉬웠습니다. 일부 다른 프로토콜은 클라이언트 점검의 훨씬 덜 명백한 방법을 가질 수 있습니다. 고맙게도 이것은 사실이 아니었다. 흥미롭게도 사용되는 또 다른 counter 변수가 있습니다. 나는 바이트가 무엇인지 알지 못했지만 장치에 대한 각 응답에 대해 1 씩 감소합니다. 이 두 값은 파이썬 스크립트로 코딩하기에 충분히 쉬웠으며 너무 많은 작업을 수행하지 않았습니다.
앞에서 언급했듯이 iOS 앱이 처음 레이더 탐지기에 연결하면 일부 설정과 데이터가 앞뒤로 동기화됩니다. 그 패킷을 알아 내고 분해하는 것은 실제로 내 우선 순위가 아니었고, 나는 이것에 너무 많은 시간을 보내고 싶지 않았습니다. Wireshark에서 전체 패킷 로그를 XML 파일 (data.xml)으로 내보낸 다음 Python Script (Parsedata.py)를 사용하여 나중에 사용하기 위해 정보를 처리하고 저장했습니다.
로드하면 Radar.py는 PacketData.dat 파일 내에서 사전 처리 된 데이터를 열 수 있습니다. 그런 다음 Bluetooth를 통해 레이더 탐지기를 스캔하고 연결하려고 시도합니다. 연결되면 레이더 탐지기는 몇 개의 데이터 패킷을 연결된 장치로 보냅니다. 고맙게도, 그들은 매번 동일한 정확한 순서로 동일한 정확한 패킷입니다. Python 스크립트는 PacketData.dat 파일의 데이터를 수신 한 패킷에 대해 살펴 봅니다. 메인 파이썬 스크립트가 마하의 패킷을 찾으면 레이더 검출기에 해당하는 이전에 기록 된 응답을 보냅니다.
놀랍게도, 그것은 잘 작동했습니다. 그러나 iOS 앱 내에서 설정을 변경하면 데이터 파일을 업데이트해야한다고 생각합니다. 장치를 한 번만 구성해야하고 앱을 다시 사용하지 않기 때문에 문제가 많지 않았습니다.
내가 찾은 모든 정보를 감안할 때, 나는 iPhone의 연결을 모방하는 Python 스크립트를 쓸 수있었습니다. 기록 된 응답 데이터베이스 내에서 패킷을 찾을 수없는 경우 위에서 상기 자세한 구조와 함께 응답 패킷을 구성합니다.
되돌아 보면, 내가 실제로 경험 한 적이없는 일을하는 것은 정말 재미있는 프로젝트였습니다. 컴퓨터 과학 전공으로서, 한 번은 하드웨어로 무언가를하는 것이 흥미로 웠습니다.
Brandon Asuncion // [email protected]
모든 의견/피드백에 감사드립니다!