re-hardware-io について
re-hardware-ioは、ファームウェアのリバースエンジニア向けハードウェアインターフェース分析スキルです。UART、JTAG/SWD、フラッシュ、ロジックアナライザーを使った情報取得を扱い、ハードウェア操作前の電圧確認とソフトウェア分析を優先します。
主な機能
- 01UARTデバッグと起動ログ取得
- 02JTAG/SWD接続とフラッシュダンプ
- 03SPIフラッシュチップの読み取り
- 04ロジックアナライザーによる信号取得
- 05インターフェース特定と電圧確認
活用シーン
- 01実機からのファームウェアイメージ抽出
- 02システム分析用の起動ログ取得
- 03JTAG/SWD接続のデバッグ
- 04基板上の通信信号の調査
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ dslsdzc/ rev-skills --skill re-hardware-ioインストール後、Claude Code で/re-hardware-ioを入力して読み込まれたか確認します。
同梱ファイルreferences/commands.mdreferences/gotchas.md
詳細
ハードウェアインターフェース(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 クラスの双方向電圧レベル変換モジュールを使用します
操作手順
順番に実行し、各手順の結果を記録します。
- ボードの分解とインターフェースの特定:
- ケースを開けて PCB を確認します。シルク印刷(TX/RX、VCC、GND、JTAG/SWD テストポイント)、ピンヘッダー、Flash チップの型番(W25Q128、MX25L、GD25Q など)を確認します
- マルチメーターで電源電圧(一般的には 3.3V ですが、5V / 1.8V の場合もあります)を測定し、GND を特定します。UART TX ピンの特徴は、電源投入直後に論理 High まで立ち上がる方形波です
- シルク印刷、ピン番号、Flash の型番を撮影して保存し、後で配線を確認する際に使用します
- UART シリアルデバッグ(ボーレートの列挙):
picocom -b 115200 /dev/ttyUSB0 # 先试 115200 # 乱码 → Ctrl+A Ctrl+X 退出,换 9600 / 57600 / 38400 / 19200 / 230400 # 或 minicom -D /dev/ttyUSB0- TX/RX は交差して接続する必要があります(ボード TX ↔ アダプター RX)。共通グラウンドも必須です
- 電源投入直後に起動ログを取得します。これはシステムを把握する最も手早い方法です(落とし穴 4 を参照)
- JTAG/SWD 接続(openocd):
openocd -f interface/stlink.cfg -f target/stm32f1x.cfg # ST-Link + SWD 示例 # 其他适配器在 /usr/share/openocd/scripts/interface/ 下选对应 cfg- インターフェースの種類(JTAG 4/5 線または SWD 2 線)と電圧レベルを確認します(1.8V のボードには電圧レベル変換アダプターが必要です)
- 接続後、
haltで一時停止し、レジスターを読み取り、Flash をダンプします(flash read_bank 0 dump.bin) - 1 行コマンド形式(スクリプト化/非対話型):
openocd -f interface/stlink.cfg -f target/stm32f1x.cfg -c "init; halt; flash read_bank 0 dump.bin; exit"
- Flash チップの読み取り(flashrom/プログラマー):
# 板载 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]] に渡して展開します
- 起動ログの取得:
- シリアル接続を確認 → ボードの電源を入れる → ログ全体を取得します(
picocomの出力をtee log.txtに渡すか、minicom でキャプチャします) - ログには、ブートローダー、カーネルの起動、ファイルシステムのマウント、サービスの自動起動に関する情報が含まれます。[[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]]
コメント
Markdown 対応