1. 固件文件类型识别
任务说明
拿到一个未知固件文件后,第一步是确定其基本结构:是裸二进制镜像、带文件头的镜像,还是包含多个文件系统的复合固件。本案例使用 file 和 binwalk 两个工具,对一个示例固件进行类型识别与结构分析,最终输出固件内嵌文件系统的偏移地址与类型。
环境准备
需要一台 Linux 主机(或 WSL),安装以下工具:
sudo apt-get update
sudo apt-get install -y file binwalk
本案例使用一个合成的示例固件 sample_fw.bin 作为分析对象,其构造方式见下文,确保结果可复现。
示例固件构造
为了在无真实设备固件的情况下演示完整流程,先合成一个包含 Squashfs 文件系统的固件镜像:
# 创建根文件系统内容
mkdir -p rootfs/{bin,etc,usr/bin}
echo "demo" > rootfs/etc/version
# 制作 squashfs 镜像
mksquashfs rootfs squashfs.img -noappend -comp xz
# 在固件头部添加 64 字节的引导头和 1KB 的随机填充
dd if=/dev/urandom of=header.bin bs=64 count=1
dd if=/dev/urandom of=padding.bin bs=1024 count=1
cat header.bin padding.bin squashfs.img > sample_fw.bin
rm -rf rootfs header.bin padding.bin squashfs.img
执行后得到 sample_fw.bin,该文件模拟了一个带自定义引导头、中间有填充数据、尾部为 Squashfs 文件系统的典型固件布局。
关键完整代码
以下脚本封装了本次识别的完整流程,可直接对任意固件文件执行:
#!/bin/bash
# 用法: ./analyze_fw.sh <固件文件>
FW="${1:-sample_fw.bin}"
echo "===== [1] file 基础识别 ====="
file "$FW"
echo ""
echo "===== [2] binwalk 扫描文件系统签名 ====="
binwalk "$FW"
echo ""
echo "===== [3] 提取文件系统偏移(自动解析) ====="
# 从 binwalk 输出中提取 Squashfs 偏移量(十进制)
offset=$(binwalk "$FW" | grep -i "squashfs" | head -1 | awk '{print $1}')
if [ -n "$offset" ]; then
echo "检测到 Squashfs 文件系统,偏移地址: 0x$(printf '%x' $offset)"
# 提取文件系统到独立文件
dd if="$FW" of=extracted.squashfs bs=1 skip=$offset 2>/dev/null
echo "已提取到 extracted.squashfs ($(stat -c%s extracted.squashfs) 字节)"
echo ""
echo "===== [4] 验证提取结果 ====="
file extracted.squashfs
# 尝试挂载查看内容(需要 root)
if [ "$(id -u)" = "0" ]; then
mkdir -p /mnt/fw_root
mount -t squashfs extracted.squashfs /mnt/fw_root -o loop
echo "挂载成功,根文件系统内容:"
ls /mnt/fw_root
umount /mnt/fw_root
else
echo "非 root 用户,跳过挂载验证。可用 unsquashfs extracted.squashfs 解包查看。"
fi
else
echo "未检测到 Squashfs 文件系统"
fi
将上述脚本保存为 analyze_fw.sh 并赋予执行权限:
chmod +x analyze_fw.sh
./analyze_fw.sh sample_fw.bin
预期输出与判定标准
执行后应观察到以下关键结果:
file命令输出包含data或u-boot等描述,表明文件不是标准可执行格式,而是原始镜像;binwalk扫描结果中列出 Squashfs 文件系统的偏移地址(十进制),并标注Squashfs filesystem, little endian, version 4.0, xz compressed等特征;- 脚本自动提取出
extracted.squashfs,且file extracted.squashfs确认其为 Squashfs 镜像; - 若以 root 运行,挂载后能看到
bin、etc、usr目录及etc/version文件。
满足以上条件即判定识别成功。若 binwalk 未检出任何文件系统,说明固件可能为纯裸代码或使用了加密/压缩,需进一步用 binwalk -E(熵分析)或手动检查头部结构。
常见问题
- binwalk 输出大量误报:使用
binwalk -M(递归扫描)或binwalk -T(设置阈值)过滤弱签名; - file 显示 "data" 无法判断类型:这是裸机固件的正常现象,需依赖 binwalk 或手动检查中断向量表(ARM Cortex-M 系列前 8 字节为初始 SP 和 PC);
- 提取的文件系统无法挂载:确认偏移是否正确,部分固件在文件系统前有校验头,需跳过额外字节。