第三章 固件获取与提取:从芯片到二进制

各位同学,今天我们来聊聊固件获取与提取。这步说白了,就是怎么把固件从硬件里“请”出来。我见过不少新手,拿到设备就急着用软件去分析,结果发现固件根本读不出来——嗯,硬件层面的工作没做到位。

我个人习惯把固件获取分成三个层次:芯片选型与文档阅读硬件编程器操作二进制提取。咱们一层层来拆解。

3.1 芯片选型与数据手册阅读

拿到一块板子,第一件事不是上编程器,而是先搞清楚上面用的是哪颗Flash芯片。你想想看,连芯片型号都不知道,怎么知道它的引脚定义、电压要求、指令集?

我一般会先看芯片表面的丝印。常见的SPI Flash芯片有Winbond、Macronix、GigaDevice、Micron等品牌。比如丝印“W25Q64FV”,W代表Winbond,25Q是系列,64表示容量64Mbit(8MB),FV是电压和封装信息。

找到型号后,去官网下载对应的数据手册(Datasheet)。这里我分享一个经验:不要只看第一页。很多同学只看了容量和封装就关掉了,结果后面踩坑。你需要重点关注这几个部分:

  • 引脚定义:CS(片选)、DO(数据输出)、DI(数据输入)、CLK(时钟)、WP(写保护)、HOLD(保持)
  • 指令集:Read(0x03)、Fast Read(0x0B)、Read ID(0x9F)、Write Enable(0x06)等
  • 电气特性:供电电压(3.3V还是1.8V?)、最大时钟频率
  • 状态寄存器:写保护位、忙标志位的位置

核心知识点:SPI Flash的读指令通常有几种模式。标准读(0x03)速度慢但兼容性好,快速读(0x0B)需要额外一个dummy字节。我在项目中遇到过,有些编程器默认用快速读,结果老芯片不支持,读出来的全是0xFF。

3.2 SPI Flash编程器使用(以CH341A为例)

CH341A编程器是入门首选,便宜、好用、社区支持好。说白了,它就是通过USB转SPI/I2C/UART的芯片,配合上位机软件来读写Flash。

使用步骤其实不复杂:

  1. 连接硬件:把CH341A模块插到电脑USB口,用杜邦线或烧录夹连接Flash芯片。注意引脚对应——CS接CS,DO接DO,DI接DI,CLK接CLK,VCC接3.3V,GND接GND。
  2. 安装驱动:CH341A需要安装驱动,Windows下一般自动识别,如果不行就去官网下载。
  3. 打开软件:常用的有AsProgrammer、CH341A Programmer、NeoProgrammer等。我个人习惯用AsProgrammer,界面简洁,功能够用。
  4. 识别芯片:点击“检测”或“Read ID”,软件会返回芯片的制造商ID和设备ID。如果返回0xFF或0x00,说明连接有问题。
  5. 读取固件:选择“Read”或“读取”,软件会把整个Flash内容读出来保存为.bin文件。

小技巧:如果芯片已经焊在板子上,可以用烧录夹(SOP8夹子)直接夹住芯片,不用拆焊。但要注意,板子上其他电路可能会影响读取,有时候需要断开板子电源,或者把CS引脚拉高。

3.3 热风枪拆焊芯片

有些情况下,烧录夹不好使——比如芯片是QFN封装、BGA封装,或者板子上有电容干扰。这时候就得把芯片拆下来。

拆焊SPI Flash芯片,我推荐用热风枪。温度设置在300-350°C,风速中低档。操作步骤:

  • 在芯片周围涂上助焊剂,帮助导热和防止氧化
  • 热风枪对着芯片均匀加热,大概10-20秒
  • 用镊子轻轻碰一下芯片,如果能动了,就夹起来
  • 焊盘上残留的锡用吸锡带清理干净

警告:我曾经有一次温度调太高(400°C),结果芯片外壳都鼓包了,里面的数据全废了。所以温度控制很重要,尤其是小封装芯片。另外,拆下来的芯片要等冷却后再上编程器,否则热胀冷缩可能导致接触不良。

3.4 固件二进制文件提取(binwalk/dd)

拿到.bin文件后,你以为就能直接分析了?别急,固件通常不是裸数据,而是包含文件系统、引导程序、内核等多个部分。我们需要用工具把它们拆开。

binwalk 是我最常用的固件分析工具。它能自动识别固件中的文件系统、压缩包、签名等。基本用法:

# 扫描固件中的文件结构
binwalk firmware.bin

# 提取所有识别到的文件
binwalk -e firmware.bin

# 指定提取目录
binwalk -e firmware.bin -o ./output

# 只提取特定类型(比如只提取Squashfs文件系统)
binwalk -D 'squashfs:rootfs:squashfs' firmware.bin

binwalk的工作原理,说白了就是通过特征签名来识别。比如Squashfs文件系统开头是“hsqs”,JFFS2开头是“0x1985”,U-Boot镜像开头是“0x27051956”。

有时候binwalk识别不出来,或者提取的文件不完整。这时候可以用dd命令手动切割。比如你知道固件从偏移0x10000开始,大小0x200000,就可以:

dd if=firmware.bin of=part1.bin bs=1 skip=$((0x10000)) count=$((0x200000))

偏移量和大小怎么知道?看数据手册、看引导日志、或者用hexdump分析。我习惯先用hexdump -C firmware.bin | head -50看看文件头,再结合binwalk的结果来定位。

避坑指南:我曾经遇到一个固件,binwalk识别出了Squashfs文件系统,但提取后挂载失败。后来发现是固件中包含了多个文件系统,binwalk只提取了第一个。解决办法是用binwalk -Me递归提取,或者手动指定偏移量用dd切割。

知识体系总览

下面这张图概括了本章的核心逻辑:从硬件到软件,从芯片到二进制文件。

固件获取与提取流程 芯片选型与数据手册 识别型号、引脚、指令集 SPI Flash编程器 CH341A连接与读取 热风枪拆焊 拆下芯片单独读取 固件二进制文件(.bin) 原始数据,包含多个分区 binwalk自动提取 识别签名、自动分割 dd手动切割 指定偏移和大小 hexdump分析 手动查看文件头 最终输出:可分析的文件系统、内核、引导程序等

这张图展示了从硬件到软件的完整链路。你想想看,每一步都环环相扣——芯片选型错了,后面全白费;编程器连接不稳,读出来的数据可能全是错的;提取工具用不对,文件系统都挂不上。

好了,这一章的内容就到这里。记住:硬件操作要细心,软件分析要耐心。多练几次,你就能像我一样,拿到一块板子,十分钟内搞定固件提取。


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