2. 固件解包与文件系统提取
任务目标
给定一个路由器固件镜像(.bin),通过binwalk识别文件结构并提取其中的SquashFS文件系统,最终挂载该文件系统以查看内部文件(如配置文件、Web目录等)。本案例使用OpenWrt官方固件作为示例输入。
环境准备
- 操作系统:Ubuntu 22.04+(或任何Linux发行版)
- 所需工具:
binwalk、unsquashfs、file、mount(需root权限) - 安装命令:
sudo apt update && sudo apt install -y binwalk squashfs-tools
关键完整代码
#!/bin/bash
# firmware_extract.sh - 固件解包与文件系统提取脚本
# 用法: ./firmware_extract.sh <固件镜像路径>
set -e
FIRMWARE="$1"
WORKDIR="firmware_analysis"
EXTRACT_DIR="$WORKDIR/extracted"
SQUASHFS_DIR="$WORKDIR/squashfs-root"
if [ -z "$FIRMWARE" ]; then
echo "错误: 请指定固件镜像路径"
exit 1
fi
if [ ! -f "$FIRMWARE" ]; then
echo "错误: 文件不存在: $FIRMWARE"
exit 1
fi
# 创建分析目录
mkdir -p "$WORKDIR"
rm -rf "$EXTRACT_DIR" "$SQUASHFS_DIR"
echo "[1/4] 识别固件文件类型..."
file "$FIRMWARE"
echo "[2/4] 使用binwalk扫描固件结构..."
binwalk "$FIRMWARE" | tee "$WORKDIR/binwalk_scan.txt"
echo "[3/4] 提取固件内容..."
binwalk -e -M -C "$EXTRACT_DIR" "$FIRMWARE"
# 查找提取出的SquashFS文件系统
SQUASHFS_FILE=$(find "$EXTRACT_DIR" -name "*.squashfs" -o -name "squashfs-root" -type d | head -1)
if [ -z "$SQUASHFS_FILE" ]; then
# 如果binwalk未自动解压,手动查找SquashFS偏移
echo "尝试手动定位SquashFS文件系统..."
OFFSET=$(binwalk "$FIRMWARE" | grep "Squashfs" | awk '{print $1}')
if [ -z "$OFFSET" ]; then
echo "错误: 未找到SquashFS文件系统"
exit 1
fi
echo "找到SquashFS偏移: 0x$OFFSET"
dd if="$FIRMWARE" of="$WORKDIR/rootfs.squashfs" bs=1 skip=$((16#$OFFSET)) 2>/dev/null
SQUASHFS_FILE="$WORKDIR/rootfs.squashfs"
fi
echo "[4/4] 解压SquashFS文件系统..."
if [ -d "$SQUASHFS_FILE" ]; then
# binwalk已自动解压为目录
cp -r "$SQUASHFS_FILE" "$SQUASHFS_DIR"
else
unsquashfs -d "$SQUASHFS_DIR" "$SQUASHFS_FILE"
fi
echo ""
echo "=== 提取完成 ==="
echo "文件系统位于: $SQUASHFS_DIR"
echo ""
echo "查看关键目录:"
ls -la "$SQUASHFS_DIR/etc/" 2>/dev/null | head -20
echo ""
echo "查看Web目录:"
ls -la "$SQUASHFS_DIR/www/" 2>/dev/null | head -20
运行方式
- 下载示例固件(约8MB):
wget https://downloads.openwrt.org/releases/22.03.5/targets/ramips/mt7621/openwrt-22.03.5-ramips-mt7621-xiaomi_mi-router-4a-gigabit-squashfs-sysupgrade.bin - 赋予脚本执行权限并运行:
chmod +x firmware_extract.sh && sudo ./firmware_extract.sh openwrt-22.03.5-ramips-mt7621-xiaomi_mi-router-4a-gigabit-squashfs-sysupgrade.bin
验证方法与判定标准
- binwalk扫描输出应包含类似
Squashfs filesystem, little endian, version 4.0的行,表明固件中存在SquashFS文件系统。 - 脚本执行成功后,
firmware_analysis/squashfs-root/目录应存在,且包含etc/、usr/、www/等典型Linux目录结构。 - 查看关键文件:执行
cat firmware_analysis/squashfs-root/etc/openwrt_release应输出OpenWrt版本信息,证明文件系统内容可正常读取。 - 可选挂载验证(需root):
mkdir -p /mnt/fw && mount -t squashfs -o loop,ro firmware_analysis/rootfs.squashfs /mnt/fw && ls /mnt/fw/etc/
挂载成功后应能看到与解压目录一致的文件列表。
常见问题
- binwalk未识别SquashFS:某些固件使用非标准偏移或自定义头部,可尝试
binwalk -A或手动用dd按已知偏移截取。 - unsquashfs报错:确认固件使用SquashFS v4.0(OpenWrt默认),旧版v3需安装
squashfs-tools-legacy。 - 权限不足:挂载操作需要root权限,解压操作建议使用普通用户避免污染系统文件。