- PVSM.RU - https://www.pvsm.ru -
Не так давно приобрёл на Aliexpress IP камеру (чип Hi3516 платформа 53H20L) и 16-канальный гибридный видеорегистратор (чип Hi3521 платформа MBD6508E). Оба выполнены на чипсете от HiSilicon, так что проблем с совместимостью между собой не испытывают.
Разумеется, не обошлось и без глюков. Первый, и самый главный — у камеры криво работал WiFi — нельзя было подключиться к сети, если ключ был задан в HEX виде, а таже периодически возникала проблема со шлюзом по умолчанию.
Прошивка оказалась старая, ещё июньская. Раздобыл несколько свежих прошивок [1] и попробовал. Некоторые оказались глючными, но одна заработала нормально.
Возникла другая проблема — изменился пароль по умолчанию для telnet подключения. Этого я не стерпел и стал искать способы вернуть его обратно.
Сразу предупрежу, что данный способ опробован на видеорегистраторах и камерах на чипах HiSilicon, но должен сработать и с другой платформой, так как китайцы широко используют загрузчик U-boot.
Инструкция по распаковке довольно подробно расписана в этой статье [2], но вот процесс упаковки нигде не описан, что и побудило меня написать этот пост.
Расписываю по шагам, чтобы ничего не упустить:
Ставим Linux, я выбрал ubuntu.
Проверяем тип файла прошивки:
root@xc:~/firmware# file General_HZXM_IPC_HI3516C_53H20L_V4.02.R11.20131108_ALL.bin
General_HZXM_IPC_HI3516C_53H20L_V4.02.R11.20131108_ALL.bin: Zip archive data, at least v2.0 to extract
Распаковываем:
root@xc:~/firmware# unzip General_HZXM_IPC_HI3516C_53H20L_V4.02.R11.20131108_ALL.bin
Archive: General_HZXM_IPC_HI3516C_53H20L_V4.02.R11.20131108_ALL.bin
inflating: Install
inflating: u-boot-all.bin.img
inflating: web-x.cramfs.img
inflating: custom-x.cramfs.img
inflating: user-x.cramfs.img
inflating: romfs-x.cramfs.img
inflating: logo-x.cramfs.img
inflating: InstallDesc
Смотрим содержимое Install:
{
"Commands" : [
"burn custom-x.cramfs.img custom",
"burn romfs-x.cramfs.img romfs",
"burn user-x.cramfs.img user",
"burn logo-x.cramfs.img logo",
"burn web-x.cramfs.img web"
],
"Devices" : [
[ "53H20L", "1.00" ]
]
}
InstallDesc:
"UpgradeCommand" : [
{
"Command" : "Burn",
"FileName" : "u-boot-all.bin.img"
},
{
"Command" : "Burn",
"FileName" : "custom-x.cramfs.img"
},
{
"Command" : "Burn",
"FileName" : "romfs-x.cramfs.img"
},
{
"Command" : "Burn",
"FileName" : "user-x.cramfs.img"
},
{
"Command" : "Burn",
"FileName" : "web-x.cramfs.img"
},
{
"Command" : "Burn",
"FileName" : "logo-x.cramfs.img"
}
],
"Hardware" : "53H20L",
"Vendor" : "General"
}
Слово u-boot-all наводит на мысль, что файлы img являются образами загрузчика U-boot, поэтому ставим соответствующий пакет:
root@xc:~/firmware# apt-get install u-boot-tools
Смотрим, что за файлы у нас были в архиве:
root@xc:~/firmware# file u-boot-all.bin.img
u-boot-all.bin.img: u-boot legacy uImage, linux, Linux/ARM, Firmware Image (gzip), 524288 bytes, Fri Nov 8 05:15:49 2013, Load Address: 0x00000000, Entry Point: 0x00080000, Header CRC: 0x8A551AA8, Data CRC: 0x8290AD90
root@xc:~/firmware# file romfs-x.cramfs.img
romfs-x.cramfs.img: u-boot legacy uImage, linux, Linux/ARM, OS Kernel Image (gzip), 4100096 bytes, Fri Nov 8 05:16:04 2013, Load Address: 0x00080000, Entry Point: 0x00580000, Header CRC: 0xD16AC90F, Data CRC: 0x54CDD868
root@xc:~/firmware# file user-x.cramfs.img
user-x.cramfs.img: u-boot legacy uImage, linux, Linux/ARM, OS Kernel Image (gzip), 7602112 bytes, Fri Nov 8 05:16:02 2013, Load Address: 0x00580000, Entry Point: 0x00CC0000, Header CRC: 0x106C19AD, Data CRC: 0x6D54ADA7
root@xc:~/firmware# file web-x.cramfs.img
web-x.cramfs.img: u-boot legacy uImage, linux, Linux/ARM, Standalone Program (gzip), 1572800 bytes, Fri Nov 8 05:15:51 2013, Load Address: 0x00CC0000, Entry Point: 0x00E40000, Header CRC: 0x87611FE5, Data CRC: 0x6BD90EBD
root@xc:~/firmware# file custom-x.cramfs.img
custom-x.cramfs.img: u-boot legacy uImage, linux, Linux/ARM, Standalone Program (gzip), 262080 bytes, Fri Nov 8 05:15:49 2013, Load Address: 0x00E40000, Entry Point: 0x00E80000, Header CRC: 0xF7C82692, Data CRC: 0x5A27F74C
root@xc:~/firmware# file logo-x.cramfs.img
logo-x.cramfs.img: u-boot legacy uImage, linux, Linux/ARM, Standalone Program (gzip), 262080 bytes, Fri Nov 8 05:15:47 2013, Load Address: 0x00E80000, Entry Point: 0x00EC0000, Header CRC: 0x4FE4A821, Data CRC: 0xF6671BD1
Прошу обратить внимание на два параметра Load Address и Entry Point. Я при первой сборке забыл их указать, они по умолчанию стали нулями, а это адрес загрузчика, который оказался затёрт после прошивки! Из-за этого я потратил лишний час на восстановление — пришлось снимать с улицы камеру, разбирать, и восстанавливать прошивку на программаторе. (Хотя камеру разбирал всё же не зря — добавил в кожух пакетик силикагеля, чтобы убрать возможную влагу из воздуха.)
Теперь небольшое пояснение: образ .img из данной прошивки является несколько изменённым образом файловой системы cramfs. Вот тут [3] можно почитать поподробнее. Чтобы привести образ к нормальному виду, нужно отрезать 64 байта заголовка.
root@xc:~/firmware# dd bs=1 skip=64 if=logo-x.cramfs.img of=logo-x.cramfs
262080+0 записей получено
262080+0 записей отправлено
скопировано 262080 байт (262 kB), 0,891322 c, 294 kB/c
Для остальных файлов команды аналогичные.
Смотрим, что получилось:
root@xc:~/firmware# file logo-x.cramfs
logo-x.cramfs: Linux Compressed ROM File System data, little endian size 28672 version #2 sorted_dirs CRC 0xe29e6340, edition 0, 199 blocks, 2 files
Уже похоже на cramfs. Для работы с образами cramfs установим или обновим соответствующий пакет:
root@xc:~/firmware# apt-get install cramfsprogs
Распаковываем образы:
root@xc:~/firmware# cramfsck -x logo logo-x.cramfs
root@xc:~/firmware# cramfsck -x user user.cramfs
root@xc:~/firmware# cramfsck -x romfs romfs-x.cramfs
root@xc:~/firmware# cramfsck -x web web-x.cramfs
root@xc:~/firmware# cramfsck -x custom custom-x.cramfs
Каталоги я не создаю, они создадутся автоматически.
Загрузчик так не распаковать, это не образ cramfs, но его и не надо трогать.
Быстренько пробегусь по содержимому каждого файла внутри архива прошивки:
Нас интересует romfs-x.cramfs.img, так как именно там присутствует файл passwd, в котором хранится пароль. Вот его содержимое, желающие могут попробовать сбрутить:
root:$1$RYIwEiRA$d5iRRVQ5ZeRTrJwGjRy.B0:0:0:root:/:/bin/sh
Я же просто сгенерил новый хеш на сайте [4] и поменял его в файле.
После сделанных изменений нужно всё запаковать обратно:
root@xc:~/firmware# mkcramfs romfs romfs-x.cramfs
Directory data: 3624 bytes
Everything: 4004 kilobytes
Super block: 76 bytes
CRC: 28c62b9b
Помните, я заострял внимание на значениях Load Address и Entry Point? Самое время о них вспомнить и добавить в команду.
Создаём образ U-boot:
root@xc:~/firmware# mkimage -A arm -O linux -T ramdisk -n "linux" -e 0x00580000 -a 0x00080000 -d romfs-x.cramfs romfs-x.cramfs.img
Image Name: linux
Created: Fri Feb 21 14:27:38 2014
Image Type: ARM Linux RAMDisk Image (gzip compressed)
Data Size: 4100096 Bytes = 4004.00 kB = 3.91 MB
Load Address: 00080000
Entry Point: 00580000
Кстати, чтобы обновить один модуль не обязательно прошивать всю прошивку, достаточно положить только нужный, и отредактировать файлы Install и InstallDesc, оставив только нужные строчки.
Складываем полученные файлы в отдельный каталог, пусть это будет new. Даём команду:
root@xc:~/new# zip -D -X firmware.bin *
adding: Install (deflated 22%)
adding: InstallDesc (deflated 30%)
adding: romfs-x.cramfs.img (deflated 0%)
Всё, прошивка готова. Осталось только прошить её через web-интерфейс через пункт update
Выполняя рекомендации из этой статьи, вы делаете на ваш страх и риск. Автор не несет ответственности за ваши действия. Допустив ошибку при модификации прошивки вы легко можете получить кирпич, который можно будет восстановить только на программаторе. Поэтому, если не уверены в своих действиях, не делайте этого.
Burn-in рутовый шелл в IP-камерах Vesta и не только [2]
GNU/Linux и устройство на Rockchip 2918 [3]
Hacking RAM disks [5]
Автор: Newsonya
Источник [6]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/firmware/55618
Ссылки в тексте:
[1] свежих прошивок: http://pan.baidu.com/share/home?uk=2318430757#category/type=0
[2] этой статье: http://habrahabr.ru/post/173501/
[3] тут: http://habrahabr.ru/post/147793/
[4] на сайте: http://www.insidepro.com/hashes.php?lang=rus
[5] Hacking RAM disks: http://boundarydevices.com/hacking-ram-disks/
[6] Источник: http://habrahabr.ru/post/213411/
Нажмите здесь для печати.