Как я взломал Soundcore: кастомная прошивка и установка DOOM. Часть 1
Расположение UART-контактов на плате
Демонстрация запуска 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. До связи!
Релиз JoJo’s Bizarre Adventure: Golden Spirit состоится 13 августа, а разработчики представили новые трейлеры
Инсайдер сообщил о подготовке двух секретных спецвыпусков Marvel на 2027 год
Для Reanimal выпустили первое дополнение с новой жуткой историй
Инсайдер сообщил о пересмотре планов Lucasfilm на кроссовер в эпоху «Мандалорца»
Завершились съемки второго сезона сериала «Рыцарь Семи Королевств»
Sony зарабатывает на играх для консолей Xbox
Создатели Dead Rising отметили двадцатилетие франшизы на фоне призывов фанатов выпустить новую часть
Konami ответила на критику сломанного патчем ремейка Silent Hill 2 для PlayStation 5