Как я взломал Soundcore: кастомная прошивка и установка DOOM. Часть 1

Демонстрация запуска 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-контактам возникли сложности, потребовавшие дополнительного анализа.

Как я взломал Soundcore: кастомная прошивка и установка DOOM. Часть 1
Расположение 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.

Разработка патчера:
Я начал с оптимизации звуковых сигналов: заменил их на качественные стерео-варианты. Процесс включал:

  1. Детальный анализ кода в Ghidra.

  2. Обнаружение функции-менеджера системных звуков.

  3. Написание Python-скрипта для автоматического патчинга, способного работать с различными версиями прошивок.

Метод поиска функции был оригинальным: я написал экстрактор SBC-файлов, нашел их в прошивке, а затем проследил через перекрестные ссылки (XREF) в Ghidra, какая именно процедура их вызывает.

XREF на звук из функции менеджера звуков
Поиск менеджера звуков через XREF SBC-фреймов

Итоги первого этапа

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

В следующих статьях я поделюсь опытом переноса SDK от PineBuds на данные наушники и деталями реализации DOOM. До связи!

Скрытый текст
 

Источник

Читайте также