Реверс-инжиниринг¶
Протокол восстановлен по дампам USB-трафика вендорской утилиты.
Дампы снимались в Windows через Wireshark с фильтром USBPcap, затем разбирались скриптом misc/analyze_pcap.py.
Методика¶
- Снять полный захват операции:
begin → data-begin → payload → commit → save. - Распарсить захват в лог control-трансферов.
- Сравнить соседние операции, которые отличаются одним параметром.
- Проверить гипотезу на железе без записи во флеш.
- Закрепить результат тестом на подменном устройстве.
Для карты клавиш использовался отдельный приём: несколько индексов красились контрастными цветами, после чего проверялось, какие клавиши загорелись. Тёмные и холодные цвета на дальних клавишах плохо заметны, поэтому для картирования берут максимально контрастные цвета и мало точек за раз.
Инструменты¶
| Инструмент | Назначение |
|---|---|
misc/analyze_pcap.py |
USBPcap → лог SET и GET control-трансферов |
misc/keymap.py |
Карта LED-индексов, слепые слоты и таблица алиасов |
misc/probe.py |
Чтение feature-репортов, состояние клавиатуры не меняет |
misc/iokit_probe.py |
Диагностика открытия HID на macOS с точным кодом IOReturn |
misc/dataset.py |
Пути к дампам из manifest.json |
misc/make_ts_fixtures.py |
Фикстуры для тестов приложения |
misc/make_layout.py |
Геометрия клавиатуры для окна приложения |
Запуск парсера:
gzip -dc raw-data/katana-v1/color-modes/01-static.pcapng.gz > /tmp/01-static.pcapng
./misc/analyze_pcap.py /tmp/01-static.pcapng /tmp/01-static.plain.txt
Без второго аргумента результат пишется в /tmp/tx_log.txt.
Формат строки лога:
if— номер интерфейса, конфиг-канал имеетif=0;t—21дляSET_REPORT,a1дляGET_REPORT;rid— report id, у всех команд равен00;- пакеты
GETсклеиваются поirpid: setup и data приходят разными записями, парсер сопоставляет их автоматически.
Проверка на железе¶
Проверять гипотезу нужно без save, чтобы не изнашивать флеш.
Для этого подходят:
katana.py mode ... --no-save;katana.py raw ... --no-save;katana.py paint ... --no-save;katana.py keysдля чтения живого кадра.
После экспериментов полезно вернуть рабочее состояние командой default или применить сохранённый профиль.
На macOS запись feature-репортов система не разрешает: проверка гипотез с записью возможна только на Linux.
Важные грабли¶
pyusbсdetach_kernel_driverломает печать: используйте только hidraw.- Сессия без
04 f0клинит прошивку. - После клина
resetможет не помочь с первого раза: повторите с паузой 5–10 секунд. f5сbeginиdata-beginвозвращает мусор:data-beginобезоруживает поток.- Ответ
ffнаbeginозначает открытую сессию, и это нормально. - Слепые слоты прошивка принимает молча.
- Пользователь различает цвета приблизительно, поэтому для картирования нужны контрастные цвета и мало точек за раз.
Датасет¶
Сырые дампы лежат в raw-data/katana-v1/.
Пути собраны в manifest.json: в секции sets перечислены наборы, в секции refs — файлы-эталоны для тестов.
| Набор | Содержимое |
|---|---|
color-modes/ |
20 дампов: по одному на каждый режим и на выключение |
keybind/ |
Сброс и привязка действий, кнопки мыши, шорткаты, макрос |
_old/ |
Архив: полные шкалы яркости и скорости, стриминг, запись макросов |
Новые дампы систематичны: в color-modes/ на каждый режим приходится полный набор параметров и поток кадров, а keybind/ покрывает сброс и привязку макроса.
Чего нет в новых дампах: полных шкал яркости и скорости, стриминга 04 20, записи и исполнения реального макроса — за этим обращайтесь к _old/.
Подробный состав — в разделе Дампы.
Открытые вопросы¶
- Другие типы действий в переназначении: Fn-слой и прочие записи канала
04 11. - Чтение таблицы переназначений из прошивки.
- Чтение содержимого макросов из прошивки.
- Смысл поля «число событий × 2» в заголовке блоба макросов.
- Реальный лимит макросов: заголовок рассчитан на 100 слотов, а данных хватает на несколько десятков событий.
- Сохранение макросов между переподключениями USB.
- Коллизия кодов
05и06в макросах. - Коды стрелок Up и Down и остальные медиа-клавиши макросов.
Что проверено¶
| Область | Статус |
|---|---|
| Транспорт | Linux и macOS, проверено на железе |
| Транзакции и ACK | Проверено на десятках команд |
| Режимы подсветки | Все 19 режимов и выключение |
| Раскраска | Запись и чтение живого кадра |
| Переназначения | Мышь, шорткаты, мультимедиа и макросы |
| Макросы | Запись, привязка и вендорский XML |
| Карта клавиш | Все 143 слота, 104 физические клавиши |
| Чтение таблиц | Не реализовано: каналы чтения неизвестны |