reverse-skills-max: initial public release (restored, redacted, hardened)
This commit is contained in:
118
vendor-new/rev-skills/.claude/skills/re-hardware-io/SKILL.md
Normal file
118
vendor-new/rev-skills/.claude/skills/re-hardware-io/SKILL.md
Normal file
@@ -0,0 +1,118 @@
|
||||
---
|
||||
name: re-hardware-io
|
||||
description: >
|
||||
硬件接口:JTAG/UART/flash 读取。
|
||||
触发词:JTAG、UART、串口、flash芯片、硬件提取、逻辑分析仪
|
||||
capabilities: [hardware-interface]
|
||||
---
|
||||
|
||||
# 硬件接口(JTAG / UART / Flash 读取)
|
||||
|
||||
## 何时使用 / 何时不用
|
||||
|
||||
- 用:有实物板子,需要提取固件、抓启动日志、硬件调试
|
||||
- 用:JTAG/SWD 调试、UART 串口、flash 芯片直读、逻辑分析仪抓信号
|
||||
- 不用:只有固件文件(走 [[re-fw-extract]],硬件提取是最后手段)
|
||||
- 不用:已解出 rootfs 只需静态分析(走 [[re-fw-rootfs]])
|
||||
- 不用:需要运行固件(先试 [[re-fw-emulate]] 更安全、更便宜)
|
||||
|
||||
## 工具准备
|
||||
|
||||
所有工具先验证再使用。硬件操作风险高:先万用表测电平、共地、核对丝印再上电(见坑 3/4)。遵循 [[re-analyze/platform-tips]] 先给最轻可行方案:软件手段(文件→解包→仿真)耗尽后再上硬件。
|
||||
|
||||
### openocd —— JTAG/SWD 调试
|
||||
|
||||
- Linux: `apt install openocd` / `dnf install openocd` / `pacman -S openocd`
|
||||
- macOS: `brew install openocd`
|
||||
- Windows: `choco install openocd`(或官方 Windows 构建)
|
||||
- 验证: `openocd --version`
|
||||
|
||||
### picocom / minicom —— 串口终端
|
||||
|
||||
- Linux: `apt install picocom`(或 `apt install minicom`)/ `dnf install picocom` / `pacman -S picocom`
|
||||
- macOS: `brew install picocom`
|
||||
- Windows: `choco install putty`(PuTTY 支持串口)或 WSL 内 Linux 版
|
||||
- 验证: `picocom --version`
|
||||
|
||||
### flashrom —— flash 芯片读取
|
||||
|
||||
- Linux: `apt install flashrom` / `dnf install flashrom` / `pacman -S flashrom`
|
||||
- macOS: `brew install flashrom`
|
||||
- Windows: 官方构建或 WSL(编程器 ch341a 在 WSL 内用 `flashrom -p ch341a_spi`)
|
||||
- 验证: `flashrom --version`
|
||||
|
||||
### 逻辑分析仪(sigrok-cli / pulseview)
|
||||
|
||||
- Linux: `apt install sigrok-cli pulseview` / `dnf install sigrok-cli pulseview` / `pacman -S sigrok-cli pulseview`
|
||||
- macOS: `brew install sigrok-cli pulseview`
|
||||
- Windows: sigrok 官方 Windows 安装包(sigrok.org)
|
||||
- 验证: `sigrok-cli --version` / `pulseview --version`
|
||||
|
||||
### JTAGulator —— 引脚识别板(开源硬件)
|
||||
|
||||
- 开源硬件项目 `git clone https://github.com/grandideastudio/JTAGulator`(含固件与文档);需自行购买/打样 JTAGulator 板
|
||||
- 验证: 串口连接后发送 `help` 显示命令清单
|
||||
- 用它对未知板自动枚举 UART/JTAG 引脚(步骤 1/2 的得力工具)
|
||||
|
||||
### 硬件选购指引(常见方案与电平)
|
||||
|
||||
- USB-UART 适配器: CH340 / CP2102 / FTDI 三种芯片方案均可,选支持 3.3V TTL 电平的型号(带 3.3V/5V 跳线更通用)——3.3V 板上插 5V TTL 会烧接口(见坑 3)
|
||||
- 调试器: ST-Link v2(STM32 系,SWD/JTAG 都支持)、J-Link(通用,授权收费)、CMSIS-DAP/DAPLink(开源固件方案)——按目标芯片厂牌选
|
||||
- SPI flash 编程器: ch341a(最便宜的 SOIC8 方案)+ 夹子/测试座;多协议需求用 RT809H 类编程器
|
||||
- 逻辑分析仪: 采样率按信号速率选——UART 115200 与低速 SPI 用 8 通道 24MHz 级别够用;高速 SPI(数十 MHz)需要 100MHz+ 采样(经验值:采样率至少为信号速率的 4 倍)
|
||||
- 电平转换: 1.8V/2.5V 板子与 3.3V 工具混接时用 TXS0108 类双向电平转换模块
|
||||
|
||||
## 操作步骤
|
||||
|
||||
按顺序执行,每步记下结果。
|
||||
|
||||
1. **板子拆解与接口定位**:
|
||||
- 拆壳观察 PCB:丝印(TX/RX、VCC、GND、JTAG/SWD 测试点)、插针、flash 芯片型号(如 W25Q128、MX25L、GD25Q)
|
||||
- 万用表:测供电电平(3.3V 常见,也有 5V / 1.8V)、找 GND;UART TX 脚特征——上电瞬间拉高到逻辑高电平的方波
|
||||
- 拍照存档:丝印、引脚编号、flash 型号,供后续接线核对
|
||||
2. **UART 串口调试(波特率枚举)**:
|
||||
```sh
|
||||
picocom -b 115200 /dev/ttyUSB0 # 先试 115200
|
||||
# 乱码 → Ctrl+A Ctrl+X 退出,换 9600 / 57600 / 38400 / 19200 / 230400
|
||||
# 或 minicom -D /dev/ttyUSB0
|
||||
```
|
||||
- TX/RX 需交叉接线(板子 TX ↔ 适配器 RX);共地必须
|
||||
- 上电瞬间抓启动日志——是了解系统最快途径(见坑 4)
|
||||
3. **JTAG/SWD 连接(openocd)**:
|
||||
```sh
|
||||
openocd -f interface/stlink.cfg -f target/stm32f1x.cfg # ST-Link + SWD 示例
|
||||
# 其他适配器在 /usr/share/openocd/scripts/interface/ 下选对应 cfg
|
||||
```
|
||||
- 确认接口类型(JTAG 4/5 线 vs SWD 2 线)与电平(1.8V 板子需电平适配器)
|
||||
- 连上后 `halt` 暂停、读寄存器、dump flash(`flash read_bank 0 dump.bin`)
|
||||
- 一行命令模式(脚本化/无交互): `openocd -f interface/stlink.cfg -f target/stm32f1x.cfg -c "init; halt; flash read_bank 0 dump.bin; exit"`
|
||||
4. **flash 芯片读取(flashrom/编程器)**:
|
||||
```sh
|
||||
# 板载 SPI flash(linux_spi 需内核 spidev 支持):
|
||||
flashrom -p linux_spi:dev=/dev/spidev0.0 -r backup.bin
|
||||
# 离线读取(ch341a 编程器 + SOIC8 夹子,先断电):
|
||||
flashrom -p ch341a_spi -r backup.bin
|
||||
```
|
||||
- 核对芯片型号与封装(SOIC8 夹子/测试座),引脚方向别接反
|
||||
- 读出的镜像转 [[re-fw-extract]] 解包
|
||||
5. **启动日志抓取**:
|
||||
- 串口连好 → 板子上电 → 全量抓日志(`picocom` 输出 `tee log.txt`,或 minicom 捕获)
|
||||
- 日志含 bootloader、内核启动、文件系统挂载、服务自启信息;与 [[re-fw-rootfs]] 的启动脚本对照定位
|
||||
- UART 没输出 → 回到步骤 1 复查接线/波特率,或用逻辑分析仪抓 TX 脚波形验证
|
||||
|
||||
## 跨域联合
|
||||
|
||||
- [[re-firmware]]:工作流第 5 步(需实物时)调用本技能
|
||||
- 提取的 flash 镜像 → [[re-fw-extract]] 解包 → [[re-fw-rootfs]] 分析;需要运行 → [[re-fw-emulate]]
|
||||
- 硬件上抓到的通信/协议 → [[re-protocol]]
|
||||
- 硬件提取是固件分析的最后手段:软件手段(文件 → 解包 → 仿真)全部耗尽后再上
|
||||
- 物理层芯片/PCB 分析(decap/裸片/木马检测)→ [[re-hw-chip]]
|
||||
|
||||
## 常见坑与陷阱
|
||||
|
||||
- **波特率不对 → 乱码**:现象——串口输出全是乱码或无输出;原因——波特率/数据位不匹配、TX/RX 接反;对策——按 9600 / 115200 优先枚举(57600 / 38400 / 230400 兜底),用逻辑分析仪看 TX 波形验证,共地必须
|
||||
- **JTAG 被熔断/锁定**:现象——openocd 连不上,IDCODE 全 0 或超时;原因——量产板熔断 JTAG、读保护(RDP)开启;对策——试 SWD、`stm32f1x unlock` 类解锁序列,或放弃 JTAG 改走 UART + flash 直读(步骤 4)
|
||||
- **5V/3.3V 电平误接烧板**:现象——接线后板子发热/冒烟/永久损坏;原因——电平不匹配(3.3V 板上接 5V TTL)、供电接错、VCC/GND 反接;对策——先万用表测电平与 GND 再接线;3.3V 系统用 3.3V 适配器;绝不带电插拔
|
||||
- **先看启动日志再动手**:现象——盲目拆焊 flash / 连 JTAG 导致损坏或数据丢失;原因——跳过低成本观察直接上硬件手段;对策——先 UART 抓启动日志了解系统(步骤 2/5),再决定是否硬件读取——这是 [[re-analyze/platform-tips]] 先给最轻可行方案在硬件域的执行
|
||||
- **Intel DCI 调试工具链兼容性坑**:现象——Intel System Studio 2019(System Debugger)在 Win10/11 安装/运行失败,DCI 线缆连不上 CPU;原因——该软件基于 Win7 开发且带环境检测与 License 校验:Win11 提示缺 Win7 安全补丁、公开 License 文件在 Windows 版无效;对策——安装用兼容模式;运行加 `--noprereq` 跳过环境检查;License 校验核心在 `issa.dll` 导出函数中(三个校验函数),patch 后替换即可;DCI 配置按平台选型(如 KBL=Kaby Lake、SPT=200 系主板、DBC=Debug Class 线缆),CLI 调试用 DAL 目录的 `PythonConsole.cmd`(Python 2.7 环境,`itp.cores`/`itp.halt()` 等命令);ME 端需 UTOK 解锁才响应调试命令(见 [[re-fw-extract]])
|
||||
- 命令族速查与操作序列见 [[commands]];工具特有坑与版本差异见 [[gotchas]]
|
||||
@@ -0,0 +1,112 @@
|
||||
# 硬件接口命令速查与操作序列(UART / JTAG-SWD / Flash / 逻辑分析仪)
|
||||
|
||||
工具族分工:picocom/minicom(串口终端)→ openocd(JTAG/SWD 调试与 flash dump)→ flashrom(SPI flash 直读)→ sigrok-cli/pulseview(逻辑分析仪)→ JTAGulator(未知板引脚枚举)。硬件操作前置:万用表测电平、共地、核对丝印(见 [[gotchas]] 与 SKILL.md 坑)。
|
||||
|
||||
## 命令族速查
|
||||
|
||||
### 串口(picocom / minicom)
|
||||
|
||||
| 用途 | 命令 |
|
||||
|---|---|
|
||||
| 打开串口 | `picocom -b 115200 /dev/ttyUSB0` |
|
||||
| 退出 picocom | `Ctrl+A Ctrl+X` |
|
||||
| 无流控模式 | `picocom -b 115200 --nolock /dev/ttyUSB0`(权限不够时配合 sudo) |
|
||||
| minicom 版 | `minicom -D /dev/ttyUSB0`(`Ctrl+A Z` 帮助,`Ctrl+A X` 退出) |
|
||||
| 串口设备确认 | `ls /dev/ttyUSB* /dev/ttyACM*`;`dmesg | grep tty`(插拔后看新节点) |
|
||||
| 记录到文件 | `picocom ... | tee log.txt`(或 minicom 捕获功能) |
|
||||
|
||||
### openocd —— JTAG/SWD(Telnet 交互 + 命令行)
|
||||
|
||||
| 用途 | 命令 |
|
||||
|---|---|
|
||||
| ST-Link + STM32F1 | `openocd -f interface/stlink.cfg -f target/stm32f1x.cfg` |
|
||||
| 其他适配器 | `ls /usr/share/openocd/scripts/interface/`(jlink/swd 等按名选) |
|
||||
| 一行命令模式 | `openocd -f <if> -f <target> -c "init; halt; flash read_bank 0 dump.bin; exit"` |
|
||||
| 交互模式 | 启动后连 `telnet localhost 4444`(默认端口) |
|
||||
| halt 暂停 | `halt` |
|
||||
| 读寄存器 | `reg pc` / `reg sp` / `reg`(全部) |
|
||||
| 读内存 | `mdw <addr> 16`(32 位读 16 个)/ `mdb` / `mwh` |
|
||||
| 写内存 | `mww <addr> <val>`(危险操作,先读后写) |
|
||||
| dump flash | `flash read_bank 0 dump.bin`(bank 号与镜像大小以 `flash banks` 为准) |
|
||||
| 擦/写 flash | `flash erase_sector 0 0 last` / `flash write_bank 0 firm.bin`(写会破坏原内容,先备份) |
|
||||
| 复位 | `reset` / `reset halt` |
|
||||
| 解锁(读保护) | `stm32f1x unlock 0` 类命令(按目标系列;见 [[gotchas]]) |
|
||||
|
||||
### flashrom —— SPI flash 直读
|
||||
|
||||
| 用途 | 命令 |
|
||||
|---|---|
|
||||
| 列芯片型号 | `flashrom -p ch341a_spi`(不带 -r 先识别) |
|
||||
| 读取 | `flashrom -p ch341a_spi -r backup.bin` |
|
||||
| 板载 SPI(spidev) | `flashrom -p linux_spi:dev=/dev/spidev0.0 -r backup.bin` |
|
||||
| 校验 | `flashrom -p ch341a_spi -v backup.bin`(读回比对) |
|
||||
| 写入 | `flashrom -p ch341a_spi -w new.bin`(破坏性,先读后写) |
|
||||
| 强制指定型号 | `-c <chipname>`(识别失败但已知型号时,`flashrom -p ch341a_spi -c "W25Q128"` 类) |
|
||||
|
||||
### 逻辑分析仪(sigrok-cli)
|
||||
|
||||
| 用途 | 命令 |
|
||||
|---|---|
|
||||
| 列设备 | `sigrok-cli -L` / `sigrok-cli --scan` |
|
||||
| 采样抓取 | `sigrok-cli -d <driver>:conn=<设备> -c samplerate=1M -O <格式> -o data.sr -t 10s` |
|
||||
| UART 解码 | `sigrok-cli -d ... -A uart:rx=<通道>:baudrate=115200 -o out.txt` |
|
||||
| SPI 解码 | `-A spi:clk=<脚>:mosi=<脚>:miso=<脚>:cs=<脚>` |
|
||||
| 图形查看 | `pulseview`(GUI,加载 .sr 逐协议解码) |
|
||||
|
||||
### JTAGulator —— 引脚枚举
|
||||
|
||||
```
|
||||
串口连接(如 /dev/ttyUSB0,115200)→ 发送 help 看命令
|
||||
UART 枚举:uart 命令逐引脚扫波特率
|
||||
JTAG 枚举:jtag 命令(目标断电/上电状态按提示操作)
|
||||
```
|
||||
|
||||
## 常用操作序列
|
||||
|
||||
### 1. UART 启动日志抓取(最轻的固件情报)
|
||||
|
||||
```
|
||||
万用表确认 VCC/GND/TX(上电瞬间 TX 拉高的方波)→ 交叉接线 + 共地
|
||||
→ picocom -b 115200 → 乱码则 Ctrl+A Ctrl+X 换 9600/57600/38400/19200/230400
|
||||
→ 板子重新上电抓完整启动日志 → tee log.txt 存档
|
||||
→ 日志含 bootloader/内核/文件系统/服务自启 → 对照 [[re-fw-rootfs]] 启动脚本
|
||||
```
|
||||
|
||||
### 2. SPI flash 直读(离线提取)
|
||||
|
||||
```
|
||||
断电 → SOIC8 夹子夹住 flash(核对 1 脚方向)→ 编程器接 USB
|
||||
→ flashrom -p ch341a_spi(识别型号)→ -r backup.bin → 断电取下
|
||||
→ 镜像转 [[re-fw-extract]] 解包;保留原始 bin 与 sha256
|
||||
```
|
||||
|
||||
### 3. JTAG/SWD 连上 dump flash(板载在线)
|
||||
|
||||
```
|
||||
核对丝印找 JTAG/SWD 测试点(VCC/GND/TMS-TCK-TDO-TDI 或 SWDIO/SWCLK)→ 接调试器
|
||||
→ openocd -f interface/stlink.cfg -f target/stm32f1x.cfg → halt
|
||||
→ flash banks 看 bank 列表 → flash read_bank 0 dump.bin
|
||||
→ 失败(IDCODE 全 0/超时)→ 查熔断/读保护(见 [[gotchas]])
|
||||
```
|
||||
|
||||
### 4. 逻辑分析仪抓 UART 验证波特率
|
||||
|
||||
```
|
||||
板子 TX 接到分析仪通道(共地)→ sigrok-cli -c samplerate=1M 采样
|
||||
→ -A uart:baudrate=115200 解码 → 乱码则换 9600/57600 重试
|
||||
→ 波形图确认 TX 空闲电平与帧格式(8N1)→ 反推真实波特率
|
||||
```
|
||||
|
||||
## 实现教训(内化)
|
||||
|
||||
- 硬件操作不可逆程度高:先观测(万用表/逻辑分析仪/启动日志)后动手(焊/写)
|
||||
- 每次接线/换挡记录照片与笔记:丝印、引脚编号、电平、接线颜色——返工排查全靠它
|
||||
- flash 写操作前必读备份并校验(-v)——写坏救不回来
|
||||
- 一个工具不通换路径:JTAG 锁了走 UART + flash 直读;flash 焊接位坏走在线读;始终保留最轻方案
|
||||
- 提取产物(dump.bin + sha256 + 板型/芯片型号)入档,供 [[re-fw-extract]] / [[re-fw-rootfs]] 消费
|
||||
|
||||
## 使用注意
|
||||
|
||||
- 断电操作接线;带电插拔是烧板第一原因(见 [[gotchas]])
|
||||
- 提取的镜像与日志 sha256 存档;硬件操作记录(时间/步骤/照片)写分析笔记([[re-triage]] 惯例)
|
||||
- 板子来源与授权:仅分析自己持有或有权限的硬件
|
||||
@@ -0,0 +1,47 @@
|
||||
# 硬件接口工具特有坑与边界
|
||||
|
||||
## 电平与供电(烧板高危区)
|
||||
|
||||
- **3.3V 板接 5V 信号 = 烧**:板上逻辑电平先万用表实测(常见 3.3V,也有 5V/1.8V)——适配器/分析仪电平不匹配用 TXS0108 类双向电平转换,绝不硬插
|
||||
- **VCC/GND 反接**:接线顺序先 GND 后信号线;上电前用万用表通断档复核 VCC-GND 不短路
|
||||
- **带电插拔**:USB 设备(调试器/编程器/分析仪)接线瞬间的浪涌可能损伤接口——标准流程是断电接线、上电验证
|
||||
- **夹子接触不良**:SOIC8 夹子夹歪/氧化导致识别失败或读出数据错位——用 `-v` 校验,多读两遍比对;接触不稳时换测试座
|
||||
|
||||
## 接口识别与连接
|
||||
|
||||
- **丝印不可靠**:板上标 TX/RX 的是芯片视角还是板级视角不确定——串口无输出先对调 TX/RX,再用逻辑分析仪实测
|
||||
- **波特率猜错**:乱码不代表坏——按 9600/115200 优先枚举(57600/38400/230400 兜底);逻辑分析仪抓 TX 波形直接数位宽最准
|
||||
- **TTL 电平 ≠ RS-232 电平**:老设备上的 DB9 串口是 ±12V RS-232,USB-UART 适配器不能直连——需要 RS-232 电平转换(MAX232 类)
|
||||
- **JTAG 引脚复用**:量产板常把 JTAG 脚复用为 GPIO 或只引出 SWD——丝印只有 4 针时先按 SWD 试
|
||||
|
||||
## JTAG/SWD 熔断与保护
|
||||
|
||||
- **IDCODE 全 0/超时**:量产板熔断 JTAG(或 RDP 读保护开启)——openocd 连不上是常态;试 SWD 接口、按目标系列的 unlock 序列(如 `stm32f1x unlock 0`,部分系列 unlock 会擦除 flash——先备份数据评估)
|
||||
- **调试器供电冲突**:ST-Link/J-Link 默认给目标供电(3.3V),目标已独立供电时两路电源打架——关掉调试器供电选项或用只接信号的接线方式
|
||||
- **电平不匹配连不上**:1.8V 目标直接接 3.3V 调试器,除了烧口风险,电气参数也不合格——按目标电平选适配器(ST-Link 新版支持 1.65-3.6V 自适应,老版本不行)
|
||||
|
||||
## flash 读取质量
|
||||
|
||||
- **识别不出型号**:新芯片在老 flashrom 里没条目——先 `flashrom -p ch341a_spi` 看输出,识别失败但芯片丝印明确时用 `-c` 强制指定型号(风险自担,先验证 ID)
|
||||
- **读出全 0 或全 FF**:夹子没夹好/芯片被写保护/SPI 电压不对——读回内容与丝印型号容量核对,空数据先排查接触
|
||||
- **读保护芯片**:部分 MCU 内置 flash 读保护(RDP/OTP)——flashrom 读不到,走 openocd 解锁流程或改走 UART/固件升级通道
|
||||
- **大容量镜像校验**:64MB+ flash 读取耗时长,中途断线文件损坏——加 `-v` 校验,失败重读
|
||||
|
||||
## 逻辑分析仪采样
|
||||
|
||||
- **采样率不足 → 波形假象**:低于信号速率 4 倍会漏跳变(经验值)——UART 115200 用 ≥1MHz;SPI 数十 MHz 用 100MHz+ 设备,先按信号速率选设备再抓
|
||||
- **通道错位**:多通道同时抓时引脚标号与物理位置对应错——抓取前先用已知信号(如 TX 空闲高电平)校准通道
|
||||
- **解码器参数错**:UART 解码器波特率/数据位配置错会解出乱码——对照波形先确认位宽再改参数
|
||||
|
||||
## 版本差异
|
||||
|
||||
- **openocd**:0.12.x 为最近正式版(2021);发行版打包版本新旧不一——脚本路径以 `/usr/share/openocd/scripts/` 实际为准;新版对部分国产 MCU 支持更好(target/ 下新增 cfg),旧版可能没有对应 target 文件
|
||||
- **flashrom**:1.4(2024)为主流,新芯片条目持续加入——老版本识别不了新 SPI flash,升级优先;ch341a_spi 支持自 1.0 起成熟
|
||||
- **sigrok-cli/pulseview**:0.7.x 长期稳定;解码器(decoders)随版本扩充,旧版本缺新协议解码器
|
||||
- **JTAGulator**:开源固件长期无正式新版,功能以烧录进板的固件版本为准;自行打样的板子注意引脚排列与官方一致
|
||||
|
||||
## 使用注意
|
||||
|
||||
- 断电接线、先测后接、共地必须(SKILL.md 坑 3 优先过一遍)
|
||||
- 提取产物(镜像 + sha256 + 板型/芯片型号)入档([[re-triage]] 惯例),转 [[re-fw-extract]] / [[re-fw-rootfs]] 分析
|
||||
- 仅操作自己持有或有授权的硬件
|
||||
Reference in New Issue
Block a user