- Sau khi đeo máy đo huyết áp Microlife WatchBP O3 tại hiệu thuốc, tác giả muốn tự kiểm tra dữ liệu và phát hiện cổng micro-USB trên thiết bị
- Đã chạy phần mềm WatchBP Analyzer trong môi trường Linux nhưng không nhận ra thiết bị, sau đó tải dữ liệu thành công qua máy ảo Windows
- Dùng Wireshark và usbmon để ghi lại giao tiếp USB, đồng thời xác định được cấu trúc byte trong các gói dữ liệu chứa huyết áp tâm thu, tâm trương và nhịp tim
- Tiếp tục truy vết OPP (áp suất dao động cực đại) và dấu thời gian, nhưng cấu trúc dữ liệu thời gian vẫn chưa được giải mã rõ ràng
- Nỗ lực đảo ngược phải dừng lại vì đến hạn, nhưng đây là một trải nghiệm giúp học thêm về phân tích cấu trúc dữ liệu và khái niệm “tăng huyết áp áo choàng trắng”
Máy đo huyết áp và những thử nghiệm ban đầu
- Sau khi tiêm vắc-xin cúm ở hiệu thuốc, kết quả đo huyết áp cao nên tác giả được đeo thiết bị đo huyết áp 24 giờ
- Thiết bị tự động đo mỗi 30 phút (ban ngày) và 60 phút (ban đêm)
- Tác giả phát hiện cổng micro-USB ở cạnh bên thiết bị và thử truy cập dữ liệu
- Mẫu thiết bị là Microlife WatchBP O3, và tác giả tải xuống phần mềm WatchBP Analyzer cho Windows
- Đã thử chạy bằng Bottles trong môi trường Linux nhưng không nhận ra thiết bị
- Thiết bị hiển thị dưới dạng
hidraw, cho thấy nó sử dụng giao diện USB HID
- Sau đó, tác giả cài máy ảo Windows (Gnome Boxes) và kết nối thiết bị USB, từ đó tải dữ liệu thành công
- Trong WatchBP Analyzer, tác giả xem được ba kết quả đo đầu tiên
Phân tích lưu lượng USB
- Tận dụng môi trường máy ảo để ghi lại giao tiếp USB bằng Wireshark
- Ghi nhận luồng dữ liệu giữa thiết bị và máy chủ thông qua giao diện
usbmon3
- Trong các gói đã ghi, tác giả phát hiện những chuỗi byte có vẻ chứa giá trị huyết áp
- Ví dụ:
05 0a 89 71 43 9b
- Byte thứ 3 được suy đoán là huyết áp tâm thu (SYS), byte thứ 4 là huyết áp tâm trương (DIA), và byte thứ 5 là nhịp tim (HR)
- So sánh nhiều kết quả đo để tổng hợp mẫu hình dữ liệu
- Ví dụ:
137/113/67, 132/86/68, 126/84/82
- Mỗi gói được cấu thành theo đơn vị 32 byte, trong đó byte đầu tiên biểu thị độ dài dữ liệu hợp lệ (SIGNIFICANT BITS)
Khám phá thêm về cấu trúc dữ liệu
- Phân tích thêm các byte chứa OPP (áp suất dao động cực đại) và dấu thời gian
- Dữ liệu OPP xuất hiện trong gói sau mỗi lần đo nhưng vị trí không cố định
- Tác giả giả định 4 byte sau SYS, DIA, HR là dấu thời gian 32 bit, nhưng chúng không khớp với thời điểm đo thực tế
- Quan sát thấy giá trị ở cột thứ 6 đổi từ
82 sang 83 khi chuyển từ sáng sang chiều, và cột thứ 7 bị đặt lại
- Một số giá trị có xu hướng giống với số phút trong thời điểm đo, nhưng không xác nhận được quy luật rõ ràng
Thử nghiệm với AI và mã nguồn
- Tác giả dùng nền tảng Kagi để đưa dữ liệu cho nhiều mô hình AI phân tích
- Một số mô hình đưa ra kết quả không hợp lệ, nhưng vẫn gợi mở hướng phân tích như khái niệm endianness
- Tác giả cũng thử dùng Python để mô phỏng bắt tay ban đầu của thiết bị và quá trình tải dữ liệu, nhưng mã do AI cung cấp phần lớn không chính xác
- Trong quá trình này, tác giả biết đến thư viện pyhidapi
Kết lại và bài học rút ra
- Vì phải trả lại thiết bị theo lịch, nỗ lực đảo ngược buộc phải dừng lại
- Dù vậy, tác giả đã tích lũy được kinh nghiệm thực hành về phân tích cấu trúc dữ liệu USB và đảo ngược
- Những thuật ngữ mới được nhắc đến gồm “Normotension” (huyết áp bình thường) và “White Coat Hypertension” (tăng huyết áp áo choàng trắng)
- Huyết áp có thể tăng tạm thời khi đo ngay sau khi tiêm
- Kết luận là, không nên đo huyết áp ngay sau khi tiêm chủng
1 bình luận
Bình luận trên Hacker News
Vì có vấn đề cao huyết áp nên tôi đã mua thiết bị Hilo
Sau khi đeo vòng bít ở tay để hiệu chuẩn (calibration), chỉ cần đeo một thiết bị nhỏ ở cổ tay là nó sẽ tự động đo huyết áp cả ngày lẫn đêm khi bạn không cử động
Dữ liệu được đồng bộ và lưu trong ứng dụng trên điện thoại thông minh, giúp tránh sự phiền toái phải đeo vòng bít mỗi lần và cả tăng huyết áp áo choàng trắng (white coat hypertension)
Tuy vậy, khoảng mỗi tháng vẫn phải hiệu chuẩn lại bằng vòng bít, và tính năng dùng camera của ứng dụng để đo ở ngón tay cho kết quả khá thất thường
Trong một bài viết về AI có câu “stupid in ways that made me think”, và tôi thấy đây là câu tóm tắt rất đúng lý do AI hữu ích cho rubber duck debugging
Nó khiến tôi phải suy nghĩ sâu hơn cả khi nói chuyện với đồng nghiệp
Sau khi đeo máy theo dõi nhịp tim và phân tích dữ liệu, tôi nhận ra chỉ có hai trường hợp nhịp tim tăng vọt — khi lái xe và khi nói chuyện với vợ
Một vận động viên bơi lội nói rằng anh ấy không dùng thiết bị nào cả, chỉ lắng nghe nhịp tim của chính mình
Tăng huyết áp áo choàng trắng không nhất thiết chỉ do tiêm hay môi trường bệnh viện, mà có thể đơn giản là do căng thẳng của tình huống đo
Cuối cùng người đó được kê thuốc
Từ sau đó, mỗi lần vợ đo huyết áp là đến cả người chồng cũng thấy căng thẳng theo
Vì vậy tôi chỉ xem giá trị trung bình. Cả chiếc A&D UA-611 Plus ở nhà lẫn máy ở bệnh viện đều cho thấy mức biến động tương tự
Khi phân tích định dạng dữ liệu, tôi đã thử suy đoán năm, tháng, ngày, giờ và phút ở mức bit, nhưng vẫn chưa hiểu vì sao lại cần đảo bit (reverse) hoặc ý nghĩa của các khoảng trống
Câu đùa “nếu reverse engineering cái này thì chắc huyết áp sẽ tốt hơn” quá đồng cảm, đọc xong tôi còn thấy như mình khỏe ra thật
Sau khi uống nước cam và ăn chuối hai lần mỗi ngày, huyết áp của tôi giảm từ 142/90 → 125/80
Thành ra mỗi ngày tôi nạp khoảng 2000mg kali
Câu “stupid in ways that made me think” có vẻ là một cách tóm tắt rất hay, vừa nói lên ưu điểm vừa nói lên giới hạn của AI
Tôi cũng bắt đầu tự quản lý dữ liệu sức khỏe của mình theo cách tương tự
Có cảm giác rằng ngày càng nhiều lập trình viên lớn tuổi, khi bắt đầu nhận thấy cơ thể có vấn đề, sẽ chuyển sang quản lý sức khỏe chủ động
Tôi đã tổng hợp tài liệu liên quan tại mikado-aktiia.readthedocs.io
Tôi dùng BPExtract để đọc PDF và tự động xuất toàn bộ kết quả đo sang Apple Health; cảm giác tự động hóa tốt hơn hẳn làm thủ công
Bác sĩ đa khoa (GP) rốt cuộc chỉ đóng vai trò chuyển tiếp sang bác sĩ chuyên khoa, mà thời gian chờ thì quá lâu
Tuy vậy vẫn phải luôn giữ trong đầu rằng phán đoán của bản thân có thể sai
Nhìn traffic dump là lại muốn đem giao thức về phân tích offline
Gần đây tôi cũng đã tốn nửa ngày để reverse engineering một driver máy in ảo trên Windows, rồi phải cố ép mình dừng lại dù rất muốn tiếp tục