第三章 固件获取与提取:从源头到二进制

做固件逆向,第一步也是最关键的一步——拿到固件。没有固件,后面全是空谈。

我见过不少新手,花大把时间研究怎么逆向,结果连固件都搞不到手。说白了,固件获取是地基,地基不稳,楼盖得再高也得塌。

这一章,我把固件获取的路径分成三大类:软件层面硬件层面网络层面。咱们一个一个来拆。

3.1 固件来源:你从哪搞到固件?

固件不是凭空冒出来的。常见的来源就这几个:

  • 官网下载:最省事。厂商通常会提供固件更新包,直接去支持页面找。但要注意,有些厂商会把固件加密打包,你得先解包。
  • 设备备份:从设备本身备份出来。比如通过串口、SSH、Telnet 把 Flash 里的内容 dump 出来。我遇到过一台老路由器,Web 界面就有“备份配置”功能,结果备份出来的其实是整个固件——厂商的疏忽,成了我的突破口。
  • Flash 芯片读取:最硬核的方式。直接拆设备,把 Flash 芯片焊下来,用编程器读。这招适用于设备变砖、没有固件更新包、或者厂商压根不公开固件的情况。
我的习惯:先搜官网,再试备份,最后才上硬件。能不动烙铁就不动,省时间。

3.2 硬件提取方法:动手能力是硬门槛

硬件提取,说白了就是和设备“硬碰硬”。你想想看,设备不给你固件,你就自己从芯片里读出来。

3.2.1 JTAG:调试接口的“后门”

JTAG 是 IEEE 标准,原本是用来测试芯片的。但逆向工程师用它来读取 Flash、调试固件、甚至直接控制 CPU。

JTAG 接口通常有 4 个信号线:TMS、TCK、TDI、TDO。再加上 VCC 和 GND,一共 6 根线。

怎么找 JTAG 接口?我一般这么干:

  • 看 PCB 上有没有 4 个或 6 个排成一排的焊盘,旁边可能标着“J”或“JTAG”
  • 用万用表测电阻,找到 GND 和 VCC
  • 用逻辑分析仪抓信号,看哪个引脚有规律的时钟脉冲——那就是 TCK
注意:JTAG 接口可能被厂商禁用或锁定。我曾经碰到一台设备,JTAG 接口焊盘都在,但芯片内部熔丝已经烧断,JTAG 功能被永久关闭。白忙活一场。

3.2.2 SPI Flash 编程器:最常用的硬件提取方式

大多数嵌入式设备用 SPI Flash 存储固件。常见的型号有 Winbond W25Q64、Macronix MX25L128 等。

提取步骤很简单:

  1. 拆开设备,找到 SPI Flash 芯片
  2. 用热风枪拆焊下来(或者用夹子夹住,但夹子容易接触不良)
  3. 把芯片放到编程器上,比如 CH341A、FT2232H
  4. 用软件读取,保存为 .bin 文件

我个人的经验:夹子不如拆焊靠谱。夹子容易松动,读出来的数据可能出错。尤其是高速读取时,错一个 bit,后面逆向全白费。

3.2.3 热风枪拆焊:手稳才能活好

拆焊 SPI Flash 其实不难,但新手容易翻车。我刚开始干的时候,温度调太高,直接把芯片吹鼓包了。

几个要点:

  • 温度控制在 300-350°C,风速中低档
  • 先给芯片周围预热,再集中吹引脚
  • 用镊子轻轻推一下,芯片能动了就说明焊锡融化了
  • 拆下来后,用助焊剂和烙铁清理焊盘
避坑指南:我曾经拆一个 W25Q128,吹了 30 秒没动,一着急把温度调到 400°C,结果芯片外壳裂了。后来发现是 PCB 接地层太大,散热太快。正确做法是:先给 PCB 背面加热,再吹芯片。

3.3 软件提取方法:不动硬件也能拿固件

不是所有场景都需要动烙铁。很多时候,软件手段就能搞定。

3.3.1 串口转储:最经典的“软提取”

