Arm 基于Linux的USB摄像头反向工程

Arm 基于Linux的USB摄像头反向工程,arm,reverse-engineering,embedded-linux,u-boot,buildroot,Arm,Reverse Engineering,Embedded Linux,U Boot,Buildroot,我买了一台IP摄像机,上面安装了专有软件(没有HTTP服务器)。 这使我无法将其集成到家庭网络中 我想用我已经使用的运动包替换软件(ELF闭源代码),并添加一些功能 我没有特别的系统能力,自从我上网学习已经有一个多星期了,但是我出不去了。 我可以访问U-boot控制台(USB-TTL适配器)和telnet(根)。 网络摄像头有一个SD卡读卡器,如果需要空间,我可以使用它。 我首先备份了三个分区(使用dd) 我解压缩了文件mtdblock2(binwalk-e)。它生成一个经典的Linux树,其中

我买了一台IP摄像机,上面安装了专有软件(没有HTTP服务器)。 这使我无法将其集成到家庭网络中

我想用我已经使用的运动包替换软件(ELF闭源代码),并添加一些功能

我没有特别的系统能力,自从我上网学习已经有一个多星期了,但是我出不去了。 我可以访问U-boot控制台(USB-TTL适配器)和telnet(根)。 网络摄像头有一个SD卡读卡器,如果需要空间,我可以使用它。 我首先备份了三个分区(使用dd)

我解压缩了文件mtdblock2(binwalk-e)。它生成一个经典的Linux树,其中包含Busybox、一些二进制系统和专有软件的链接

我试图解压生成zImage的mtdblock1。 解压zImage生成两个目录和一个文件(控制台)。 但我需要其中的内核模块。怎么办? 我还想获得内核编译设置,这可能吗

我打开了制造商网站上的固件。 它只包含更新ELF、一个.so文件和一些Bash脚本

起初我认为这三个分区直接迁移到Qemu。 但是如果我理解这是不可能的,因为内存地址是硬编码到内核中的。 我明白好吗

所以我想我有一个解决方案:构建一个新内核,从头开始重建一个rootfs。 这是唯一的解决办法吗

我开始使用Buildroot,但我找不到基于Hisilicon Hi3518的主板的配置文件。 我看起来很糟糕还是没用? 在我的第一次测试中,我使用了board/qemu/arm。这是正确的选择吗? 这不会阻止我迁移到物理机器吗

为了进行测试,如果我成功地重建了内核和rootfs,我会在SD上安装这些分区,而不会破坏任何东西。 为此,修改内核参数(在bootargs变量中)就“足够”了,对吗? 所以我不需要为我的设备重建U-boat分区

简言之,你猜我问了自己很多问题(还有其他问题,但一次只问一件)。 我需要关于我是否走对了路的建议。 如果我在胡说八道,请随意纠正我。 如果你有想法或思考的主题,我很感兴趣


IP摄像机QZM N5063
固件

首先,您不想更换U-Boot,因为这可能会使您的设备无法转动。在U-Boot控制台上,检查是否可以从SD卡
mmc重新扫描0;fatload mmc 0${loadaddr}uImage
或从网络
dhcp${loadaddr}${serverip}:uImage
。您需要查找这些命令的文档以获得更多帮助

但也许你甚至不需要更换内核。您已经知道它是一个3.0.8内核,所以您可以为这个内核版本构建一个用户空间。它使用的任何专有模块都可以从jffs2文件系统中取出。在telnet会话中,执行
lsmod
以确定加载了哪些模块。您可以挂载SD卡并将其复制到SD卡上。模块位于
/lib/modules/3.0.8

因此,您甚至不需要在buildroot中构建内核,只需要在rootfs中构建内核。首先,在telnet会话中检查支持哪些文件系统:
cat/proc/filesystems
。然后在buildroot配置中选择适当的文件系统。对于目标体系结构,选择
arm926t
。并在工具链配置中选择3.0内核头,或者选择Arago ARMv5 2011.09外部工具链(它有旧的内核头)


正如artless noise所说,您不需要在qemu中测试它,因为SD卡是安全的。

我认为mtd0是u-boot。mtd1是一个带有“initrd”的linux映像,它是一个cpio归档文件。mtd2可能是您可以访问的JFFS2分区。如果您有
nandread/dev/mtd0
,这会更好,因为您可能有坏块,
dd
将不可用。你最好的选择是使用u-boot控制台,看看是否可以通过网络加载自己的内核;串行/usb等。可能有一个/proc/config.gz或/boot/config中的某些内容。在刻录任何内容之前,请确保您可以正确读取和恢复mtd。我也不明白您为什么要在qemu上运行此功能。你有shell访问权限。您只需要一个ARM编译器,就可以在设备上放置HTTP服务器。它可能已经在那里了。查看您是否有任何网络接口,比如您在上telnet的任何接口?/proc/config不存在。如果我知道内核是用一个特殊的选项编译的,不生成它。昨天我在恢复分区时弄坏了我的网络摄像头。现在,她循环内核加载:(我遵循本教程并解释了我的问题:你是对的,我不需要使用Qemu。谢谢你,我现在没有选择,我必须找到一种从SD卡引导的方法。最坏的情况是从网络引导。你们都是对的,事实上我不需要使用Qemu。谢谢你的回答。如果我以前知道,我们可以创建一个rootfs,而无需重复核心我不会触及启动分区。你是对的,最好的解决方案是在不触及核心的情况下重建rootfs。从SD或网络开始。我会朝这个方向努力。非常感谢
# 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