Демонстрация запуска DOOM на наушниках (технические подробности порта будут раскрыты в следующих материалах):
Часть 1: Аппаратная начинка, программная среда и разработка патчера для стоковой прошивки
Около года назад я задался целью исследовать программную и аппаратную составляющую моих наушников soundcore Life Q35. Моей амбициозной задачей была модификация прошивки, а в идеале — запуск культового шутера DOOM (спойлер: задумка увенчалась успехом).
soundcore Life Q35 работают на базе SoC Bestechnic BES2300P (архитектура YP).
Ключевые параметры чипа:
-
Двухъядерный ARM Cortex M4F с тактовой частотой до 300 МГц.
-
4 МБ Flash-памяти.
-
Около 1 МБ SRAM.
Подробную документацию можно изучить по этой ссылке.
С чего всё началось: разборка и снятие дампа
Первые шаги заключались в попытках перехватить трафик мобильного приложения soundcore. Я скачал обновление прошивки с серверов через обычный curl, попытался декомпилировать файл, но на тот момент забросил исследование.
Спустя полгода я подошел к вопросу основательно. Вооружившись UART-адаптером, паяльником и преодолев страх окончательно вывести гарнитуру из строя, я приступил к полноценной разборке. Информации по распиновке в сети не было, так что пришлось исследовать плату в левой чаше самостоятельно. После подключения к UART-контактам возникли сложности, потребовавшие дополнительного анализа.

Существующие инструменты от сообщества openpinebuds (репозиторий — огромный респект проекту pine64!) и официальный SDK дали надежду на успех. Однако возник вопрос: как считать дамп, если стандартные инструкции предполагают наличие зарядного кейса, которого у полноразмерных наушников нет?
Наблюдая за поведением устройства, я заметил, что при нажатии клавиши ANC на выключенных наушниках динамик издает характерный треск. Это натолкнуло меня на мысль о режиме загрузчика. Экспериментальным путем я установил: если запустить утилиту bestool и удерживать кнопку ANC при включении, наушники отправляют sync-пакет в UART и переходят в сервисный режим, открывая доступ к памяти.
Структура прошивки
После получения дампа встал вопрос анализа. Утилита Binwalk не дала внятных результатов, поэтому пришлось заняться ручным разбором. Метаданные в конце файла помогли определить архитектуру и параметры:

Стало ясно, что прошивка базируется на RTOS RTX. Информация об оффсетах разделов значительно облегчила последующую работу в Ghidra.
Зачем вообще модифицировать наушники?
Меня тяготил ряд недоработок заводского ПО:
-
Низкокачественные «роботизированные» голосовые уведомления (16 кГц, моно), которые невозможно отключить.
-
Периодические аудио-артефакты при низком заряде аккумулятора.
-
Эффект «гейтирования» при проводном подключении: тихие звуки просто пропадали.
Моя цель — добиться полного контроля над аппаратным обеспечением.
Реверс-инжиниринг в Ghidra
Для корректной декомпиляции крайне важна правильная база. Для её поиска я использовал basefind2:
python basefind2.py firmwareflash.bin
scanning binary for strings
len>=10…
total strings found: 4516
scanning binary for pointers…
total pointers found: 225712
finding differences of length: 10
possible offset 0x1ffe7404 06.20%
possible offset 0x3c000000 76.17%
Советы по загрузке прошивки:
-
Всегда проверяйте метаданные — часто там уже указаны нужные адреса.
-
Иногда полезно добавить смещение
0x4000000, если адрес указывает на non-cached область. -
При использовании файлов обновлений OTA учитывайте, что
OTA_BOOTотсутствует в апдейте, поэтому нужно корректировать базовый адрес на величинуOTA_CODE_OFFSET.
Разработка патчера:
Я начал с оптимизации звуковых сигналов: заменил их на качественные стерео-варианты. Процесс включал:
-
Детальный анализ кода в Ghidra.
-
Обнаружение функции-менеджера системных звуков.
-
Написание Python-скрипта для автоматического патчинга, способного работать с различными версиями прошивок.
Метод поиска функции был оригинальным: я написал экстрактор SBC-файлов, нашел их в прошивке, а затем проследил через перекрестные ссылки (XREF) в Ghidra, какая именно процедура их вызывает.

Итоги первого этапа
Результатом моих изысканий стал проект openqore и утилита qorepatcher. В ближайшем будущем планируется масштабное обновление, внедряющее возможность OTA-прошивки кастомным ПО.
В следующих статьях я поделюсь опытом переноса SDK от PineBuds на данные наушники и деталями реализации DOOM. До связи!


