对基于 Linux 的 USB 摄像头进行逆向工程
Reverse enginering a Linux based USB camera
我买了一台网络摄像机,上面安装了专有软件(没有 HTTP 服务器)。
这阻止了我将它集成到我的家庭网络中。
我想把软件(ELF闭源)替换成我已经在用的motion包,添加一些功能。
我没有特别的系统能力,上网学习已经一个多星期了,出不来。
我可以访问 U-boot 控制台(USB-TTL 适配器)和 telnet(root)。
网络摄像头有一个 SD 卡读卡器,我可以在需要时使用 space。
我首先备份了三个分区(使用 dd)。
我解压缩了文件 mtdblock2 (binwalk -e)。它生成一个经典的 Linux 树,其中包含指向 Busybox、一些二进制系统和专有软件的链接。
我试图解压缩生成 zImage 的 mtdblock1。
解压zImage生成两个目录和一个文件(控制台)。
但是我需要其中的内核模块。该怎么办?
我也想获取内核编译设置,可以吗?
我解压了制造商网站上提供的固件。
它仅包含更新 ELF、一个 .so 文件和一些 Bash 脚本。
一开始以为三个分区直接迁移到Qemu。
但如果我理解这是不可能的,因为内存地址是硬编码到内核中的。
我理解的好吗?
所以我想我有一个解决方案:构建一个新内核并从头开始重建一个rootfs。
这是唯一的解决方案吗?
开始玩Buildroot,找不到海思Hi3518开发板的配置文件。
我看起来很糟糕还是没用?
对于我的第一次测试,我使用了 board/qemu/arm-versatile。这是正确的选择吗?
这不会阻止我迁移到物理机吗?
为了测试,如果我设法重建内核和 rootfs,我会在 SD 上安装这些分区而不会破坏任何东西。
为此,修改内核参数(在bootargs变量中)是"sufficient"是吗?
所以我不需要为我的设备重建 U-boat 分区?
简而言之,您猜到我问了自己很多问题(还有其他问题,但每次都是 "one" 问题)。
我需要关于我是否走正确道路的建议。
如果我在胡说八道,请随时纠正我。
如果您有想法或反思的主题,我很感兴趣。
# 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
网络摄像机QQZM N5063
http://www.zmvideo.com/product/detail.php?id=60
固件
http://bbs.zmmcu.com/forum.php?mod=attachment&aid=MzU2fDBiY2M4NDdjfDE0MTkxMTEzODl8MzQ4fDIwMzc%3D
首先,您不想更换 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
。并且 select 工具链配置中的 3.0 内核头文件,或者选择 Arago ARMv5 2011.09 外部工具链(它有旧的内核头文件)。
正如 artless noise 所说,你不需要在 qemu 中测试它,因为 SD 卡是安全的。
我买了一台网络摄像机,上面安装了专有软件(没有 HTTP 服务器)。 这阻止了我将它集成到我的家庭网络中。
我想把软件(ELF闭源)替换成我已经在用的motion包,添加一些功能。
我没有特别的系统能力,上网学习已经一个多星期了,出不来。 我可以访问 U-boot 控制台(USB-TTL 适配器)和 telnet(root)。 网络摄像头有一个 SD 卡读卡器,我可以在需要时使用 space。 我首先备份了三个分区(使用 dd)。
我解压缩了文件 mtdblock2 (binwalk -e)。它生成一个经典的 Linux 树,其中包含指向 Busybox、一些二进制系统和专有软件的链接。
我试图解压缩生成 zImage 的 mtdblock1。 解压zImage生成两个目录和一个文件(控制台)。 但是我需要其中的内核模块。该怎么办? 我也想获取内核编译设置,可以吗?
我解压了制造商网站上提供的固件。 它仅包含更新 ELF、一个 .so 文件和一些 Bash 脚本。
一开始以为三个分区直接迁移到Qemu。 但如果我理解这是不可能的,因为内存地址是硬编码到内核中的。 我理解的好吗?
所以我想我有一个解决方案:构建一个新内核并从头开始重建一个rootfs。 这是唯一的解决方案吗?
开始玩Buildroot,找不到海思Hi3518开发板的配置文件。 我看起来很糟糕还是没用? 对于我的第一次测试,我使用了 board/qemu/arm-versatile。这是正确的选择吗? 这不会阻止我迁移到物理机吗?
为了测试,如果我设法重建内核和 rootfs,我会在 SD 上安装这些分区而不会破坏任何东西。 为此,修改内核参数(在bootargs变量中)是"sufficient"是吗? 所以我不需要为我的设备重建 U-boat 分区?
简而言之,您猜到我问了自己很多问题(还有其他问题,但每次都是 "one" 问题)。 我需要关于我是否走正确道路的建议。 如果我在胡说八道,请随时纠正我。 如果您有想法或反思的主题,我很感兴趣。
# 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
网络摄像机QQZM N5063
http://www.zmvideo.com/product/detail.php?id=60
固件
http://bbs.zmmcu.com/forum.php?mod=attachment&aid=MzU2fDBiY2M4NDdjfDE0MTkxMTEzODl8MzQ4fDIwMzc%3D
首先,您不想更换 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
。并且 select 工具链配置中的 3.0 内核头文件,或者选择 Arago ARMv5 2011.09 外部工具链(它有旧的内核头文件)。
正如 artless noise 所说,你不需要在 qemu 中测试它,因为 SD 卡是安全的。