혈압 측정기 프로토콜을 24시간 만에 역공학하지 못했다
(james.belchamber.com)- 약국에서 Microlife WatchBP O3 혈압 측정기를 착용한 후, 데이터를 직접 확인하려다 장치의 micro-USB 포트를 발견
- Linux 환경에서 WatchBP Analyzer 소프트웨어를 실행했으나 장치 인식 실패, 이후 Windows 가상 머신을 통해 데이터 다운로드 성공
- Wireshark와 usbmon을 이용해 USB 통신을 캡처하고, 데이터 패킷에서 수축기·이완기 혈압 및 심박수가 포함된 바이트 구조를 확인
- 추가로 OPP(진동성 최고압) 와 타임스탬프를 추적했으나, 시간 데이터의 구조는 명확히 해석되지 않음
- 역공학 시도는 마감으로 중단되었지만, 데이터 구조 분석 경험과 ‘백의 고혈압’ 개념을 새로 익힌 사례
혈압 측정기와 초기 시도
- 약국에서 독감 예방주사를 맞은 후 혈압 측정 결과가 높게 나와 24시간 혈압 측정 장치를 착용
- 장치는 30분(주간)·60분(야간) 간격으로 자동 측정
- 장치 측면의 micro-USB 포트를 발견하고 데이터 접근을 시도
- 장치 모델은 Microlife WatchBP O3, 관련 Windows용 WatchBP Analyzer 소프트웨어를 다운로드
- Linux 환경에서 Bottles를 이용해 실행했으나 장치 인식 실패
-
hidraw장치로 표시되며, USB HID 인터페이스를 사용하는 것으로 확인
- 이후 Windows 가상 머신(Gnome Boxes) 을 설치해 USB 장치를 연결하자 데이터 다운로드 성공
- WatchBP Analyzer에서 첫 세 번의 측정값을 확인
USB 트래픽 분석
- 가상 머신 환경을 활용해 Wireshark로 USB 통신을 캡처
-
usbmon3인터페이스를 통해 장치와 호스트 간 데이터 흐름을 기록
-
- 캡처된 패킷에서 혈압 수치가 포함된 것으로 보이는 바이트 시퀀스를 발견
- 예시:
05 0a 89 71 43 9b - 3번째 바이트는 수축기 혈압(SYS) , 4번째는 이완기 혈압(DIA) , 5번째는 심박수(HR) 로 추정
- 예시:
- 여러 측정값을 비교해 데이터 패턴을 정리
- 예:
137/113/67,132/86/68,126/84/82등 - 각 패킷은 32바이트 단위로 구성, 첫 바이트는 유효 데이터 길이(SIGNIFICANT BITS) 표시
- 예:
추가 데이터 구조 탐색
-
OPP(진동성 최고압) 및 타임스탬프를 포함한 추가 바이트를 분석
- OPP 데이터는 각 측정 뒤의 패킷에 존재하나 위치가 일정하지 않음
- SYS, DIA, HR 이후 4바이트를 32비트 타임스탬프로 가정했으나 실제 측정 시각과 불일치
- 6번째 열의 값이 오전·오후 전환 시
82에서83으로 바뀌며, 7번째 열이 초기화되는 패턴을 관찰- 일부 값이 측정 시각의 분 단위와 유사한 경향을 보였으나, 명확한 규칙은 확인되지 않음
AI 및 코드 실험
-
Kagi 플랫폼을 통해 여러 AI 모델에 데이터를 입력해 분석 시도
- 일부는 유효하지 않은 결과를 제시했으나, 엔디언(endianness) 개념 등 분석 방향에 도움을 줌
-
Python으로 장치의 초기 핸드셰이크 및 데이터 다운로드를 모방하려 했으나, AI가 제공한 코드는 대부분 부정확
- 이 과정에서 pyhidapi 라이브러리를 새로 알게 됨
마무리와 교훈
- 장치를 반납해야 하는 일정으로 인해 역공학 작업은 중단
- 과정에서 USB 데이터 구조 분석 및 역공학 실습 경험을 얻음
- 새로 배운 용어로 ‘Normotension’(정상 혈압) 과 ‘White Coat Hypertension’(백의 고혈압) 을 언급
- 주사 직후 혈압 측정 시 일시적으로 높은 수치가 나타날 수 있음
- 결론적으로, 예방접종 직후 혈압 측정은 권장되지 않음
Hacker News 의견
-
고혈압 문제가 있어서 Hilo 기기를 구입했음
팔에 커프를 착용해 보정(calibration) 한 뒤 손목에 작은 장치를 차면, 움직이지 않을 때 주야로 자동으로 혈압을 측정함
데이터는 스마트폰 앱과 동기화되어 저장되고, 커프를 매번 차는 번거로움과 백의 고혈압(white coat hypertension) 을 피할 수 있음
다만 한 달 정도마다 커프로 다시 보정해야 하고, 앱의 카메라로 손가락을 측정하는 기능은 결과가 들쭉날쭉함- 정확도는 어느 정도인지 궁금함
-
AI 관련 글에서 “stupid in ways that made me think”이라는 표현이 있었는데, 이게 바로 AI가 러버덕 디버깅에 유용한 이유를 잘 요약한 문장 같음
동료와 대화할 때보다 더 깊이 생각하게 만들어줌 -
심박수 모니터를 착용하고 데이터를 분석해보니, 심박수가 급상승하는 경우가 두 가지뿐이었음 — 운전할 때와 아내와 대화할 때임
- 과학을 위해 운전하면서 아내와 대화할 때의 데이터도 필요하다고 농담함
- Oura가 헬스장에서의 운동을 스트레스로 인식하는 경우가 있는데, 실제로 운동이 몸에 스트레스를 주는 게 맞다는 의견도 있음
한 수영 선수는 어떤 기기도 쓰지 않고 자신의 심박만 듣는다고 함 - 아마 자동차와 아내 둘 다 사랑해서 그런 거라고 유쾌하게 말함
-
백의 고혈압은 꼭 주사를 맞거나 병원 환경 때문만은 아니고, 단순히 측정 상황의 긴장감 때문일 수도 있음
- 친구가 병원에서 예쁜 간호사에게 혈압을 쟀는데 너무 높게 나와서, 의사가 다시 측정했더니 여전히 높았음
결국 약을 처방받게 되었음 - 병원에 늦을까 봐 뛰어가서 혈압을 쟀더니 너무 높게 나와, 의사가 집에서 조용히 다시 재보라고 권했음
- 아내가 자가면역 질환으로 병원에 자주 가는데, 자동 혈압계가 고장 나서 팔을 계속 조여서 공포스러웠던 적이 있음
그 이후로 아내가 혈압을 잴 때마다 나까지 긴장하게 됨 - 치과 공포증이 심해서, 만약 상시 모니터를 차고 있다면 치과에 있을 때 혈압이 확실히 튈 것 같음
- 나는 ADHD 약 조절 때문에 매일 혈압을 재는데, 같은 조건에서도 수치가 115/75에서 135/90까지 들쭉날쭉함
그래서 평균값만 참고함. 집의 A&D UA-611 Plus나 병원 기기 모두 비슷한 변동을 보임
- 친구가 병원에서 예쁜 간호사에게 혈압을 쟀는데 너무 높게 나와서, 의사가 다시 측정했더니 여전히 높았음
-
데이터 포맷을 분석해보며 연도, 월, 일, 시, 분을 비트 단위로 추정했지만, 비트 반전(reverse) 이 필요한 이유나 빈 구간의 의미는 아직 모르겠음
-
“이걸 역공학하면 혈압이 좋아질 것 같다”는 농담이 너무 공감되어, 읽고 나니 진짜 건강해진 기분이 듦
-
오렌지 주스와 바나나를 하루 두 번 먹었더니 혈압이 142/90 → 125/80으로 내려감
하루 약 2000mg의 칼륨을 섭취하게 됨- 혈압을 낮추기 위해 오렌지 주스와 바나나를 새로 시작한 건지, 중단한 건지 궁금함
-
“stupid in ways that made me think”이라는 문장은 AI의 장점과 한계를 동시에 잘 표현한 요약 같음
- AI는 괜찮은 러버덕이자, 그럭저럭 쓸 만한 검색 엔진임
-
나도 비슷하게 건강 데이터를 직접 관리해보기 시작했음
나이 든 개발자들이 몸의 이상을 느끼며 자기 주도적 건강 관리를 하는 흐름이 늘어날 것 같음
관련 문서를 mikado-aktiia.readthedocs.io에 정리했음- 최신 앱 버전은 Apple Health로 하루 평균값을 내보낼 수 있음
나는 BPExtract로 PDF를 읽어 모든 측정값을 Apple Health로 자동 내보내는데, 수동보다 자동화가 훨씬 낫다고 느낌 - PDF를 읽는 대신 Bluetooth 트래픽을 직접 스니핑하는 게 더 쉬울 수도 있겠다고 제안함
- 요즘은 나이와 상관없이 스스로 건강을 챙겨야 하는 시대라고 느낌
일반의(GP)는 결국 전문의로 가는 신호 역할만 하고, 대기 기간이 너무 길기 때문임
다만 자기 판단이 틀릴 수 있다는 전제를 항상 가져야 함 - 괄호 하나를 빼먹었다고 가볍게 지적함
- 최신 앱 버전은 Apple Health로 하루 평균값을 내보낼 수 있음
-
트래픽 덤프를 보면 프로토콜을 오프라인에서 분석해보고 싶다는 생각이 듦
최근에도 Windows 가상 프린터 드라이버를 역공학(reverse engineering) 하느라 반나절을 보냈는데, 계속하고 싶은 걸 억지로 멈췄음- (스페인어로 된 무관한 댓글은 생략함)