Ломаем и восстанавливаем китайскую IP-камеру

    Эта история началась больше года назад, когда в организацию были закуплены несколько относительно дешёвых китайских IP-камер Falcon Eye FE-MTR300 P2P, чтобы между сотрудниками и посетителями не происходило никаких эксцессов под присмотром большого брата.

    image

    Не сказать, чтобы всё было хорошо… Всё было средне. И нам показалось, что обновление ПО камер сможет что-то улучшить. Оказалось, что некоторые модели Falcon Eye, Tenvis, Foscam и, возможно, ещё каких-то фирм практически совпадают. Где-то кнопочки поудобнее, где-то интерфейс русский есть. И мы решились!

    Обновили ПО камер на схожую модель от Tenvis TR3818. Потом почитали ещё и решили, что можно обновиться и на более крутую прошиву от другой камеры.

    После обновления камера приказала долго жить. Проверки моторов при включении не происходило, динамики не шуршали, светодиод не мигал. Горел только светодиод на LAN интерфейсе, да при включении уходил одинокий широковещательный пакетик.

    После такого казуса остальные камеры были развешаны по местам, а «кирпич» переселился жить к нам. Время от времени происходили попытки его реанимировать. Камера была разобрана, найдены площадки, куда можно подпаяться для доступа через консоль.

    image
    (там под проводами маркировка 3.3V, GND, TX, RX)

    image
    (платы камеры в сборе)

    Пришлось взять USB-TTL преобразователь.

    image
    (есть контакт)

    Подключаемся к консоли через putty или HyperTerminal и видим следующее:
    U-Boot 1.1.3 (Aug 26 2014 - 17:15:00)

    Board: Ralink APSoC DRAM: 16 MB
    relocate_code Pointer at: 80fb0000
    spi_wait_nsec: 42
    spi device id: c2 20 17 c2 20 (2017c220)
    find flash: MX25L6405D
    raspi_read: from:2b000 len:1000
    .raspi_read: from:2b000 len:1000
    .============================================
    Ralink UBoot Version: 3.6.0.0
    --------------------------------------------
    ASIC 5350_MP (Port5<->None)
    DRAM_CONF_FROM: Boot-Strapping
    DRAM_TYPE: SDRAM
    DRAM_SIZE: 128 Mbits
    DRAM_WIDTH: 16 bits
    DRAM_TOTAL_WIDTH: 16 bits
    TOTAL_MEMORY_SIZE: 16 MBytes
    Flash component: 8 MBytes NOR Flash
    Date:Aug 26 2014 Time:17:15:00
    ============================================
    icache: sets:256, ways:4, linesz:32 ,total:32768
    dcache: sets:128, ways:4, linesz:32 ,total:16384

    ##### The CPU freq = 360 MHZ ####
    estimate memory size =16 Mbytes
    raspi_read: from:80028 len:6
    .
    start time:31742632l
    File: cmd_net.c, Func: do_my_tftpb, Line: 69

    netboot_common, argc= 3

    NetTxPacket = 0x80FE3C80

    KSEG1ADDR(NetTxPacket) = 0xA0FE3C80

    NetLoop,call eth_halt !

    NetLoop,call eth_init !
    Trying Eth0 (10/100-M)

    Waitting for RX_DMA_BUSY status Start... done

    Header Payload scatter function is Disable !!

    ETH_STATE_ACTIVE!!
    Using Eth0 (10/100-M) device
    TFTP from server 51.204.51.204; our IP address is 192.168.1.5
    Filename 'xx.img'.

    TIMEOUT_COUNT=10,Load address: 0x80100000
    Loading: ====================broadcast get file
    T ====================broadcast get file

    could not get file, cancel update
    ret = 1

    Please choose the operation:
    1: Load system code to SDRAM via TFTP.
    2: Load system code then write to Flash via TFTP.
    3: Boot system code via Flash (default).
    4: Entr boot command line interface.
    7: Load Boot Loader code then write to Flash via Serial.
    9: Load Boot Loader code then write to Flash via TFTP.

    You choosed 3
    0

    3: System Boot system code via Flash.
    ## Booting image at bc0e0000 ...
    raspi_read: from:e0000 len:40
    .Magic Number,85190320
    Bad Magic Number,85190320

    Плохое, говорит, у Вас магическое число. И никак не хочет реагировать на мой выбор любого другого пункта меню. На этом был завершён первый подход к камере и она вернулась на полку в отделе.

    Набравшись сил, мы совершили ещё один подход. Пришлось потратить нервы на то, чтобы понять, что именно в нашем случае RX преобразователя надо подключить к RX камеры, а TX к TX. Или маркировку неправильно нанесли или одно из двух. Камера начала реагировать на выбор пунктов меню, но это никак не объясняло природу магических чисел.

    Тогда была скачана прошивка для Tenvis TR3818 и несколько прошивок для похожих камер, настроен tftp-сервер и выбран пункт номер 4, вход в командный интерфейс. Собственно, по ? нам выдаёт список возможных команд, где мы находим tftpboot — который загружает файл с tftp в память и bootm — который загружает приложение из памяти.

    Порядок действий следующий:

    • загружаем прошивку в камеру через tftpboot
    • запускаем командой bootm
    • Смотрим на результат, обдумываем.

    А результаты получились такие:

    • На прошивках похожих камер — несовпадает магическое число
    • На прошивке от Tenvis TR3818
      RT5350 # bootm
      ## Booting image at 80100000 ...
      Magic Number,27051956
      Image Name: SPI Flash Image
      Created: 2014-11-26 6:26:49 UTC
      Image Type: MIPS Linux Standalone Program (uncompressed)
      Data Size: 112920 Bytes = 110.3 kB
      Load Address: 80200000
      Entry Point: 80200000
      Verifying Checksum ... OK
      OK

      (Узнали магическое число, но только тут 110 КБ и это прошивка загрузчика, а файл прошивки 7 МБ)
    • Пытаемся скормить весь файл прошивки, как обновление загрузчика (пункт 9 в меню) — ругается на слишком большой файл. Просматриваем файл Frhed'ом и видим, что магическое число в самом начале файла. А раз мы знаем, что размер загрузчика 112920 байт + 64 байта размер заголовка, то копируем в отдельный файл 112984 байта, скармливаем камере через 9 пункт меню и радуемся обновлённому загрузчику.
    • Вдохновлённые успехом ищем в файле прошивки повторение магического числа и находим такой же заголовок в файле прошивки по адресу 0xE0000, но только c Linux Kernel Image.Копируем всё от него и до конца файла в отдельный файл и пытаемся проверить через tftpboot и bootm.
      RT5350 # bootm
      ## Booting image at 80100000 ...
      Magic Number,27051956
      Image Name: Linux Kernel Image
      Created: 2014-11-26 6:26:54 UTC
      Image Type: MIPS Linux Kernel Image (lzma compressed)
      Data Size: 1065116 Bytes = 1 MB
      Load Address: 80000000
      Entry Point: 80347000
      Verifying Checksum ... OK
      Uncompressing Kernel Image ... LZMA ERROR 1 - must RESET board to recover

      (Число сошлось, размер известен, загружаем как есть через 2-й пункт меню и видим, что записывается в память по смещению 0x30000, а при запуске камеры обращается к 0xE0000, т.е. промахиваемся на 0xB0000 байт мимо магического числа)
    • Значит берём из файла с прошивкой от Tenvis'а ещё 0xB0000 байт данных перед магическим числом. Заливаем через 2-й пункт меню и камера оживает!

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

    И спасибо Вам! Если бы не желание порадовать хабр, возможно эта камера ещё долго бы стояла у нас в отделе.
    Метки:
    Поделиться публикацией
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 6
    • +2
      Квест конечно увлекательный, но работать в клетке с камерой — это как-то не по-человечьи…
      • 0

        А есть уже умные камеры с wide dinamic range, например, но за три копейки? А то ведь видеонаблюдение это какой-то заповедник старческого маразма (примерно как магнитофоны в автомобилях, даже в новейших и рядом нет функционала, какой был уже в винампе в 98м году, и производители найдут миллион причин, почему это нельзя сделать, хотя это почти бесплатно)

        • 0
          есть, у того же falcon eye
          берем список камер за три копейки и | grep WDR
          но всегда стоит помнить что бесплатный сыр он только в мышеловке — взяв камеру с самым большим ТТХ и самой низкой ценой — скорее всего окажется что половина ттх не работает вообще, а вторая работает так что лучше бы не работала
        • 0
          Лучше то камера стала? H264 :) или все тот же mjpeg
          Есть такая же камера в закромах, с неизвестной прошивкой, тоже что ли поэкспериментировать…
          Но как? Вы никаких ссылок не выложили, ни родных ни модифицированных, печалька :(
          • 0
            Лучше не стала, тот же mjpeg. Если будете экспериментировать, то сначала советую аккуратно подпаяться, подключить USB-TTL и проверить, что вы видите камеру и можете управлять загрузкой.
            Ссылка на загрузку с оф.сайта Tenvis. При разборке на плате, скорее всего, будет какая-то маркировка. Советую ориентироваться на неё.
          • 0
            Следующий уровень это программатор типа TL866 + test clip/dip8 адаптер + паяльная станция с феном.
            Аккуратно сдуваем флеху (не переусердствуя с температурой и потоком чтобы не сдулть мелочёвку и ничего не перегреть), считываем образ и сейвим.
            Вливаем новый, обратно можно не запаивать и приложить и прижать прищепкой (особенно офисной, такие чёрные металлические с блестящими ручками из проволоки).

            Звучит страшно и дорого, но на самом деле в 15к руб уложится более чем реально даже если брать в местных магазинах.

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