4、固件文件分析:使用binwalk分析固件结构,识别文件系统

拿到一个固件,很多人第一反应就是直接解压。我劝你别急。先看看它长什么样,再动手不迟。

binwalk 这个工具,说白了就是固件分析的瑞士军刀。它能帮你把固件里藏着的各种东西扒出来——文件系统、内核、引导程序,甚至一些压缩数据。我个人习惯,拿到固件第一件事就是跑一遍 binwalk,看看里面到底有什么料。

4.1 binwalk 基础用法

先来个最简单的命令:

binwalk firmware.bin

输出结果会告诉你,固件里有哪些已知的签名。比如:

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             uImage header, header size: 64 bytes, ...
1024          0x400           SquashFS filesystem, little endian, ...

看到没?偏移量 0 处是 uImage 头,0x400 处是 SquashFS 文件系统。这就是固件的基本骨架。

小技巧: 如果 binwalk 没识别出来,别急着放弃。试试 binwalk -E firmware.bin,它会显示熵值分析图。高熵区域通常就是压缩或加密数据。

4.2 识别文件系统类型

嵌入式设备常用的文件系统就那么几种。我列个表,你一看就明白:

文件系统 特点 常见场景
SquashFS 只读、高压缩比 路由器、摄像头固件
JFFS2 可写、支持磨损均衡 老旧嵌入式设备、NOR Flash
CramFS 简单、轻量 早期 Linux 设备

binwalk 识别文件系统靠的是魔数签名。比如 SquashFS 的魔数是 hsqs,JFFS2 是 1985。嗯,这里要注意:有些厂商会魔改文件系统头,binwalk 可能认不出来。我曾经遇到过一台 IP Camera,binwalk 死活识别不了它的 SquashFS。后来手动查偏移,发现厂商把魔数改成了自己的标识。

4.3 提取文件系统

识别出来之后,就该提取了。binwalk 提供了几个选项:

# 自动提取所有识别到的内容
binwalk -e firmware.bin

# 指定提取某个偏移量
binwalk -D 'squashfs:rootfs.sqsh' firmware.bin

# 递归提取(处理嵌套压缩)
binwalk -Me firmware.bin

-e 选项最常用。它会自动解压并提取所有已知格式。但有时候会漏掉一些东西。我建议你提取完后,用 file 命令检查一下提取出来的文件:

file rootfs.sqsh
# 输出: Squashfs filesystem, little endian, version 4.0, ...
避坑指南: 我曾经用 -e 提取一个 32MB 的固件,结果解出来 2GB 的垃圾文件。原因是固件里有个损坏的压缩块,binwalk 反复尝试解压导致死循环。后来我改用 --dd 手动指定提取范围,才搞定。

4.4 手动分析文件系统

binwalk 不是万能的。有时候你需要手动分析。比如:

  1. 查看文件系统头:用 hexdump -C firmware.bin | head -20 看看开头有没有魔数。
  2. 计算偏移量:如果 binwalk 没识别,可以尝试用 strings 搜索 hsqs1985
  3. 验证完整性:提取后检查文件系统是否完整。比如 SquashFS 可以用 unsquashfs -s rootfs.sqsh 查看信息。

你想想看,如果固件是加密的,binwalk 可能什么都看不到。这时候就需要先解密,再分析。不过那是后面章节的内容了。

4.5 实战:分析一个路由器固件

拿一个典型的路由器固件举例:

binwalk WR841N.bin

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             uImage header, ...
64            0x40            LZMA compressed data
1310720       0x140000        SquashFS filesystem, little endian, version 4.0

提取 SquashFS:

binwalk -D 'squashfs:rootfs.sqsh' WR841N.bin
unsquashfs rootfs.sqsh

解压后,你会看到熟悉的 Linux 目录结构:/bin/etc/usr 等等。这时候就可以开始分析配置文件、二进制程序了。

核心要点: binwalk 是固件分析的第一步,但不是最后一步。识别出文件系统后,真正的逆向工作才刚刚开始。

4.6 知识体系图

下面这张图概括了本章的核心逻辑:

固件文件分析流程 固件文件 (.bin) binwalk 扫描签名 识别成功 → 提取文件系统 识别失败 → 手动分析 SquashFS / JFFS2 / CramFS hexdump / strings / 熵分析

这张图展示了固件分析的两条路径。左边是理想情况,binwalk 直接识别并提取。右边是现实情况,需要你手动介入。我建议你两条路都走一遍,互相验证。

个人经验: 我习惯在提取文件系统后,先用 find . -type f | wc -l 统计文件数量。如果只有几十个文件,说明可能只提取了部分内容。正常固件通常有几百到几千个文件。

好了,binwalk 的基本用法就这些。记住,工具只是辅助,真正值钱的是你对文件系统结构的理解。下一节我们会深入 SquashFS 的内部结构,看看怎么手动解包和打包。


专注资料整理