3. 手动提取SquashFS文件系统
任务目标
从固件镜像中手动提取SquashFS文件系统,使用unsquashfs工具完成解包,并验证提取出的文件结构与原始镜像中的关键文件一致。
环境准备
本案例需要Linux环境(推荐Ubuntu 22.04+),安装squashfs-tools包:
sudo apt-get update && sudo apt-get install -y squashfs-tools
固件镜像准备
为便于演示,先创建一个包含已知内容的SquashFS镜像作为测试输入。实际分析中,此步骤对应从路由器固件中定位并切割出的SquashFS分区镜像。
# 创建测试目录结构
mkdir -p rootfs/{etc,usr/bin,var/log}
echo "version=1.2.3" > rootfs/etc/version.conf
echo "#!/bin/sh\necho hello" > rootfs/usr/bin/hello.sh
chmod +x rootfs/usr/bin/hello.sh
echo "boot log" > rootfs/var/log/messages
# 生成SquashFS镜像(模拟固件中的文件系统分区)
mksquashfs rootfs firmware.squashfs -comp xz -b 131072
关键完整代码:手动提取与验证
以下脚本完成从固件镜像中识别SquashFS起始偏移、提取文件系统并验证结果的全流程:
#!/bin/bash
# extract_squashfs.sh - 手动提取SquashFS并验证
set -euo pipefail
FIRMWARE="firmware.squashfs"
OUT_DIR="extracted_rootfs"
# 1. 定位SquashFS魔数(hsqs)在固件中的偏移
# 使用grep在二进制中查找,输出字节偏移
OFFSET=$(grep -aob 'hsqs' "$FIRMWARE" | head -1 | cut -d: -f1)
if [ -z "$OFFSET" ]; then
echo "[错误] 未找到SquashFS魔数"
exit 1
fi
echo "[信息] 找到SquashFS偏移: $OFFSET 字节"
# 2. 从偏移处切割出SquashFS镜像
dd if="$FIRMWARE" of="squashfs_part.bin" bs=1 skip="$OFFSET" status=none
# 3. 使用unsquashfs提取文件系统
rm -rf "$OUT_DIR"
mkdir -p "$OUT_DIR"
unsquashfs -d "$OUT_DIR" squashfs_part.bin > /dev/null
# 4. 验证提取结果
echo "--- 验证关键文件 ---"
# 4.1 检查版本文件内容
if grep -q "version=1.2.3" "$OUT_DIR/etc/version.conf"; then
echo "[通过] etc/version.conf 内容正确"
else
echo "[失败] etc/version.conf 内容不匹配"
exit 1
fi
# 4.2 检查脚本文件权限
if [ -x "$OUT_DIR/usr/bin/hello.sh" ]; then
echo "[通过] usr/bin/hello.sh 可执行权限正确"
else
echo "[失败] usr/bin/hello.sh 权限错误"
exit 1
fi
# 4.3 检查目录结构完整性
for dir in etc usr/bin var/log; do
if [ -d "$OUT_DIR/$dir" ]; then
echo "[通过] 目录 $dir 存在"
else
echo "[失败] 目录 $dir 缺失"
exit 1
fi
done
echo "--- 提取与验证全部通过 ---"
运行方式
chmod +x extract_squashfs.sh
./extract_squashfs.sh
验证方法与判定标准
脚本执行后,预期输出包含以下关键信息:
[信息] 找到SquashFS偏移: 0 字节
[通过] etc/version.conf 内容正确
[通过] usr/bin/hello.sh 可执行权限正确
[通过] 目录 etc 存在
[通过] 目录 usr/bin 存在
[通过] 目录 var/log 存在
--- 提取与验证全部通过 ---
判定标准:脚本退出码为0,且最后一行输出“提取与验证全部通过”。若固件镜像前部存在引导头或其他数据,偏移量会大于0,脚本仍能正确定位并提取。
常见问题
- 魔数偏移为0:当镜像本身就是SquashFS时(如本例),偏移为0属正常现象。
- 找不到hsqs:确认固件确实包含SquashFS分区;部分固件使用LZMA或其他压缩,需先解压。
- unsquashfs版本不兼容:若提示无法识别压缩类型,尝试
unsquashfs -s squashfs_part.bin查看详细信息,必要时升级squashfs-tools。