Реверс-инжиниринг USB-камеры на базе Linux

Купил IP-камеру, на которой установлено фирменное ПО (без HTTP-сервера). Это мешает мне интегрировать его в мою домашнюю сеть.

Я хочу заменить программное обеспечение (ELF с закрытым исходным кодом) на пакет Motion, который я уже использую, и добавить некоторые функции.

У меня нет особой системной компетенции, и прошло больше недели с тех пор, как я путешествую по сети, чтобы учиться, но я не могу выйти. У меня есть доступ к консоли U-boot (адаптер USB-TTL) и telnet (root). На веб-камере есть устройство для чтения SD-карт, которое я мог бы использовать, если мне нужно место. Я начал с резервного копирования трех разделов (с помощью dd).

Я разархивировал файл mtdblock2 (binwalk -e). Который генерирует классическое дерево Linux со ссылками на Busybox, некоторую бинарную систему и проприетарное ПО.

Я попытался разархивировать mtdblock1, который генерирует zImage. Декомпрессия zImage генерирует два каталога и один файл (консоль). Но мне нужны модули ядра, которые в нем есть. Что делать? Я также хочу получить настройки компиляции ядра, это возможно?

Я распаковал прошивку, доступную на сайте производителя. Он содержит только обновление ELF, один файл .so и несколько скриптов Bash.

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

Поэтому я думаю, что у меня есть одно решение: собрать новое ядро ​​и пересобрать rootfs с нуля. Это единственное решение?

Я начал играть с Buildroot, но не могу найти файл конфигурации для платы на основе Hisilicon Hi3518. Я плохо смотрел или это бесполезно? Для моего первого теста я использовал board/qemu/arm-versatile. Это правильный выбор? Это не помешает мне перейти на физическую машину?

Для проверки, если бы мне удалось собрать ядро ​​и rootfs, я бы установил эти разделы на SD, чтобы ничего не сломать. Для этого «достаточно» изменить параметры ядра (в переменной bootargs), верно? Значит, мне не нужно перестраивать раздел U-boat для моего устройства?

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


# cat /proc/cpuinfo 
Processor       : ARM926EJ-S rev 5 (v5l)
BogoMIPS        : 218.72
Features        : swp half thumb fastmult edsp java 
CPU implementer : 0x41
CPU architecture: 5TEJ
CPU variant     : 0x0
CPU part        : 0x926
CPU revision    : 5

Hardware        : hi3518
Revision        : 0000
Serial          : 0000000000000000

# cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00100000 00010000 "boot"
mtd1: 00300000 00010000 "kernel"
mtd2: 00c00000 00010000 "rootfs"

# binwalk mtdblock0 
DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
122044        0x1DCBC         CRC32 polynomial table, little endian

# binwalk mtdblock1
DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             uImage header, header size: 64 bytes, header CRC: 0x853F419E, created: 2014-07-22 02:45:04, image size: 2890840 bytes, Data Address: 0x80008000, Entry Point: 0x80008000, data CRC: 0xB24E77CA, OS: Linux, CPU: ARM, image type: OS Kernel Image, compression type: none, image name: "Linux-3.0.8"
22608         0x5850          gzip compressed data, maximum compression, from Unix, NULL date:
# binwalk zImage
DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
113732        0x1BC44         ASCII cpio archive (SVR4 with no CRC), file name: "dev", file name length: "0x00000004", file size: "0x00000000"
113848        0x1BCB8         ASCII cpio archive (SVR4 with no CRC), file name: "dev/console", file name length: "0x0000000C", file size: "0x00000000"
113972        0x1BD34         ASCII cpio archive (SVR4 with no CRC), file name: "root", file name length: "0x00000005", file size: "0x00000000"
114088        0x1BDA8         ASCII cpio archive (SVR4 with no CRC), file name: "TRAILER!!!", file name length: "0x0000000B", file size: "0x00000000"
1903753       0x1D0C89        Certificate in DER format (x509 v3), header length: 4, sequence length: 1284
4188800       0x3FEA80        Linux kernel version "3.0.8 (cwen@ubuntu) (gcc version 4.4.1 (Hisilicon_v100(gcc4.4-290+uclibc_0.9.32.1+eabi+linuxpthread)) ) #1 Tue Jul 22 10:45:00 H"
4403540       0x433154        CRC32 polynomial table, little endian
5053435       0x4D1BFB        Unix path: /mtd/devices/hisfc350/hisfc350_spi_gd25qxxx.c
5054731       0x4D210B        Unix path: /mtd/devices/hisfc350/hisfc350.c
5058939       0x4D317B        Unix path: /net/wireless/rt2x00/rt2x00dev.c
5059323       0x4D32FB        Unix path: /net/wireless/rt2x00/rt2x00config.c
5060683       0x4D384B        Unix path: /net/wireless/rt2x00/rt2x00usb.c
5060851       0x4D38F3        Unix path: /net/wireless/rt2x00/rt2x00.h
5061171       0x4D3A33        Unix path: /net/wireless/rt2x00/rt73usb.c
5081107       0x4D8813        Unix path: /S70/S75/505V/F505/F707/F717/P8
5102399       0x4DDB3F        Unix path: /mmc/host/himciv100/himci.c
5141264       0x4E7310        Neighborly text, "NeighborSolicits/ipv6/inet6_hashtables.c"
5141284       0x4E7324        Neighborly text, "NeighborAdvertisementses.c"

