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 -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 不是万能的。有时候你需要手动分析。比如:
- 查看文件系统头:用
hexdump -C firmware.bin | head -20看看开头有没有魔数。 - 计算偏移量:如果 binwalk 没识别,可以尝试用
strings搜索hsqs或1985。 - 验证完整性:提取后检查文件系统是否完整。比如 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 等等。这时候就可以开始分析配置文件、二进制程序了。
4.6 知识体系图
下面这张图概括了本章的核心逻辑:
这张图展示了固件分析的两条路径。左边是理想情况,binwalk 直接识别并提取。右边是现实情况,需要你手动介入。我建议你两条路都走一遍,互相验证。
find . -type f | wc -l 统计文件数量。如果只有几十个文件,说明可能只提取了部分内容。正常固件通常有几百到几千个文件。
好了,binwalk 的基本用法就这些。记住,工具只是辅助,真正值钱的是你对文件系统结构的理解。下一节我们会深入 SquashFS 的内部结构,看看怎么手动解包和打包。