4、Binwalk深度解析:安装与编译、固件扫描、文件提取、熵分析、签名识别

Binwalk,这玩意儿可以说是固件逆向的瑞士军刀。我入行那会儿,还没这么趁手的工具,都是拿十六进制编辑器硬啃。后来Binwalk一出来,整个圈子都炸了——原来固件分析可以这么爽。

今天咱们就把它掰开揉碎了讲。从安装编译,到扫描提取,再到熵分析和签名识别,一条龙走完。

4.1 安装与编译:别踩我踩过的坑

Binwalk的安装,说简单也简单,说坑也坑。我建议你直接用源码编译,别图省事用pip装旧版。

⚠️ 避坑指南: 我曾经用apt直接装Binwalk,结果版本太老,连最新的LZMA压缩都解不开。折腾了一下午才发现是版本问题。

正确的姿势是这样的:

# 克隆最新源码
git clone https://github.com/ReFirmLabs/binwalk.git
cd binwalk

# 安装依赖
sudo apt-get install python3-pip
sudo pip3 install -r requirements.txt

# 编译安装
sudo python3 setup.py install

# 验证安装
binwalk --help

嗯,这里要注意。如果你搞IoT固件,一定要装额外的解压工具:

# 安装sasquatch(SquashFS支持)
sudo apt-get install build-essential liblzma-dev liblzo2-dev zlib1g-dev
git clone https://github.com/devttys0/sasquatch
cd sasquatch
./build.sh

# 安装jefferson(JFFS2支持)
sudo pip3 install jefferson

为什么非要装这些?我遇到过一台路由器,固件用SquashFS打包,没装sasquatch直接报错。你想想看,卡在这种地方多冤。

4.2 固件扫描:第一眼就看透它

拿到一个固件,我习惯先跑个快速扫描。就像医生看病先量体温一样。

binwalk firmware.bin

输出结果会告诉你:这个固件里藏了哪些东西。比如:

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             TRX firmware header, little endian, image size: 8388608
64            0x40            LZMA compressed data, properties: 0x5D
2621440       0x280000        SquashFS filesystem, little endian, version 4.0
...

看到没?TRX头、LZMA压缩、SquashFS文件系统,一目了然。我个人习惯先看文件系统偏移,这往往是固件的核心。

💡 小技巧: 加个-M参数,可以显示更详细的签名信息。比如:binwalk -M firmware.bin

4.3 文件提取:把固件拆成零件

扫描完了,下一步就是提取。说白了就是把固件里的文件系统、内核、驱动啥的都拆出来。

# 自动提取所有文件
binwalk -e firmware.bin

# 指定提取到某个目录
binwalk -e -C ./output firmware.bin

# 递归提取(对付多层打包的固件)
binwalk -Me firmware.bin

提取完成后,你会得到一个文件夹。里面通常有:

  • squashfs-root/ — 文件系统,最值钱的部分
  • _firmware.bin.extracted/ — 其他提取出的碎片

我记得有一次分析某品牌摄像头固件,提取出来发现文件系统里有个隐藏的调试脚本。那个脚本暴露了后门端口。嗯,这种惊喜在固件逆向里很常见。

⚠️ 注意: 提取出来的文件系统,别直接修改再打包回去。很多固件有校验,改了会变砖。我吃过这个亏。

4.4 熵分析:判断加密和压缩的利器

熵分析,听起来高大上,其实原理很简单。它衡量数据的随机程度。

  • 高熵(接近8.0):通常是加密数据或压缩数据
  • 低熵(接近0):通常是明文、代码、文件系统
  • 中等熵(4-6):可能是混合区域

用Binwalk做熵分析:

# 生成熵图
binwalk -E firmware.bin

# 保存熵图为PNG
binwalk -E -J firmware.bin

你会得到一张图,横轴是偏移地址,纵轴是熵值。我一般这么看:

熵值区间 可能含义 我的处理方式
0.0 - 2.0 空白区域或固定数据 跳过,不浪费时间
2.0 - 5.0 代码或文件系统 重点关注,提取分析
5.0 - 7.5 压缩数据 尝试解压,找算法
7.5 - 8.0 加密数据 准备硬啃,或者放弃

为什么会这样?因为加密算法会让数据分布非常均匀,熵值自然就高。压缩算法虽然也高,但通常会有一些结构特征。

🔑 关键经验: 我遇到过一款路由器,固件开头是低熵,中间突然跳高熵。一查,原来是厂商把文件系统加密了。这种时候,你就得找密钥了。

4.5 签名识别:Binwalk的看家本领

Binwalk之所以强大,全靠它的签名库。它内置了上千种文件头和压缩算法的签名。

你可以自定义签名,这是进阶玩法:

# 查看内置签名
binwalk --signature-list

# 自定义签名文件(magic文件)
# 格式:文件类型 偏移量 签名值
# 示例:
# my_custom_fs 0x0 12345678 AABBCCDD

# 使用自定义签名
binwalk -m my_magic.bin firmware.bin

我经常自己写签名。比如某厂商喜欢在固件开头加个自定义头,Binwalk不认识。那我就自己写个magic规则:

# 自定义签名示例
# 厂商XYZ的固件头
0       string  XYZF    XYZ Firmware Header
64      string  KRNL    Linux Kernel Image
1024    string  ROOT    SquashFS Filesystem

你想想看,有了这个能力,什么固件在你面前都是透明的。

💡 进阶技巧:binwalk -y "filesystem" firmware.bin可以只搜索文件系统相关的签名。省时间。

4.6 知识体系总览

说了这么多,咱们用一张图把Binwalk的核心能力串起来:

Binwalk 核心功能 安装与编译 固件扫描 文件提取 熵分析 签名识别 源码编译 依赖安装 解压工具链 快速扫描 深度扫描 签名匹配 自动提取 递归提取 文件系统 熵值计算 熵图生成 加密检测 内置签名库 自定义签名 magic规则

这张图把Binwalk的五大模块串起来了。你从安装开始,到扫描、提取、分析,最后用签名识别收尾,一条完整的固件逆向流水线。

好了,Binwalk的核心内容就这些。记住,工具只是工具,真正值钱的是你分析固件的思路和经验。多动手,多踩坑,慢慢就熟了。


公众号:蓝海资料掘金营,微信deep3321