上个月处理一个路由器固件时又踩了老坑:binwalk扫描能清清楚楚列出一堆偏移和签名,真正执行binwalk -e解包却只吐出一个外层文件系统,内层私有的东西纹丝不动。后来把binwalk/config/extract.conf打开逐行改了一遍才算解决。关于这个配置文件的说明文档少得可怜,多数教程只留下一句“编辑extract.conf可以扩展解包”,但字段含义、匹配逻辑、WSL环境下的坑基本靠猜。这篇文章就把我实际修改extract.conf的过程、验证方法和回滚方案完整记下来,给同样在搞固件分析、数据恢复或者CTF题解的朋友一个可直接照做的思路。
先交代一下适用范围:本文内容围绕binwalk 2.x版本展开,运行环境以WSL(Ubuntu)为主,也兼容普通Linux。你不需要对binwalk源码多熟悉,但至少用过binwalk -e,知道它能把嵌入文件抽出来。如果连binwalk怎么装都还没搞定,建议先跑一遍sudo apt install binwalk,再回来看下文。
1. binwalk能识别却解不开:extract.conf在解包链路里的真正作用
1.1 签名扫描和解包是两套独立机制
很多人会有一个误解:binwalk既然能识别出文件里的某个格式,提取时就一定会把它解出来。实际上,binwalk的“识别”和“解包”是两个完全不同的阶段。
识别阶段靠的是magic签名数据库。binwalk会扫描文件里的字节流,把符合特征的位置标记出来,然后告诉你“这里有个gzip压缩数据”“那边有个SquashFS文件系统”。这一步不依赖任何外部工具,纯靠字节匹配就能完成。
解包阶段就复杂多了。binwalk知道这里有gzip数据,但要不要解压、用什么工具解压、解压后怎么放,需要看外部工具是否存在、配置规则是否匹配。这里起关键作用的就是extract.conf。这个文件的本质是一张“规则表”,告诉binwalk:当扫描到某个签名时,执行哪条外部解包命令,把结果放到哪里。
换句话说,如果某个格式能被识别,但没有对应规则,binwalk只能把那段数据当作普通数据抠出来,不会帮你展开内部结构。这就是大量“识别到了却解不开”问题的根源。
1.2 默认配置覆盖范围比你想象的小
默认自带的extract.conf覆盖的都是社区里最常见、最标准的格式,比如gzip、zip、tar、7z、SquashFS、JFFS2这一类。只要目标固件用的是这些通用算法,binwalk -e基本能跑通。
一旦碰到下面几种场景,默认规则就不够用了:
- 私有固件头,厂商自己打包、魔数也是自定义字节;
- 某些游戏ROM镜像(比如NDS类封包),binwalk能识别出数据段,但不会调用专用解包指令;
- 加密压缩包,或者需要在解包前做额外解密的格式;
- 需要特殊参数才能解开的变种文件系统,比如非标准SquashFS。
处理这些情况时,要么按老办法手动dd切数据,再用其他工具继续,要么就扩展extract.conf,让binwalk碰到对应魔数时自动调用你指定的脚本或第三方解包器。
1.3 “解一层就停住”也跟extract.conf有关
还有一个常见现象:binwalk -e确实解出了一层,但解出的结果里嵌套了另一个文件系统,binwalk却没有继续往下解。这不一定是规则没写,更多时候是因为你在命令行里只用了-e,没有加递归参数。
binwalk的-e默认不会对解包结果里的文件再次做深入提取,-M(递归扫描)和-e配合才会一层层剥洋葱。很多教程随口一句“binwalk -e自动递归”其实不严谨。
我提到这个是想提醒你,写规则的时候要考虑清楚:你的规则是要“解一层”还是“持续递归”。如果只是解一层,交给binwalk的默认行为就行;如果要递归解嵌套结构,最好把递归逻辑写进你自己调用的脚本里,而不是依赖extract.conf单行规则。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 改配置之前先做三件事:定位、读注释、备份
2.1 先弄清楚当前binwalk实际加载的是哪个extract.conf
这个文件最坑的地方在于:系统里可能不止一个。包管理器安装的、pip安装的、源码运