# binwalk mtdblock2
DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             JFFS2 filesystem, little endian
722980        0xB0824         JFFS2 filesystem, little endian
732282        0xB2C7A         Zlib compressed data, compressed
737031        0xB3F07         Zlib compressed data, compressed
738287        0xB43EF         Zlib compressed data, compressed
.... most other lines in the same genre

IP-камера QQZM N5063 http://www.zmvideo.com/product/detail.php?id=60
Прошивка http://bbs.zmmcu.com/forum.php?mod=attachment&aid=MzU2fDBiY2M4NDdjfDE0MTkxMTEzODl8MzQ4fDIwMzc%3D


person Mauricio    schedule 08.01.2015    source источник
comment
Я думаю, что mtd0 — это u-boot. mtd1 — это образ Linux с «initrd», который представляет собой архив cpio. mtd2, вероятно, является разделом JFFS2, к которому у вас есть доступ. Если у вас есть nandread /dev/mtd0, это лучше, так как у вас могут быть плохие блоки, а dd будет непригодным для использования. Лучше всего получить консоль u-boot и посмотреть, сможете ли вы загрузить по сети собственное ядро; серийный/usb и т. д. Может быть /proc/config.gz или, возможно, что-то в /boot/config. Убедитесь, что вы можете правильно прочитать и восстановить mtd, прежде чем что-либо записывать.   -  person artless noise    schedule 09.01.2015
comment
Я также не понимаю, почему вы хотите запустить это на qemu. У вас есть доступ к оболочке. Вам просто нужен компилятор ARM, и вы можете разместить на устройстве HTTP-сервер. Может уже есть. Посмотрите, есть ли у вас какие-либо сетевые интерфейсы, например те, к которым вы подключаетесь по телнету?   -  person artless noise    schedule 09.01.2015
comment
В /proc/config не существует. Насколько я понимаю, ядро ​​было скомпилировано со специальной опцией не генерировать его. Вчера я сломал свою веб-камеру, желая восстановить разделы. Теперь она зацикливает загрузку ядра :( Я следовал этому руководству и объяснил свою проблему: felipe .astroza.cl/hacking-hi3518-based-ip-camera   -  person Mauricio    schedule 10.01.2015
comment
Вы правы, мне не нужно было использовать Qemu. Спасибо   -  person Mauricio    schedule 10.01.2015


Ответы (1)


Прежде всего, вы не хотите заменять U-Boot, так как это может привести к тому, что ваше устройство перестанет загружаться. В консоли U-Boot проверьте, можете ли вы загружаться с SD-карты mmc rescan 0; fatload mmc 0 ${loadaddr} uImage или из сети dhcp ${loadaddr} ${serverip}:uImage. Вам нужно будет найти документацию по этим командам, чтобы получить дополнительную помощь.

Но, возможно, вам даже не нужно заменять ядро. Вы уже знаете, что это ядро ​​версии 3.0.8, поэтому можете создать пользовательское пространство для этой версии ядра. А любые проприетарные модули, которые он использует, можно поднять из файловой системы jffs2. В сеансе telnet выполните lsmod, чтобы узнать, какие модули загружены. Вы можете установить SD-карту и скопировать их на нее. Модули расположены в /lib/modules/3.0.8.

Так что вам, вероятно, даже не нужно собирать ядро ​​​​в buildroot, только rootfs. Во-первых, проверьте в сеансе telnet, какие файловые системы поддерживаются: cat /proc/filesystems. Затем выберите соответствующую файловую систему в конфигурации buildroot. Для целевой архитектуры выберите arm926t. И выберите заголовки ядра 3.0 в конфигурации тулчейна или выберите внешний тулчейн Arago ARMv5 2011.09 (у него старые заголовки ядра).

Как заметил бесхитростный шум, тестировать в qemu не нужно, так как сд-карта безопасна.

person Community    schedule 09.01.2015
comment
У меня сейчас нет выбора, я должен найти способ загрузиться с SD-карты. На худой конец из сети. Вы оба правы, на самом деле мне не нужно было использовать Qemu. Спасибо за ваши ответы. - person Mauricio; 10.01.2015
comment
Если бы я знал раньше, что мы можем создать rootfs без повторения ядра, я бы не трогал загрузочный раздел. Вы правы, лучшее решение - пересобрать rootfs, не трогая ядро. И начать с SD или сети. Я буду работать в этом направлении. Спасибо большое - person Mauricio; 10.01.2015