使用 dd 命令从固件二进制文件中提取 lzma 文件

使用 dd 命令从固件二进制文件中提取 lzma 文件

以下是所引用固件的直接链接:

ftp://ftp2.dlink.com/PRODUCTS/DIR-601/REVB/DIR-601_REVB_FIRMWARE_2.01.ZIP

我无法更具体地通过使用命令dd来提取固件二进制文件中的内核来从该特定路由器中提取文件系统。

我的步骤:

我曾经binwalk dir601_revB_FW_201.bin发现有问题的 lzma 位于字节 #148(所以很早就发现了)。我尝试使用以下命令提取此 lzma 存档:

dd if=dir601_revB_FW_201.bin skip=148 bs=1 count=8388608 of=kernel.lzma

档案的字典大小在哪里count但无济于事,因为当我尝试unlzma提取档案时它一直给我compressed data is corrupt错误。

如何提取并解压该档案?

答案1

在我的 Debian 中

binwalk -e dir601_revB_FW_201.bin

生成(除其他外)一个文件。下面是我使用和./_dir601_revB_FW_201.bin.extracted/94获取相同文件的步骤,就像您尝试的那样。ddunlzma


我运行了你的原始命令和来自另一个答案。在这两种情况下,我都可以用 进行提取7za(虽然有错误),但不能用 sole 进行提取unlzma。我能够改进方法,使其unlzma有效。

首先你count=8388608显然是错的,dir601_revB_FW_201.bin因为更小。正确的数字在标题中:

uImage header, header size: 64 bytes, […] image size: 819799 bytes, […]

你的命令应该是

dd if=dir601_revB_FW_201.bin skip=148 bs=1 count=819799 of=x.lzma

如果我提取的字节数少了 1 个,unlzma x.lzma我的 Debian 就会报错unexpected end of input。如果我提取的字节数多了 1 个,它又会报错compressed data is corrupt

准确的数字819799不会引发工具的抱怨,一切正常。之后我可以binwalk x(正如另一个答案已经指出的那样)。

该文件与获得的x文件相同(已通过 确认)。94binwalk -ecmp

答案2

我建议你稍微改变一下你的dd选择。试试这样:

dd if=dir601_revB_FW_201.bin ibs=1 skip=148 of=x.lzma

然后你可以使用它来解压缩lzma -d x.lzma,你binwalk x会看到类似这样的内容:

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
77724         0x12F9C         Certificate in DER format (x509 v3), header length: 4, sequence length: 30
1769504       0x1B0020        Linux kernel version 2.6.31
1832080       0x1BF490        CRC32 polynomial table, little endian
2081839       0x1FC42F        Neighborly text, "neighbor %.2x%.2x.%.2x:%.2x:%.2x:%.2x:%.2x:%.2x lost on port %d(%s)(%s)"

相关内容