
전용 앱만 사용할 수 있는 디지털 캔 배지를 AI로 분석하여 Mac에서 이미지를 보낼 수 있도록 만들었다
요약
전용 앱으로만 사용 가능한 디지털 캔 배지의 BLE 프로토콜을 AI를 활용해 분석하고, Mac에서 Python으로 이미지를 전송할 수 있는 환경을 구축한 사례입니다. Flutter 앱 역컴파일과 Bluetooth HCI 스누핑을 통해 고유 데이터 형식을 파악했습니다.
핵심 포인트
- AI를 활용하여 모르는 기술 영역(BLE, 역컴파일 등)의 분석 및 구현 가능
- Flutter 기반 Android 앱의 libapp.so 분석을 통한 데이터 흐름 추적
- Bluetooth HCI 스누핑을 이용한 실제 통신 패킷 및 고유 헤더 규격 파악
- Python Bleak 라이브러리를 사용하여 Mac에서 BLE 데이터 전송 구현
서론
여러분은 해킹을 즐기시나요? 저는 최근 스마트폰에서 이미지나 동영상을 보낼 수 있는 Adget Can-Badge라는 디지털 캔 배지를 구매해서 이것저것 만져보며 놀고 있었습니다. 메인은 '오시카츠(推し活, 좋아하는 대상을 응원하는 활동)'용인 것 같지만, 작은 디스플레이 장치로서 무언가 활용할 수 있을 것 같아 구매했습니다.
youtoy님의 이벤트에 유용할 것 같은 디지털 캔 배지 관련 기사를 보았고, X(구 Twitter)에서도 본 적이 있어 궁금했습니다. 그 후 조금 조사해 보았지만 해킹하는 사람도 없는 것 같아 구매를 망설였습니다. 하지만 지금은 AI가 있으니 어떻게든 되지 않을까 하는 생각에 Amazon Prime Day(?)에 구매해 버렸습니다.
처음에는 Mac에서 직접 데이터를 보낼 수 있다면 Claude나 Codex의 진행 상황을 표시할 수 있지 않을까, 혹은 배지의 터치 조작으로 Claude Code나 Codex를 조작할 수 있지 않을까 기대했지만, 직접 시도해 보니 솔직히 어려워 보였습니다... 일단은 기존의 BLE 기능을 사용하여 Mac에서 이미지를 보내는 것을 목표로 시도하기로 했습니다. 참고로 이 제품에는 기술 적합성(技適) 표시가 제대로 되어 있습니다. 훌륭합니다. 다만, 펌웨어를 변경하면 적합성 문제가 생길 수 있으므로 본체는 변경하지 않고 기존의 BLE 프로토콜만을 이것저것 만져보기로 했습니다.
참고로 시도하기 전에는 Bluetooth, Android, Flutter, 역컴파일(Decompile), 스누핑(Snooping) 모두 개요 정도만 알고 있는 수준이었습니다. 예비 지식으로서 도움이 되었지만 필수적이지는 않았다고 생각합니다. AI에게 무엇을 하고 있는지 질문하여 이해하면, 모르는 영역이라도 비슷한 일을 할 수 있을 것 같았습니다. 최종적으로는 Mac에서 Python으로 자작 이미지를 보낼 수 있게 되어 상당히 만족스러웠습니다 🎉
이번 조사와 구현은 AI에게 맡겼는데, AI는 정말 대단하네요.
지금까지는 제가 이해하고 있는 범위 내에서만 태스크를 맡기고 있었다는 생각이 들었습니다.
자신의 이해를 넓히기 위해서라도 다양한 태스크를 부탁해야겠습니다.
만든 것
최종 프로그램은 심플합니다.
python send_image.py send image.png
Mac 측에서 이미지를 Can-Badge 고유 형식으로 변환하여, Bleak을 통해 BLE로 전송합니다.
IMB는 이미지 크기와 너비·높이를 가지는 36바이트의 고유 헤더입니다. 이미지는 정식 앱과 동일하게 496바이트씩 분할하며, 각 패킷에 1바이트의 체크섬(Checksum)을 붙입니다. 이것들은 BLE의 공통 사양이 아니라, 실제 통신을 통해 판명된 Can-Badge 고유 형식입니다.
어떻게 분석했는가
처음부터 앱을 완전히 분석하지 않고, 쉽게 얻을 수 있는 정보부터 순차적으로 진행했습니다.
실제로 수행한 것은 다음 네 가지입니다.
- BLE 관측하기
Can-Badge에 접속하여 GATT(BLE 접속 후 데이터를 읽고 쓰는 메커니즘)를 조사했습니다. Notification(디바이스 측에서 오는 알림)을 통해 평문 JSON을 발견했고, 길이와 체크섬을 Python으로 확인했습니다. - Android 앱 조사하기
BLE 스캔만으로는 이미지를 보내는 방법까지는 알 수 없습니다. 앱은 Flutter로 제작되었기 때문에, Dart가 컴파일된libapp.so로부터 파일 분할 및 쓰기 흐름을 AI가 추적했습니다. - 실제 통신 보기
정적 분석만으로는 알 수 있는 내용이 줄어들었기에, Android의 Bluetooth HCI 스누핑(Snooping)으로 전환했습니다. 정식 앱의 통신을 통해 고유 헤더와 360×360 JPEG를 분할 전송하고 있다는 것을 알 수 있었습니다. - 진짜를 조금씩 대체하기
먼저 정식 앱의 패킷을 Mac에서 재전송하며 BLE 경로를 확인했습니다. 그다음 자작 이미지로 교체하며, JPEG의 4:2:0과 4:4:4(색 정보를 얼마나 생략할 것인가)의 차이까지 좁혀 나갔습니다. 정식 앱과 동일한 4:4:4로 변경하자 성공했습니다.
AI도 갑자기 전부 완성하는 것이 아니라, 작동하는 부분부터 조금씩 확인해 나갔습니다. 이 접근 방식은 인간이 디버깅할 때와 똑같네요.
AI와 사람의 역할
AI의 진행 방식은 의외라기보다 예상대로라고 해야 할지, 매우 견실했습니다.
- 쉽게 얻을 수 있는 정보부터 시작한다
- 후보는 실제 데이터로 확인한다
- 막히면 목적(Goal)으로 돌아가 다른 관측 방법을 시도한다
- 작은 분석 스크립트를 몇 번이고 만든다
도중에 Claude Code의 사용 한도에 도달했지만, 확정 사항, 가설, 실패, 다음 조작을 NOTES.md에 남겨두었기 때문에 Codex가 그대로 이어서 수행할 수 있었습니다. 긴 조사를 할 때는 사실과 가설을 구분한 메모를 남기게 하면 도움이 됩니다. 인간과 다를 게 없네요.
한편, Mac 측에서의 BLE 통신이 성공하더라도 이미지가 실기(physical device)에 저장되었다고 단정할 수는 없었습니다. "업데이트 중이지만 저장되지 않았다", "이번에는 표시되었다"라고 확인하는 것은 제 담당이었습니다. 왠지 보잘것없는 역할이라고 생각하면서도 실기를 보고 알려주곤 했습니다. 눈(시각 정보)을 갖게 된다면, 더 많은 것을 맡길 수 있을지도 모르겠습니다.
(이쪽도 읽어보세요)
현재 상황에서 사람이 쥐고 있어야 할 부분은 다음과 같다고 생각합니다.
- 지금 AI가 보고 있는 것이 사실인가, 아니면 가설인가
- 이 조작으로 무엇을 확인하려는 것인가
- 검증이 타당한가
- 약관 등에 문제는 없는가
- AI가 전달받은 목적 및 최종 목표를 잊지 않았는가
마치며
혼자서 하라고 했다면 도중에 포기했을 것 같지만, AI가 적절하게 Mac에서 이미지를 보내는 단계까지 해주었습니다. 필요한 타이밍에 구조나 무엇을 하고 있는지 물어봄으로써 이해도 깊어진 느낌입니다.
현재 자신의 스킬셋(Skill set)에 갇히지 않고, AI와 함께 할 수 있는 범위를 계속해서 업데이트하는 것이 중요하다는 것을 느끼는 요즘입니다. 기술 이외에도 관심은 있었지만 시간이 부족해 포기했던 것들을 조금 더 시도해 보려고 합니다. 마케팅이 궁금해지네요.
참고 자료
Discussion

AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기