通过 U-Boot 提取固件映像

逆向工程 硬件 固件
2021-07-01 03:16:34

我有一个便宜的中国 IP 摄像机,它在 8-MB SPI 闪存 IC 上运行 linux(准确地说是busybox)。

我正在尝试访问该设备。

它有一个硬件串行端口,我可以访问它,但 linux 终端似乎被禁用或只是关闭。基本上,我收到“正在加载 linux 内核”消息,然后串行端口变得无响应。

有什么方法可以使用 U-Boot检索设备上的固件映像?

U-Boot 日志:

U-Boot 2010.06-svn (Jun 16 2014 - 09:36:52)

DRAM:  256 MiB
Check spi flash controller v350... Found
Spi(cs1) ID: 0xC2 0x20 0x17 0xC2 0x20 0x17
Spi(cs1): Block:64KB Chip:8MB Name:"MX25L6406E"
envcrc 0x5878e4b2
ENV_SIZE = 0xfffc
In:    serial
Out:   serial
Err:   serial
Press Ctrl+C to stop autoboot
CFG_BOOT_ADDR:0x58040000
8192 KiB hi_sfc at 0:0 is now current device

### boot load complete: 1884992 bytes loaded to 0x82000000
### SAVE TO 80008000 !
## Booting kernel from Legacy Image at 82000000 ...
   Image Name:   linux
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    1884928 Bytes = 1.8 MiB
   Load Address: 80008000
   Entry Point:  80008000


load=0x80008000,_bss_end=80829580,image_end=801d4300,boot_sp=807c71d8
   Loading Kernel Image ... OK
OK

Starting kernel ...

Uncompressing Linux... done, booting the kernel.

以及 u-boot 环境:

hisilicon # printenv
bootcmd=fload;bootm 0x82000000
baudrate=115200
bootfile="uImage"
da=mw.b 0x82000000 ff 1000000;tftp 0x82000000 u-boot.bin.img;sf probe 0;flwrite
du=mw.b 0x82000000 ff 1000000;tftp 0x82000000 user-x.cramfs.img;sf probe 0;flwrite
dr=mw.b 0x82000000 ff 1000000;tftp 0x82000000 romfs-x.cramfs.img;sf probe 0;flwrite
dw=mw.b 0x82000000 ff 1000000;tftp 0x82000000 web-x.cramfs.img;sf probe 0;flwrite
dc=mw.b 0x82000000 ff 1000000;tftp 0x82000000 custom-x.cramfs.img;sf probe 0;flwrite
up=mw.b 0x82000000 ff 1000000;tftp 0x82000000 update.img;sf probe 0;flwrite
ua=mw.b 0x82000000 ff 1000000;tftp 0x82000000 upall_verify.img;sf probe 0;flwrite
tk=mw.b 0x82000000 ff 1000000;tftp 0x82000000 uImage; bootm 0x82000000
dd=mw.b 0x82000000 ff 1000000;tftp 0x82000000 mtd-x.jffs2.img;sf probe 0;flwrite
ipaddr=192.168.1.10
serverip=192.168.1.107
netmask=255.255.255.0
ethaddr=00:12:12:4b:6b:b6
HWID=8043420004048425
ob_start=0
ob_data=7b
appSystemLanguage=SimpChinese
appVideoStandard=PAL
bootdelay=5
bootargs=mem=40M console=ttyAMA1,115200 console=ttyAMA0,115200 root=/dev/mtdblock1 rootfstype=cramfs mtdparts=hi_sfc:256K(boot),3520K(romfs),2560K(user),1280K(web),256K(custom),320K(mtd)
stdin=serial
stdout=serial
stderr=serial
verify=n
ver=U-Boot 2010.06-svn (Jun 16 2014 - 09:36:52)

Environment size: 1272/65532 bytes

U-Boot 帮助提示(我认为您可以使用可选模块构建 u-boot。这显示了此 u-boot 实例中内置的内容?):

hisilicon # help
?       - alias for 'help'
base    - print or set address offset
boot    - boot default, i.e., run 'bootcmd'
bootd   - boot default, i.e., run 'bootcmd'
bootm   - boot application image from memory
bootp   - boot image via network using BOOTP/TFTP protocol
cmp     - memory compare
cp      - memory copy
crc32   - checksum calculation
fload   - fload  - load binary file from a filesystem image for system boot

flwrite - SPI flash sub-system
getinfo - print hardware information
go      - start application at address 'addr'
help    - print command description/usage
lip     - lip      - set local ip address but not save to flash

loadb   - load binary file over serial line (kermit mode)
loady   - load binary file over serial line (ymodem mode)
loop    - infinite loop on address range
mac     - mac      - set mac address and save to flash

md      - memory display
mii     - MII utility commands
mm      - memory modify (auto-incrementing address)
mtest   - simple RAM read/write test
mw      - memory write (fill)
nm      - memory modify (constant address)
ping    - send ICMP ECHO_REQUEST to network host
printenv- print environment variables
rarpboot- boot image via network using RARP/TFTP protocol
reset   - Perform RESET of the CPU
run     - run commands in an environment variable
saveenv - save environment variables to persistent storage
setenv  - set environment variables
sf      - SPI flash sub-system
sip     - sip      - set server ip address but not save to flash

tftp    - tftp  - download or upload image via network using TFTP protocol
version - print monitor version

请注意,bootargs变量中指定的控制台来自我的实验。我已经尝试了ttyAMA0, ttyAMA1,tty0和许多其他类似的变量。

处理器为海思Hi3518,为ARM SoC。

现在,我唯一能想到的就是将闪存 IC 从板上热风吹出并以这种方式转储,但这是很多工作,我宁愿先看看是否有软件选项。

3个回答

的方式,我做到了在Kindle上是加载闪存分区到内存中,然后使用内存转储命令来转储他们在十六进制格式(然后一些Python脚本来转换十六进制回二进制)。这有点慢,但确实达到了目标。

你的U-Boot似乎并不具备bbm命令,但fload - load binary file from a filesystem image for system bootsf - SPI flash sub-system声音有前途,我会建议他们探索。您也可以使用tftp通过网络发送图像而不必使用控制台转储它们。

我在用sf read,效果还不错。它可以被调用如下

sf read [addr] [offset] [len]

因此,对于您的情况,读取 romfs 将如下所示:

sf probe 0; sf read 0x82000000 0x40000 0x370000

然后您可以将文件传输到 tftp 服务器:

tftp 0x82000000 romfs.cramfs 0x370000

您还可以使用sf写入 SPI 闪存(更多信息可以在这里找到)。

如果你真的很幸运,如果你能找到一个支持该芯片组或足够多的芯片组的系统(例如 OpenWrt),你可能能够从另一个系统(例如 OpenWrt)创建一个 Linux initramfs 映像,它可以通过 TFTP 启动或ymodem为你提供一个串行安慰。

内核中似乎有某种支持hisilicon或即将到来),因此您也可以启动 buildroot 映像。