Найти в Дзене
mamaich

Дампим прошивку Яндекс станции первого поколения

Мой метод получения рута на Яндекс Станции Макс временный (до перезагрузки) и требует ее подключение к ПК через 7-штырьковый разъем внизу колонки. Хочется сделать его постоянным - а для этого потребуется вносить изменения на ЕММС. Так при этом есть риск окирпичивания - нужен донор, который не жалко.

Нашел я на Авито самую дешевую колонку с заблокированной подпиской, оплатил доставку - и только при получении до меня дошло, что я пропёрся и купил станцию первого поколения. В следующий раз буду умнее - а пока что появился новый подопытный, над которым не жалко поиздеваться.

Быстрый поиск информации по реверсингу устройства приводит на форум, где парни описали тестпоинты на плате. Меня интересуют:

UART0 TX: TP136`
UART0 RX: TP137
USB0 D-: TP248
USB0 D+: TP249
FEL: TP250
Reset: TP101
Еще нужна земля, и я взял +5 вольт с коннектора питания, в надежде, что в будущем смогу подключить к Станции флешку.

Припаял провода, подключил к компу через промежуточную плату (которая подходит также и к Макс) - работает. На UART пишется лог загрузки, замыкаю FEL на землю - ПК определяет новое устройство.

На одном из форумов я увидел упоминание утилиты bpi-fel-mass-storage. Идея следующая - через режим FEL на устройство загружается небольшой образ Linux, устройство переводится в режим эмуляции mass storage device и отдает содержимое флешки как диск. Далее этот диск можно править с ПК. Есть GUI (как по мне - бесполезный, скрипты удобнее).

Пробую - в системе обнаруживается дисковое устройство, однако, никаких данных считать с него нельзя ни под Windows, ни под Ubuntu.

Наткнулся, кстати, на особенность.
Сперва я подумал, что у меня на устройстве заблокирован ввод по UART (по аналогии с режимом silent=1 в Станции Макс), так как Станция не реагировала на мой ввод в Putty. По итогу выработал такую последовательность подключения колонки к компу: отключаю вообще всё, закрываю Putty, вставляю USB провод UART2USB в ПК, запускаю Putty и подключаюсь к СОМ порту (вижу черное окно), вставляю питание в колонку (вижу как пошел лог загрузки), после этого вставляю провод USB для FEL и, если надо, перезагружаюсь в FEL. HDMI подключаю последним.

После загрузки в мини Линукс, доступна его консоль. Видно, что есть устройства /dev/mmcblk2*, командой cat получаем их содержимое - судя по текстовым строкам на экране, оно не зашифровано.
Я хочу сдампить содержимое флешки на будущее - чтобы иметь возможность отката при ошибке.

Дампить через СОМ порт - так себе удовольствие, на скорости 115200 уйдет неделя, чтобы забрать 8 гб данных. Но, посмотрев в образ мини Линукса, увидел, что Icenowy любезно подложил туда полный комплект USB Function драйверов, включая RNDIS (у меня не заработал) и также Serial. USB Serial дает вполне неплохую скорость передачи.

Настройка Станции в качестве USB Serial девайса производится по статье.
Сперва выгружаем драйвер USB Storage:

rmmod g_mass_storage
rmmod usb_f_mass_storage

Либо комментируем две предпоследние строки в /initrd рамдиска. Пересобрать рамдиск можно любой кухней для Андроида.

Затем запускаем драйвера USB Serial:

modprobe libcomposite
modprobe u_serial
modprobe usb_f_acm
modprobe usb_f_obex
modprobe usb_f_serial
modprobe g_serial
stty -F /dev/ttyGS0 raw -echo -echoe -echok -echoctl -echoke

Последняя строка настраивает режим ttyGS0. На самом деле нужен только параметр raw, так как остальные параметры действуют на получаемые данные, а мы данные только отправляем.

После этого запускаем на ПК Putty, выбираем появившийся СОМ порт. Скорость ставим любую (в нашем случае USB Serial эту настройку игнорирует), не забываем ставить Flow Control в None, и включаем запись лога "All session output" в файл.

Для теста можно отправить строку:

echo "Hello from target side" > /dev/ttyGS0

Чтобы увидеть ее в Putty. Если строки нет - значит что-то сделано не так. Например, у меня работало нестабильно в USB3 порту на материнке.

Для отправки содержимого флешки Станции используем конструкцию:

cat /dev/mmcblk2 | gzip | base64 > /dev/ttyGS0

base64 я добавил на всякий случай. Хоть он и увеличит время, но избавит от возможных нюансов при работе Putty с бинарными данными.
gzip - хорошо экономит время за счет упаковки данных. Так как в начале флешки много нулей - первые пол гигабайта передаются буквально за минуту.
А вот чтобы получить полностью всю флешку - придется оставить ПК и Станцию на ночь, выгнав интересующуюся новой штуковиной кошку из комнаты.

В процессе отправки периодически смотрим на экран Putty или в лог, что ничего не повисло и данные пишутся. Так как нет терпения - можно зайти в putty.log как в архив (Far Manager понимает и base64 и gzip) и поизучать что надампилось в процессе.

Смотрим - и понимаем, что что-то идет не так :)
Оказывается, при передаче по USB Serial часть байтов теряется, в результате получаем битый архив. И включение назад XON/XOFF в stty и в Putty тут не помогает.

Зато на помощь приходит продвинутая технология 1980ых годов - протоколы передачи через модем: XMODEM, YMODEM, ZMODEM, которые справляются с потерянными байтами.

-f - это я опечатался в имени файла, и не стал исправлять. A ругань на syscall потому что собирал исходник с ильно новым libc, а наше ядро не реализует используемый им syscall 239 == get_mempolcy
-f - это я опечатался в имени файла, и не стал исправлять. A ругань на syscall потому что собирал исходник с ильно новым libc, а наше ядро не реализует используемый им syscall 239 == get_mempolcy

Для получения файлов на стороне Windows используем терминал Tera Term, а под устройство компилирую статический lrszs. Почему он - просто его исходник нагуглился первым.

wget https://ohse.de/uwe/releases/lrzsz-0.12.20.tar.gz
./configure --host=aarch64-linux-gnu --disable-nls
make CC=aarch64-linux-gnu-gcc LDFLAGS=-static

Передаем файлы так:

lsz --ymodem файл_для_передачи </dev/ttyGS0 >/dev/ttyGS0

В тератерме выбираем File - Transfer - Ymodem - Receive. Почему-то Zmodem на устройстве крашится, поэтому указываю Ymodem.

Передача устройств /dev/mmcblk2* через lsz не работает - но это уже мелочи. Мелкие хорошо жмутся в /tmp, а большие можно порубить на куски и передавать частями.

P.S.
Ломать станцию первого поколения как-то даже не спортивно - никакого шифрования данных, нужные тестпоинты известны. Я пока не знаю, как буду использовать это бесполезное приобретение - может выведу УСБ на корпус, соберу какую-нибудь прошивку на базе армбиан, взяв версию ядра, а может и само ядро и драйвера от Яндекса, и приспособлю запускать Kodi или эмулятор приставок вместо не работающего квазара. Всё зависит от свободного времени.

Я не претендую на идеальность данного решения - мне оно самому не нравится, но, главное, что работает. Наверняка есть способы работы с флешкой устройства напрямую без извращений с USB Serial - но я Станцию получил только вчера, и пишу здесь информацию, полученную за первый день исследования.