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

Дампим прошивку Умной IP камеры Яндекс

Я периодически извлекаю protobuf-ы из свежих прошивок устройств Яндекс и из файла proto\alice\protos\data\device\info.proto узнаю о планируемых Яндексом новинках. Таким образом я узнал о предстоящем выпуске камеры Yandex Camera Mike: и настроил свои скрипты на автоматическую загрузку её прошивок. Описанный еще 2 года назад метод по прежнему работает, но теперь Яндекс стали шифровать загружаемые файлы. Мне стало интересно что же они пытаются скрыть - и я купил себе эту камеру. IP камера Яндекс имеет стандартный USB-C разъем - так что первой мыслью было попробовать использовать "Разъем Type-C папа+мама USB3.1 с платой для распайки 24 вывода" и переходник UART2USB, про которые я писал в конце этой статьи. Подключение работает, но на экране видно всего несколько строк: поиск по строке "miupll_266MHz" дает нам подсказку - установлен процессор SigmaStar (ранее MStar). Если поискать еще немного, то узнаём, что данные чипы предоставляют i2c интерфейс для программирования своих прошивок, и этот

Я периодически извлекаю protobuf-ы из свежих прошивок устройств Яндекс и из файла proto\alice\protos\data\device\info.proto узнаю о планируемых Яндексом новинках. Таким образом я узнал о предстоящем выпуске камеры Yandex Camera Mike:

и настроил свои скрипты на автоматическую загрузку её прошивок. Описанный еще 2 года назад метод по прежнему работает, но теперь Яндекс стали шифровать загружаемые файлы. Мне стало интересно что же они пытаются скрыть - и я купил себе эту камеру.

IP камера Яндекс имеет стандартный USB-C разъем - так что первой мыслью было попробовать использовать "Разъем Type-C папа+мама USB3.1 с платой для распайки 24 вывода" и переходник UART2USB, про которые я писал в конце этой статьи. Подключение работает, но на экране видно всего несколько строк:

-2

поиск по строке "miupll_266MHz" дает нам подсказку - установлен процессор SigmaStar (ранее MStar). Если поискать еще немного, то узнаём, что данные чипы предоставляют i2c интерфейс для программирования своих прошивок, и этот i2c часто выведен на те же ноги, что UART RX/TX, а переключение режимов производится замыканием какого-то контакта на землю.

Сняв нижнюю крышку камеры и прозвонив разъем, видим использование следующих контактов (привожу номер ноги на разъеме внутри камеры и соответствующее ему назначение на разъеме USB):

1 +5В питание
2 USB D-
3
USB D+
4 GND
5 A2 == режим ног 6 и 7 (земля == I2C, иначе UART)
6 A10 == UART TX или I2C SDA
7 A11 == UART RX или I2C SCL
8 на USB не нашел

То есть, снова используется контакт А2, который на других устройствах Яндекс переключал режим загрузки.

Если замкнуть ногу A2 на землю и подать питание на камеру, то видим, что она перестает загружаться. А если подключить в это время ноги A10/A11 к программатору на базе CH341A (не забываем переключить его на 3.3 вольт):

-3

и запустить утилиту i2cdetect, то мы видим картинку в точности как в статье:

-4

Чтобы утилита i2cdetect заработала, устанавливаем драйвер:

git clone https://github.com/frank-zago/ch341-i2c-spi-gpio
cd ch341-i2c-spi-gpio
make
make install

предварительно можно поднять скорость i2c со 100 кГц до 400 кГц:

-5

Теперь идем в поиск по github чего-нибудь относящегося к прошивке SigmaStar, и натыкаемся на статью по раскирпичиванию из проекта OpenIPC.
Далее действуем по инструкции оттуда.

Обновление от 30.06.2025. Утилита snander-mstar работает напрямую с ch341 используя библиотеку libusb и драйвер ch341-i2c для нее не требуется (так что собирать и загружать его не обязательно).

Собираем утилиту snander с поддержкой SigmaStar (MStar):

git clone https://github.com/viktorxda/snander-mstar
cd snander-mstar
make

Обновление от 30.06.2025. В утилите snander-mstar есть баг. Если запись одного блока занимает больше 1 секунды, утилита перестаёт выводить прогресс на экран. А я думал, что она зависает и прерывал ее работу, из-за чего потерял кучу времени.

Для устранения бага требуется исправить файл timer.c, поменяв в 51 строке

if (elapsed_seconds == 1) {

на

if (elapsed_seconds >= 1) {
-6

После изменений - компилируем и запускаем:

sudo ./snander -i

Утилита должна увидеть микросхему NAND на 256 мб:

-7

См выше про баг - я думал, что утилита виснет, поэтому дамп прошивки делал частями по 1 МБ:

-8

и далее собирал файлы в один. Скорость дампа довольно низкая, на всю микросхему уходит порядка 30 часов.
Стабильнее всего драйвер и утилита работают под старой Ubuntu 18.

В первых 4 кб прошивки можно увидеть адреса начала и размеры всех разделов:

Как видно, содержимое NAND не зашифровано
Как видно, содержимое NAND не зашифровано

Красное - адрес начала, зеленое - длина в байтах.

Например, раздел ENV идет с 0x480000 и имеет длину 0x40000. Можно сдампить только его:

sudo ./snander -s -a 0x480000 -l 0x40000 -r env.bin
-10

Но я рекомендую потратить сутки и один раз сдампить прошивку целиком.

Обновление от 12.07.2025. А еще я рекомендую после дампа попробовать смонтировать разделы UBIFS (recovery, ubia, ubib) для проверки их целостности, см инструкцию. Если битые - передампить. Так как у меня оказался битым раздел ubia (rootfs для обычного режима работы камеры), и я потратил целый день на его восстановление через содержимое файла скачанного с урла check_updates (то что обновления теперь стали шифрованы - совершенно не проблема, см скрипт recovery/etc/S80swupdate). Восстановление раздела UBIFS из апдейта оказалось весьма нетривиальной задачей, так как я далеко не эксперт в UBIFS.