前面幾天的韌體取得、解包與分析,大多可以直接在電腦上完成。當公開韌體不足、需要觀察開機流程、取得 runtime 狀態,或必須直接讀取裝置上的儲存內容時,會需要進入硬體測試。
常見方法主要有:
這篇整理各方法適用的情境、可以取得的資訊,以及常用工具。
UART 是嵌入式設備最常見的 debug interface 之一,常被用來輸出 bootloader、kernel 與 userspace 的啟動資訊。

工具的話最基礎的是 USBtoTTL 的設備,約 $100 台幣,也是最容易取得的入門設備
如上圖顯示,TX和RX分別相反接入到設備的RX和TX,一般情況下不需要接 VCC。
接著需要接上 Putty 軟體並且設定好 boude rate(紅框處),並開始監聽(會跳出一個互動式 cmd)
典型 boot log:
U-Boot 1.1.3
DRAM: 128 MB
Flash: 16 MB
Loading kernel...
Starting kernel...
Linux version 3.x.x
這些資訊可以協助確認:
CPU architecture
Bootloader
Kernel version
Memory size
Flash size
MTD partition
Root filesystem
Kernel command line
JTAG 可以直接控制處理器或 debug unit,適合需要觀察 runtime 狀態的情況。
典型 JTAG:
TCK
TMS
TDI
TDO
GND
VREF
有些 target 還會出現:
TRST
SRST
ARM Cortex 常見另一種介面:
SWDIO
SWCLK
GND
VREF
也就是 SWD。
確認 debug header
↓
確認 GND / VREF
↓
確認 JTAG / SWD pin
↓
連接 debugger
↓
OpenOCD / vendor debugger
↓
halt CPU
↓
memory / register / breakpoint
完成設定後,可以透過:
OpenOCD
│
└── GDB
進行 debug。
例如:
0x80000000 ────────────
RAM
0x88000000 ────────────
可以直接 dump:
RAM
bootloader
mapped flash
runtime structures
之後再使用靜態工具分析
連接 debugger 前應先量測 target I/O voltage。
常見:
1.8 V
2.5 V
3.3 V
VREF 用來讓 debugger 確認 target logic level。
| 工具 | 用途 |
|---|---|
| JTAGulator | 自動探索 JTAG / UART pin |
| SEGGER J-Link | ARM / RISC-V 等目標 debug |
| STLINK-V3SET | STM32 / STM8 debug |
| Bus Blaster V4 | FTDI-based JTAG |
| Tigard | JTAG / UART / SPI |
| Glasgow | 多協定介面 |
許多 Router、Camera、Gateway 與 Embedded Linux 裝置會使用 SPI NOR Flash 儲存:
Bootloader
Kernel
RootFS
Configuration
Calibration data
Factory partition
常見晶片封裝:
SOIC8
WSON8
TSOP
SOIC8 通常最方便處理。
例如:
Winbond W25Q64
Winbond W25Q128
MXIC MX25L128
GD25Q128
其中:
W25Q64 = 64 Mbit = 8 MB
W25Q128 = 128 Mbit = 16 MB
最常見的低成本組合:
CH341A
│
SOIC8 Clip
│
SPI NOR
Linux 可以搭配:
flashrom
先探測:
flashrom -p ch341a_spi
讀取:
flashrom -p ch341a_spi -r firmware_dump.bin
可以重複讀取,並且驗證他們的 SHA-256 雜湊值,觀察是否一致。有時候會有掉包的風險。
Logic Analyzer 用來觀察 digital signal。
在硬體研究中常用於:
UART
SPI
I2C
CAN
GPIO
proprietary digital protocol
如果 PCB 上有多個未知 test point:
TP1
TP2
TP3
TP4
TP5
可以同時接入 Logic Analyzer。
重新開機後觀察:
idle
burst traffic
repeating digital signal
UART TX 在 boot 過程通常會出現大量 burst。
搭配 protocol decoder 後,可以測試:
9600
38400
57600
115200
SPI 常見四條主要訊號:
CLK
CS
MOSI
MISO
Logic Analyzer 可以直接觀察:
clock
chip select
command
address
data
例如 CPU 開機時讀取 SPI Flash:
CS ────┐ ┌─────
└──────┘
CLK _|‾|_|‾|_|‾|_
MOSI CMD + ADDRESS
MISO DATA
可以進一步判斷:
Flash 型號
讀取位址
command sequence
boot-time Flash access
I2C:
SCL
SDA
可以直接 decode:
Address
Read / Write
ACK
Data
常見周邊:
EEPROM
sensor
RTC
PMIC
secure element
| 工具 | 用途 |
|---|---|
| Saleae Logic Pro 16 | 多通道分析與 protocol decode |
| 入門 8ch 24 MHz Logic Analyzer | UART / SPI / I2C 基本分析 |
拿到未知 PCB 時,第一步通常是確認:
GND
VCC / VREF
UART
JTAG / SWD
SPI
I2C
Multimeter continuity mode:
test point
│
└── PCB ground plane / shielding
有 continuity 的 pin 很可能是 GND。
設備開機後量測:
0 V
1.8 V
3.3 V
5 V
可以協助判斷:
GND
VCC
logic level
idle signal
UART TX 通常:
idle = high
boot = burst
可以用:
Oscilloscope
Logic Analyzer
確認。
如果有大量 test point,可以使用 JTAGulator 自動嘗試:
TCK
TMS
TDI
TDO
排列組合。
若成功,可能讀到:
IDCODE
Boundary Scan information
TAP chain
| 工具 | UART | JTAG/SWD | SPI | I2C |
|---|---|---|---|---|
| CH340G / CP2102 | ✓ | |||
| Tigard | ✓ | ✓ | ✓ | ✓ |
| Bus Pirate 5 | ✓ | 部分 | ✓ | ✓ |
| Glasgow | ✓ | ✓ | ✓ | ✓ |
| J-Link | ✓ | |||
| STLINK-V3SET | ✓ | |||
| Bus Blaster V4 | ✓ |
| 工具 | 用途 |
|---|---|
| Multimeter | continuity、voltage |
| Logic Analyzer | UART / SPI / I2C / digital bus |
| Saleae Logic Pro 16 | 多通道 protocol analysis |
| JTAGulator | JTAG / UART pin discovery |
| Oscilloscope | voltage、timing、signal integrity |
| 工具 | 用途 |
|---|---|
| CH341A | SPI NOR |
| XGecu T76 | NOR / NAND / EEPROM 等 |
| SOIC8 Clip | In-system Flash access |
| flashrom | Flash detection / read / write |
| 工具 | 用途 |
|---|---|
| PCBite | Probe holder |
| Omnifixo | PCB / probe 固定 |
| Fine probe | test point 接觸 |
| SOIC clip | Flash 夾取 |
| Dupont wire | 接線 |
| 需求 | 方法 |
|---|---|
| 查看 boot log | UART |
| 確認 U-Boot | UART |
| 取得 bootloader shell | UART |
| 查看 runtime memory | JTAG / SWD |
| breakpoint / single-step | JTAG / SWD |
| dump SPI NOR | SPI programmer |
| 找 UART pin | Logic Analyzer / Multimeter |
| 找 JTAG pin | JTAGulator |
| 分析 SPI / I2C traffic | Logic Analyzer |
| 官方沒有 firmware | Flash dump |
| 取得 factory partition | Flash dump |
實務上通常會組合多種方法。
例如:
Multimeter
↓
找到 GND / 電壓
Logic Analyzer
↓
找到 UART
UART
↓
取得 boot log / Flash size
SPI Dump
↓
取得 firmware.bin
binwalk / Ghidra
↓
靜態分析
或:
UART
↓
發現 JTAG / memory map 資訊
JTAG
↓
runtime debugging
GDB
↓
確認漏洞控制流