在调试一些固件的时候,发现它们的包binwalk识别不了,解不出来。这个时候就要另外想办法。
下面例举2个我遇到的情况。

1. 某 openwrt bin ,binwalk无法识别

Binwalk xxx.bin

可以看到只能识别到头部,下面xz compressed data 实际上是文件系统,被加密了。用binwalk解不出来。
这里用 firmware-mod-kit /trunk/src/others/squashfs-4.2/ unsquashfs 的工具解包。
具体做法如下:
1.1.dd 分离出下面文件系统部分,命令如下。
dd if=mt7620-WE1826-20190809_202616.bin of=mt2019.bin skip=0012ed53 bs=1,分离出的文件取名 mt2019
文件系统有个MagicValue值:shsq,所以skip位置要计算一下。另外这个文件的版本号 major = 3,位置如下图红框。

1.2.分析squashfs-4.2 文件下的源码 unsquashfs.c 文件,可以知道要解包的话,MagciValue要是0x73717368 也就是字符:hsqs,且版本号 major须是4。对应的源代码如下,read_super() 函数中的。

1.3.修改分离出的mt2019文件
改MagicValue为 68 73 71 73 ,修改版本号为 04,修改后取名mt2019_hsqs.bin

1.4.最后用 firmware-mod-kit /trunk/src/others/squashfs-4.2/ unsquashfs 工具解包,命令如下。
./unsquashfs mt2019_hsqs.bin 可解出。

下面用到的方法参考链接给出。

2.1 利用旧版固件的解密程序

访问D-link的ftp:ftp://ftp2.dlink.com/PRODUCTS/DIR-882/REVA/
上面有发布过的旧版。这里选择的版本是:DIR-882_REVA_FIRMWARE_v1.10B02.zip
解压该文件,如下图。

用bingwalk 解密 DIR882A1_FW104B02_Middle_FW_Unencrypt.bin,这个bin文件是没有加密的。解密出系统之后,在目录:

1
A1_FW104B02_Middle_FW_Unencrypt.bin.extracted/_A0.extracted/n.extracted/_A0.extracted/_8AB758.extracted/cpio-root/bin

下有个 imgdecrypt 文件,这个文件就是用来解密的。

2.2使用 imgdecrypt

这里我们要使用这个imgdecrypt 来解密,所以先启动一个shell。
进入目录:

1
_DIR882A1_FW104B02_Middle_FW_Unencrypt.bin.extracted/_A0.extracted/_8AB758.extracted/cpio-root

使用命令

1
sudo chroot  . /bin/sh

shell启动成功后,使用命令 ./bin/imgdecrypt DIR867A1_FW100B07.BIN
DIR867A1_FW100B07.BIN就是binwalk无法识别的加密Bin

这个时候,再次使用 binwalk 解密 DIR867A1_FW100B07.BIN 就能成功。

参考

https://www.thezdi.com/blog/2020/2/6/mindshare-dealing-with-encrypted-router-firmware