В прошлой статье я описал распайку нижнего разъема Яндекс Станции Макс, с помощью которого можно подключить устройство к ПК. Если на Максе не установлен пароль на УСБ, то его можно подключить к ПК и далее делать всё что заблагорассудится.
Вот схема для подключения Станции Макс к ПК:
UART to USB может быть любым, главное выставите на нём уровень сигнала 3.3В и подключите RX Станции к TX конвертера и наоборот TX Станции к RX конвертера.
Как дампить прошивку с запароленного устройства, расскажу как-нибудь потом (там нетривиальная цепочка эксплоитов). К счастью, пароль на USB стоит далеко не на всех устройствах - например, из моих двух Максов пароль есть только на одном (причем, на самом старом).
Расскажу ниже как с помощью pyamlboot сдампить прошивку с устройства.
Сперва требуется скачать pyamlboot (ветка master) куда-нибудь себе на ПК, зайти в папку "files", создать там подпапку "max" и в нее положить файл u-boot.bin.
Файл u-boot.bin, это файл bootloader.img из архива с обновлением для Станции Макс. Как скачивать подобные обновления я писал ранее.
То есть, требуется скачать обновление, распаковать из него bootloader.img и переименовать в u-boot.bin. Файл bootloader.img зашифрован и подписан Яндексом - но как его расшифровать, к счастью, уже известно.
Далее подключаем Станцию Макс к ПК по UART и USB, замыкаем ногу 6 на землю, после чего подаем на Макса питание. На UART должны увидеть такую картинку:
Если загрузка не остановилась на данной строке, а пошла дальше - перепроверьте провода. Если Станция Макс не видит в момент включения USB соединение с ПК, то она после секундной задержки продолжит загружаться.
На ПК должны стоять драйвера на USB устройство с VID_1B8E&PID_C003. Лучше всего установить Amlogic USB Burning Tool (нам подходит ветка 2.х.х), в таком случае драйвера будут установлены им, и в системе появится устройство WorldCup Device.
Далее из папки с pyamlboot запускаем скрипт:
python.exe boot-g12.py -b max
Он загрузит u-boot.bin и остановится в ожидании команд с ПК:
Если скрипт выдал таймауты - перепроверяйте USB провод. В этом плане amlogic очень капризен. Хотя, как мне показалось, под Ubuntu этот скрипт работает намного стабильнее, чем под Windows.
Если pyamlboot выдал "Need Password: 1 Password OK: 0" - вам не повезло, на устройстве стоит пароль на USB и pyamlboot и подобные утилиты работать не будут. Пароль известен только Яндексу, а брутфорсить хеш я бы даже не брался.
Далее - нужна утилита update.exe от Amlogic. Взять ее можно из этого поста на 4pda. Брать надо приаттаченный архив, так как с гита автор удалил утилиты для Windows. Если у вас Ubuntu - тогда можно брать файлы и с гита.
Запускаем такие команды:
update mread store bootloader normal 4194304 bootloader.img
update bulkcmd "store disprotect key"
update mread store reserved normal 67108864 reserved.img
update mread store cache normal 1174405120 cache.img
update mread store env normal 8388608 env.img
update mread store logo normal 8388608 logo.img
update mread store recovery normal 25165824 recovery.img
update mread store misc normal 8388608 misc.img
update mread store dtbo normal 8388608 dtbo.img
update mread store cri_data normal 8388608 cri_data.img
update mread store param normal 16777216 param.img
update mread store boot normal 16777216 boot.img
update mread store rsv normal 16777216 rsv.img
update mread store metadata normal 16777216 metadata.img
update mread store vbmeta normal 2097152 vbmeta.img
update mread store tee normal 33554432 tee.img
update mread store vendor normal 536870912 vendor.img
update mread store odm normal 134217728 odm.img
update mread store system normal 1551892480 system.img
update mread store product normal 134217728 product.img
update mread store sysrecovery normal 1610612736 sysrecovery.img
update mread store data normal 2241855488 data.img
Обратите внимание на команду
update bulkcmd "store disprotect key"
Раздел reserved защищен от чтения (он содержит ключи шифрования для подключения к квазару), и данной командой снимается его защита.
Цифры - это размер соответствующего раздела в байтах. Вот информация о разделах, выдаваемая командой u-boot "amlmmc part 1":
Partition Map for MMC device 1 -- Partition Type: AML
Part Start Sect x Size Type name
00 0 8192 512 U-Boot bootloader
01 73728 131072 512 U-Boot reserved
02 221184 2293760 512 U-Boot cache
03 2531328 16384 512 U-Boot env
04 2564096 16384 512 U-Boot logo
05 2596864 49152 512 U-Boot recovery
06 2662400 16384 512 U-Boot misc
07 2695168 16384 512 U-Boot dtbo
08 2727936 16384 512 U-Boot cri_data
09 2760704 32768 512 U-Boot param
10 2809856 32768 512 U-Boot boot
11 2859008 32768 512 U-Boot rsv
12 2908160 32768 512 U-Boot metadata
13 2957312 4096 512 U-Boot vbmeta
14 2977792 65536 512 U-Boot tee
15 3059712 1048576 512 U-Boot vendor
16 4124672 262144 512 U-Boot odm
17 4403200 3031040 512 U-Boot system
18 7450624 262144 512 U-Boot product
19 7729152 3145728 512 U-Boot sysrecovery
20 10891264 4378624 512 U-Boot data
** Partition 21 not found on device 1 **
Первое число - номер раздела, затем сектор начала, длина раздела в секторах, размер сектора (512), тип (не знаю какие бывают кроме u-boot) и название. Чтобы пересчитать начало данных и их размер из секторов в байты - просто умножаем на 512.
Этой же утилитой можно записать разделы назад после модификации, например, так:
update mwrite env.img store env normal
или так:
update mwrite env.img mem 0x1080000 normal
update bulkcmd "store env write 0x1080000"
Второй способ используется тут.
Есть еще один способ:
update partition env env.img
Мне, правда, ни одним из этих способов не удалось записать раздел большого размера (например, data) - его я записывал через dd, загрузившись в армбиан. Но я пробовал под Windows, возможно, версия утилиты для Linux работает стабильнее.
Команда "update bulkcmd" позволяет выполнять команды бутлоадера, например "update bulkcmd help". Если команда бутлоадера содержит пробелы - надо ее брать в кавычки, как я это делал выше с "store disprotect key"
В pyamlboot есть скрипт bulkcmd.py, который также позволяет выполнять команды u-boot.
U-Boot можно перевести в интерактивный режим таким образом:
update bulkcmd "go 077E83140"
Цифры - это адрес функции cli_loop в U-Boot. Кролика проверяют до нее, так что этой командой заодно и обходится Rabbit Hole. Адрес функции может меняться в разных версиях бутлоадера - мной приведен адрес для версии из данного архива с обновлением.
Как сдампить прошивку одним куском - приведу в другой раз.