第二章:硬件接口识别——JTAG、UART、SPI、I2C 接口识别与测量
做嵌入式安全,第一关就是找到板子上的“门”。
我常说,拿到一块陌生板子,别急着上编程器。先拿万用表,把接口摸清楚。JTAG、UART、SPI、I2C,这四个接口是固件提取的命脉。你想想看,如果连调试口都找不到,后面再牛的分析工具也是白搭。
2.1 为什么硬件接口识别这么重要?
说白了,固件就藏在芯片的 Flash 里。但怎么把它读出来?
最直接的办法,就是通过芯片预留的调试接口。JTAG 可以让你直接控制 CPU,读取内存;UART 能给你一个交互 shell;SPI 和 I2C 则是外挂 Flash 的通信总线。
我遇到过不少新手,上来就对着芯片引脚一顿乱焊,结果烧了板子。嗯,这里要注意:先识别,后操作,这是铁律。
核心原则: 接口识别是固件提取的“侦察阶段”。用万用表测量电压、对地电阻,比用眼睛看丝印更可靠。
2.2 JTAG 接口识别
JTAG 是调试接口里的“大哥大”。它通常有 4 根信号线:TMS、TCK、TDI、TDO,再加上 VCC 和 GND。
怎么找?
- 看排针: 板子上如果有 4 针、6 针、10 针、14 针或 20 针的排针,大概率是 JTAG 或 SWD。
- 测电压: 上电后,用万用表直流电压档测引脚。VCC 引脚通常是 3.3V 或 1.8V。GND 引脚对地电阻接近 0Ω。
- 找信号: TCK 引脚在芯片工作时会有脉冲信号,用示波器看最明显。没有示波器?用万用表频率档也能测到几十 MHz 的方波。
个人经验: 我习惯先找 GND。把万用表打到蜂鸣档,黑表笔接板子上的大铜皮(通常是 GND),红表笔扫排针。哪个引脚响了,就是 GND。找到 GND 后,VCC 就好找了——对地电压稳定的那个就是。
2.3 UART 接口识别
UART 是嵌入式设备的“救命稻草”。很多设备即使不开机,只要 UART 有输出,你就能看到启动日志。
UART 的特点:
- 通常 3 根线:TX、RX、GND。有些还有 VCC。
- TX 引脚在空闲时是高电平(3.3V 或 1.8V)。
- RX 引脚电平不确定,但通常也是高电平。
测量方法:
- 上电后,用万用表测排针电压。如果某个引脚电压稳定在 3.3V 或 1.8V,且不是 VCC,那很可能是 TX。
- 用逻辑分析仪或示波器抓一下。如果看到一串高低电平变化的数据,那就是 UART 信号。
- 我曾经遇到一个路由器,UART 的 TX 引脚电压只有 1.2V。一开始以为是坏板子,后来发现是芯片内部电平转换的问题。嗯,别被电压值骗了。
避坑指南: 我曾经把 UART 的 TX 和 RX 接反了,结果终端什么输出都没有。记住:板子的 TX 接你的 RX,板子的 RX 接你的 TX。如果没输出,交换一下试试。
2.4 SPI 接口识别
SPI 是 Flash 芯片的“标配”接口。几乎所有外挂的 NOR Flash 或 NAND Flash 都用 SPI 通信。
SPI 的 4 根线:
| 信号 | 功能 | 典型电压 |
|---|---|---|
| CS | 片选(低电平有效) | 3.3V / 1.8V |
| CLK | 时钟 | 3.3V / 1.8V |
| MOSI | 主出从入 | 3.3V / 1.8V |
| MISO | 主入从出 | 3.3V / 1.8V |
怎么找?
- 找 Flash 芯片:板子上 8 脚或 16 脚的 SOIC 封装芯片,丝印通常是“25Qxx”、“W25Qxx”、“MX25Lxx”等。
- 用万用表测 Flash 芯片的引脚:第 1 脚是 CS,第 2 脚是 MISO,第 5 脚是 MOSI,第 6 脚是 CLK。第 4 脚是 GND,第 8 脚是 VCC。
- 上电后,CLK 引脚会有稳定的时钟信号。用万用表频率档能测到几 MHz 到几十 MHz 的频率。
核心技巧: 如果你不确定哪个引脚是 CS,可以测对地电阻。CS 引脚在空闲时是高电平,对地电阻通常较大。而 GND 引脚对地电阻接近 0Ω。
2.5 I2C 接口识别
I2C 只有两根线:SDA(数据)和 SCL(时钟)。它常用于连接传感器、EEPROM、RTC 等外设。
I2C 的特点:
- 两根线都是开漏输出,需要上拉电阻。
- 空闲时,SDA 和 SCL 都是高电平(3.3V 或 5V)。
- 通信时,SCL 有稳定的时钟信号,SDA 有数据变化。
测量方法:
- 上电后,测排针电压。如果两个引脚都是 3.3V 或 5V,且不是 VCC,很可能是 I2C。
- 用示波器抓波形。SCL 是方波,SDA 是数据包。如果看到 9 个时钟脉冲对应 8 位数据加 1 位 ACK,那就是 I2C。
- 我遇到过一些设备,I2C 总线上挂了多个设备。用逻辑分析仪抓一下,能看到不同的设备地址。嗯,这有助于你判断哪个芯片在通信。
个人习惯: 我一般先用万用表测对地电阻。I2C 的 SDA 和 SCL 因为有上拉电阻,对地电阻通常在 1kΩ 到 10kΩ 之间。如果测到两个引脚电阻相近,且都是高电平,那基本就是 I2C 了。
2.6 实战:用万用表测量引脚
好了,理论说完了。咱们来点实际的。
步骤一:准备工具
- 数字万用表(带蜂鸣档和频率档)
- 示波器或逻辑分析仪(可选,但强烈推荐)
- 镊子、杜邦线、排针
步骤二:找 GND
把万用表打到蜂鸣档。黑表笔接板子上的大铜皮或螺丝孔。红表笔扫所有排针。哪个引脚响了,就是 GND。记下来。
步骤三:找 VCC
上电。万用表打到直流电压档。黑表笔接 GND,红表笔扫排针。电压稳定在 3.3V 或 1.8V 的引脚,就是 VCC。记下来。
步骤四:找信号线
剩下的引脚,用万用表频率档测。如果有稳定的频率输出,那是时钟(CLK 或 TCK)。如果有不规律的电平变化,那是数据线(TX、MOSI、SDA 等)。
步骤五:验证
用示波器或逻辑分析仪抓波形。JTAG 的 TCK 是连续方波,UART 的 TX 是串行数据包,SPI 的 CLK 是突发方波,I2C 的 SCL 是 9 脉冲一组。看一眼波形,你就知道是什么接口了。
避坑指南: 我曾经遇到一块板子,JTAG 的 TCK 引脚对地短路。一开始以为是设计问题,后来发现是焊锡连锡了。用万用表测对地电阻,如果发现某个引脚对地电阻异常低(小于 10Ω),先检查焊接,别急着上电。
2.7 知识体系总结
为了让你更直观地理解这四种接口的识别逻辑,我画了一张流程图。
这张图的核心逻辑很简单:先找电源和地,再测信号。有频率的,往 JTAG 和 SPI 方向查;没频率的,往 UART 和 I2C 方向查。最后用示波器一抓,真相大白。
2.8 写在最后
接口识别这活儿,说白了就是个体力活加经验活。我刚开始做的时候,也经常把 JTAG 和 SPI 搞混。后来发现,只要掌握了万用表的基本用法,再配合示波器看一眼波形,基本不会出错。
嗯,这里再啰嗦一句:别怕把板子搞坏。只要你不乱接 VCC 和 GND,一般不会烧芯片。大胆去测,小心去焊,慢慢就有感觉了。
本章核心: 万用表是硬件接口识别的“眼睛”。学会用它找 GND、VCC、信号线,你就能在 10 分钟内摸清一块陌生板子的接口布局。