设备通常有 UART 串口,用于调试输出。如果能进入 Bootloader,就可以用串口把固件 dump 出来。

步骤:

  1. 找到设备上的 UART 接口(TX、RX、GND)
  2. 用 USB 转串口模块连接,波特率通常 115200 或 57600
  3. 上电,看终端输出。如果看到 Bootloader 菜单,恭喜你
  4. 输入命令,比如 sf read 0x80000000 0x0 0x100000,把 Flash 内容读到内存,再通过串口传出来

为什么能成功?因为很多厂商的 Bootloader 没做权限控制。你想想看,他们只想着调试方便,没想过有人会利用这个接口 dump 固件。

3.3.2 网络抓包:从 OTA 更新里截获固件

设备做 OTA 升级时,固件会通过网络传输。这时候用 Wireshark 抓包,就能拿到固件文件。

具体做法:

  • 把设备连到电脑的共享网络,或者用路由器镜像端口
  • 在电脑上启动 Wireshark,过滤 HTTP 或 HTTPS 流量
  • 触发设备升级,观察数据包
  • 找到包含固件的数据流,导出为文件

但有个坑:很多厂商会用 HTTPS 加密传输。这时候你需要中间人攻击(MITM),或者从设备里提取出 SSL 证书。我遇到过一台智能摄像头,固件是加密传输的,但证书硬编码在固件里——先 dump 固件,再解密,绕了一圈。

3.3.3 固件更新包解析:厂商给的“礼物”

厂商提供的固件更新包,通常是一个 .bin、.img、.zip 或 .tar 文件。但别高兴太早,里面可能有多层封装。

常见的结构:

  • 文件头 + 固件数据 + 校验和
  • 加密层 + 压缩层 + 原始固件
  • 多个分区打包在一起(Bootloader、Kernel、Rootfs)

我常用的工具:

  • binwalk:自动扫描固件中的文件系统、压缩包、签名
  • dd:手动切割固件分区
  • strings:快速查看固件中的可读字符串,判断文件系统类型
举个例子:用 binwalk 扫描一个固件包:
binwalk -Me firmware.bin
它会自动解压、提取文件系统。如果遇到加密,binwalk 会告诉你“这是加密数据”,你就得另想办法了。

3.4 知识体系总览

下面这张图,是我自己整理的固件获取与提取的完整流程。你可以把它当作一张地图,遇到具体设备时,按图索骥。

固件获取与提取知识体系 软件提取 硬件提取 网络提取 串口转储 (UART Bootloader) 固件更新包解析 (binwalk) Web/SSH/Telnet 备份 JTAG/SWD 调试接口 SPI Flash 编程器 热风枪拆焊 + 夹子 Wireshark 抓包 OTA MITM 中间人攻击 固件镜像下载 固件二进制文件 (.bin) 三种路径最终汇聚到同一个目标:拿到可分析的固件二进制

3.5 实战建议:先软后硬,由简入繁

我个人的工作流是这样的:

  1. 先查官网:5 分钟搞定,不费力气
  2. 再试串口:如果设备有 UART,进 Bootloader 看看能不能 dump
  3. 抓 OTA 包:触发升级,用 Wireshark 截获
  4. 最后上硬件:拆机、找 JTAG、读 Flash

为什么要这个顺序?因为软件手段成本低、风险小。硬件提取一旦失误,可能把设备搞报废。我刚开始做的时候,为了省事直接拆 Flash,结果焊盘掉了两个,设备彻底废了。后来学乖了,先试软件,不行再动烙铁。

一个小技巧:拿到固件后,第一件事不是逆向,而是用 file 命令看文件类型。比如:
file firmware.bin
输出可能是 "Linux kernel ARM boot executable",也可能是 "data"(加密了)。这一步能帮你快速判断下一步怎么走。

好了,固件获取就讲到这里。记住一句话:拿不到固件,一切都是空谈。下一章,咱们聊聊拿到固件之后,怎么分析它的结构——文件系统、分区表、压缩算法,这些才是逆向的真正开始。


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