---
title: "로지텍 마우스에 2바이트 데이터를 저장해봤다"
published: 2026-03-21T23:26:53.000Z
canonical: https://jeff.news/article/876
---
# 로지텍 마우스에 2바이트 데이터를 저장해봤다

로지텍 MX Vertical 마우스를 초소형 USB 드라이브처럼 쓰려고 HID++ 2.0 프로토콜을 Rust로 탐색한 삽질기. 33개 피처를 열거하고 여러 레지스터에 write를 시도한 끝에, DPI 레지스터(0x2201)에 임의의 u16 값을 쓸 수 있다는 걸 발견했지만 전원 꺼지면 날아가는 세션 스코프 2바이트가 전부였음.

- 로지텍 MX Vertical 마우스가 컴퓨터 사이를 물리적으로 오가니까, 이걸 초소형 USB 드라이브처럼 쓸 수 있지 않을까 하는 아이디어에서 시작된 삽질기임
- Logitech 마우스는 표준 USB HID 위에 자체 구축한 HID++ 2.0 프로토콜로 통신하는데, Rust로 직접 도구를 만들어서 마우스가 노출하는 피처를 열거해보니 총 33개가 나옴. `EnableHiddenFeatures`나 `TemplateBytesNVS` 같은 흥미로운 이름들이 있었지만 대부분 문서화가 안 되어 있음
- 처음에 노린 건 `PersistentRemappableAction`(0x1c00) 피처였는데, macOS의 IOHIDManager가 긴 HID++ 리포트 포맷을 조용히 드롭해버림. 에러도 없고 설명도 없어서, 프로브 코드 잔뜩 짜놓고 빈 응답만 한참 쳐다본 끝에야 원인을 알게 됨
- 디바이스 이름 레지스터도 시도해봤는데, write 콜은 받아주면서 실제로는 완전히 무시하고 계속 "MX Vertical"만 반환함. 공감 가는 리액션이라는 원작자의 코멘트가 웃김
- 결국 유일하게 동작한 건 DPI 레지스터(0x2201)였음. 임의의 u16 값을 쓸 수 있고, 마우스 전원이 켜져 있는 동안에는 리시버를 다른 컴퓨터로 옮겨도 값이 유지됨
- 다만 이건 active DPI만 변경하는 거라 전원이 꺼지면 fallback 값으로 복원됨. 즉 진정한 persistent storage가 아니라 **크로스 컴퓨터 세션 스코프 2바이트 저장소**인 셈임
- 기본 DPI 값은 HID++로 노출되지 않는 펌웨어 영역에 저장되어 있거나, 벤더 전용 도구 혹은 서명된 커맨드로만 쓸 수 있는 것으로 추정됨
- 결과물은 객관적으로 쓸모없지만, HID++ 프로토콜 구조, macOS의 HID 디바이스 커널 레벨 관리 방식, 피처 테이블과 피처 인덱스의 차이 등을 직접 삽질하면서 배운 과정 자체가 핵심이었음

## 핵심 포인트

- HID++ 2.0 프로토콜로 마우스 피처 33개를 열거, 대부분 문서화 안 됨
- macOS IOHIDManager가 긴 HID++ 리포트를 조용히 드롭해서 PersistentRemappableAction 접근 불가
- 디바이스 이름 레지스터는 write를 받아주고 무시하는 가스라이팅 구현
- DPI 레지스터(0x2201)에 임의의 u16 값 저장 가능하나 전원 꺼지면 소멸
- 결과: 크로스 컴퓨터 세션 스코프 2바이트 저장소 달성 (객관적으로 쓸모없음)

## 인사이트

실용성은 제로지만, HID++ 프로토콜 리버스 엔지니어링 과정 자체가 하드웨어-소프트웨어 경계에서의 탐색이 어떻게 이루어지는지 잘 보여주는 사례임. 개발자라면 공감할 수밖에 없는 전형적인 '삽질했지만 배운 게 많다' 유형의 글.
