Распаковка, редактирование и упаковка прошивок видеорегистраторов и IP камер от Xiong Mai

    Предыстория


    Не так давно приобрёл на Aliexpress IP камеру (чип Hi3516 платформа 53H20L) и 16-канальный гибридный видеорегистратор (чип Hi3521 платформа MBD6508E). Оба выполнены на чипсете от HiSilicon, так что проблем с совместимостью между собой не испытывают.
    Разумеется, не обошлось и без глюков. Первый, и самый главный — у камеры криво работал WiFi — нельзя было подключиться к сети, если ключ был задан в HEX виде, а также периодически возникала проблема со шлюзом по умолчанию.

    Прошивка оказалась старая, ещё июньская. Раздобыл несколько свежих прошивок и попробовал. Некоторые оказались глючными, но одна заработала нормально.
    Возникла другая проблема — изменился пароль по умолчанию для telnet подключения. Этого я не стерпел и стал искать способы вернуть его обратно.
    Сразу предупрежу, что данный способ опробован на видеорегистраторах и камерах на чипах HiSilicon, но должен сработать и с другой платформой, так как китайцы широко используют загрузчик U-boot.

    Распаковка


    Инструкция по распаковке довольно подробно расписана в этой статье, но вот процесс упаковки нигде не описан, что и побудило меня написать этот пост.
    Расписываю по шагам, чтобы ничего не упустить:
    Ставим 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. Вот тут можно почитать поподробнее. Чтобы привести образ к нормальному виду, нужно отрезать 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, но его и не надо трогать.

    Что внутри


    Быстренько пробегусь по содержимому каждого файла внутри архива прошивки:
    • InstallDesc — описывает действия, которые нужно произвести с этими файлами при обновлении прошивки, install-скрипт.
    • logo-x.cramfs.img — картинка в формате 800x600 с логотипом изготовителя, которая появляется при загрузке аппарата.
    • romfs-x.cramfs.img — собственно сама операционная система linux под архитектуру ARM
    • u-boot-all.bin.img — загрузчик U-boot
    • custom-x.cramfs.img — содержит наименование платформы и дополнительные настройки
    • user-x.cramfs.img — прикладной софт, в том числе Sofia — сама программа видеорегистратора
    • web-x.cramfs.img — картинки веб-интерфейса, web.cab — плагин для Internet Explorer с локализацией, логотипы производителя.

    Нас интересует romfs-x.cramfs.img, так как именно там присутствует файл passwd, в котором хранится пароль. Вот его содержимое, желающие могут попробовать сбрутить:
    root:$1$RYIwEiRA$d5iRRVQ5ZeRTrJwGjRy.B0:0:0:root:/:/bin/sh
    

    Я же просто сгенерил новый хеш на сайте и поменял его в файле.

    Собираем обратно


    После сделанных изменений нужно всё запаковать обратно:
    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 и не только
    GNU/Linux и устройство на Rockchip 2918
    Hacking RAM disks
    Поделиться публикацией
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 28
    • +1
      Помню эти регистраторы из Китая, врагу не пожелаю. Есть у нас один любитель, постоянно привозит их с поднебесной, а нам с ними мучаться. Лучше немного переплатить и купить тут нормальный регистратор, чем через полгода после установки китайского регистратора узнать что он уже несколько месяцев не писал, а сейчас нужна запись.
      • 0
        Так львиная доля этих регистраторов из Китая, например Polivision, Divitek, TBTEC и т.д. Причём разница за реги с одинаковой начинкой тут и там, больше, чем в 2 раза. А за нормальный придётся доплатить гораздо больше, вот и приходится иметь дело с китаем.
        • 0
          Согласен, но в России есть компании которые их локализуют и поддерживают.
          • 0
            А какие нормальные не китайские бывают?
            • +1
              Panasonic, Sanyo, Siemens, HoneyWell, Samsung etc., но цены вас неприятно удивят, ни один из наших клиентов так и не согласился. Китай, кстати, тоже разный бывает, сейчас возим Vidatec, дешево и сердито.
        • +2
          Мне блог вот этого товарища очень сильно помог в свое время fwhacking.blogspot.ru/2011/03/foscam-fi8908w-2.html. Там к стати не только камеры, методы довольно универсальные.
          • 0
            Да, там много чего интересного. Жаль, что он забросил этот блог ещё в 2011 году.
          • 0
            Последняя что я нашел — General_HZXM_IPC_HI3516C_53H20L_V4.02.R11.20131231_ALL.bin
            • 0
              При этом она же оказалась самой глючной. Вот тут есть ещё прошивки. Мне подошла General_HZXM_IPC_HI3516C_53H20L_V4.02.R11.20131108_ALL.bin
              • 0
                А в чем глюки? У меня с ней стабильнее всего, на предыдущих всё было розовое.
                впрочем, на этой тоже глюк — периодически FPS падает до 25/3=8.33…
                • 0
                  Вот как раз глюки с FPS и были. Выставил High profile и 4Mbit, как всё затормозило, один кадр в секунду, веб-интерфейс еле ползает, явно не хватает производительности процессора. Ну, я и откатился на другую прошивку.
                  Да, на самой первой прошивке тоже было розовое при смене режима день-ночь.
                  • 0
                    хм… интересный коленкор… у меня периодически то 25fps то на (25/3)fps.
                    логики не отловил. китаец говорит что такого не видел.
                    вроде пытался и VBR и CBR выставлять — а разницы никакой.
                    обещает дать прошивку после внутреннего тестирования на 3MP.

                    то есть в момент просадки fps у неё как раз в CPU упирается?
                    • 0
                      интересно. глянул дифф прошивок; фактически, изменение одно — Binary files 20131108/romfs-x/boot/uImage and domecam/romfs-x/boot/uImage differ

                      то, что там в rcS изменилось не щитова в общем-то.
                      • 0
                        выставил high profile 8mbit, нагрузка по top'у у неё внутри не более 70%. памяти еще 12мбайт свободно…
                        не похоже что упор в процессор. :/ где-то глюки всё же в ДНК.
                        • 0
                          У меня не сразу стало тормозить, а на следующий день. Возможно, утечка памяти. А что за прошивка?
                          • 0
                            и последняя, и 20131108 — обе смотрю (у меня 3 таких камеры сейчас).
                            на частоту обрывов связи не влияют обе версии.
                            • 0
                              сейчас вот заглянул:

                              Mem: 47424K used, 11948K free, 0K shrd, 4776K buff, 8660K cached
                              CPU: 6.6% usr 7.4% sys 0.0% nic 83.4% idle 0.0% io 0.0% irq 2.3% sirq
                              Load average: 4.60 4.97 5.23 1/95 895
                              PID PPID USER STAT VSZ %MEM CPU %CPU COMMAND
                              817 805 root S 457m783.8 0 15.2 /usr/bin/Sofia

                              аптайм камеры после апдейта — около 4х часов
                              • 0
                                а вот на утечку памяти похоже:
                                Mem: 49532K used, 9840K free, 0K shrd, 4776K buff, 8660K cached
                                CPU: 4.1% usr 6.8% sys 0.0% nic 86.7% idle 0.0% io 0.0% irq 2.3% sirq
                                Load average: 5.88 6.10 6.00 1/96 913
                                PID PPID USER STAT VSZ %MEM CPU %CPU COMMAND
                                817 805 root S 469m804.1 0 12.3 /usr/bin/Sofia

                                при этом FPS упал до 8.33 опять… так что более старая прошивка не помогает.
                                • 0
                                  Я вот такие настройки сделал:

                                  тормозить перестало, но качество упало.
                                  • 0
                                    выставил сейчас в софте протокол метаданных = UDP, протокол передачи видео = TCP.
                                    FPS резко стал 25.00 ровно и не дёргается.
                                    ничерта не понимаю, но пока стараюсь не дышать.

                                    Если надо — мне прислали свежайшую паршивку General_HZXM_IPC_HI3516C_53H20L_V4.02.R11.20140226_ALL.bin
                            • 0
                              Я изловил причину падения FPS. FPS падает с количеством «активных» подключений.
                              Пока подключений < 3 — всё нормально, fps=25. Как только подключений больше 3х начинается падение.
                              На 4х — падает до 20. На 5 падает до 15. На 6 падает до 12. На 7-8 — падает до 8.

                              Так как поток рвётся (с этим я прошивку сейчас ему правлю), софт имеет привычку думать что всё плохо и реконнектиться.
                              на TCP не знаю как получается у софта это, отдельный вопрос, а на UDP-то всё нормально — если STOP команда ему не улетела, он считает что подключение есть, со всеми вытекающими.

                              Поэтому спустя пару часов fps залипает и падает.

                              Причем я сейчас отгонял — пока 1-2 потока — никаких проблем с FPS нет. Временно добавил еще несколько коннектов, прибил их.
                              fps теперь залип на отметке 12.5 и не двигается.

                              Вывести из него похоже только ребутом.
                              • 0
                                Есть идеи, как побороть?
                                У меня камера живёт без тормозов только с прошивкой General_HZXM_IPC_HI3516C_53H20L_V4.02.R11.20131108_ALL.bin
                                При этом с неё пишется на видеорегистратор по протоколу NETIP.
                                Сколько пробовал прошивок, вышедших после этой, все тупят через какое-то время. А в этой мне не нравится качество сжатия, уж больно много артефактов.
                                • 0
                                  на этой прошивке я тоже воспроизвел баг 100%.

                                  видимо, она живёт именно из-за плохого сжатия — меньше потерь и сбоев по сети => нет реконнектов => живёт.
                                  дело не в версии (они все равноглючные), а именно в потоке из-за кривизны сжатия.

                                  легкий способ воспроизвести: подключиться к камере в 6 потоков, потом разорвать и оставить только 2. спустя буквально 2-3 минуты пройдёт пара волн сбоев потока и fps падает до стабильных 12.5 fps.

                                  идеи есть, пытаюсь пропатчить бинарник… надеюсь, не окирпичу.
                                  • 0
                                    блин. у них Sofia основана не на LIVE555.
                                    не могу найти этот кусок кода. в камерах на DM368 нашел слёту, тут погряз.
                                    попробую чуть позже второй заход.
                            • 0
                              кстати, а зачем там телнет? что интересного из него извлекается?
                              • 0
                                Там же линь внутри, можно зайти в операционку, глянуть загрузку процессора, таблицу маршрутов. Естественно, всё это в отладочных целях. Когда всё работает, telnet не нужен.
                                • 0
                                  а обновить его как-то не из винды можно?
                            • +1
                              Ребята,
                              ищу хорошую wifi outdoor камеру. Посоветуйте что-нибудь вменяемое.

                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.