ちょっとした黒魔術

前の







この記事では、小さなブラックボードBlack Magic Probe V2.1をデバッグして愛する方法を学ぶ方法を紹介します。 しかし、最初に、それが何であり、なぜそれが必要であるかについて少し。

Black Sphere Technologiesと共同で1BitSquaredが開発したBlack Magic Probe Mini V2.1(BMPM2)ボードは、ARM Cortex-MおよびARM Cortex-Aマイクロコントローラーのプログラミングおよびデバッグ用に設計されたJTAGおよびSWDアダプターです。 他のプロセッサのサポートを追加できます。 追加プロセスの説明はここにあります 。 また、ADIv5(ARM Debug Interface v5)をサポートするプロセッサは、ボードによって決定されることに注意してください。







図は、Black Magic Probe Mini V2.1ボードでサポートされているARM Cortex-MおよびARM Cortex-Aファミリのプロセッサを示しています。







Black Magic Probe Mini V2.1ボードでサポートされているCortex-Mプロセッサ

Black Magic Probe Mini V2.1ボードでサポートされているCortex-Aプロセッサ







Black Magic Probeのテスト中、サポートされているプロセッサはメーカーが提供するリストに限定されないことが明らかになりました。 ARM Debug Interface v5で公式にサポートされていないプロセッサは、たとえば「Cortex-M0」または「Cortex-A7」として定義されます。 同時に、完全な機能は保証されませんが、それでも最小限のデバッグアクションを実行することが可能です。







Black Magic Probeボードでできること:









情報セキュリティデバイスの研究に役立つ可能性のあるBlack Magic Probeの機能:









BMPM2には2つの主要な機能があります。 1つ目は、デバイス自体でgdbサーバーが起動され、ホストコンピューター上のgdbクライアントを介して直接接続できる仮想ポートを開くことです( gcc-arm-embeddedツールキットが推奨されます)。したがって、 OpenOCDまたはSTLink構成を構成する必要はありません。 OpenOCD / STLinkおよびBMPM2を使用したデバッグインターフェイスの接続スキームの比較を以下に示します。 ご覧のとおり、BMPM2を介して接続するオプションの方が簡単です。







Black Magic Probe Mini V2.1ボードを使用した場合と使用しない場合のデバッグのアルゴリズムの比較







2つ目は、BMPM2の必要性がなくなる一方で、他のボードのファームウェアをコンパイルする機能です。 互換性のあるボードをここに示します







作業の可能性を調査するために、開発者が提案したTM32F103C8、STM32vldiscovery、STM32F429I-disc1、および1Bitsy V1.0の4つのボードが採用されました。







1BitsyおよびSTM32F429I-disc1を使用した作業については、さらに詳しく検討します。 1つ目は開発者自身の推奨に基づいて選択され、2つ目はタッチスクリーンを備えているため、研究プロセスがより視覚的になります。







Black Magic Probeでデバッグの世界を発見







1Bitsyをデバッグすることにより、Black Magic Probe V2.1の操作の調査を開始すると便利です。 このボードはBMPM2を使用するために特別に作成されたものなので、問題はありません。

Black Magicプローブと1BitsyをJTAGケーブルで互いに接続し、コンピューターに接続します。

以下では、GNU / Linux環境での作業方法について説明します。WindowsおよびMacOSで作業するためのガイドは、 ここで簡単に見つけることができます







BMPM2をPCとJTAGコネクタに接続した後、1Bitsyでgdbで3つのコマンドを実行してデバッグを開始します。 「sudo adduser $ USER dialout」コマンドを使用して、ユーザーをダイヤルアウトグループに追加することが重要です。そうしないと、何も機能しません。 最初のコマンド「target extended-remote / dev / ttyACMx」はBMPM2に接続します。xはシリアルポート番号で、「monitor jtag_scan」コマンドを使用してBlack Magicプローブに接続されているすべてのデバイスをスキャンします。 すべてうまくいけば、見つかったデバイスのリストが表示され、「attach 1」コマンドで1Bitsyに接続します。







(gdb) target extended-remote /dev/ttyACM0 Remote debugging using /dev/ttyACM0 (gdb) monitor jtag_scan Target voltage: 3.3V Available Targets: No. Att Driver 1 STM32F4xx (gdb) attach 1 Attaching to Remote target warning: No executable has been specified and target does not support determining executable automatically. Try using the "file" command. 0x0800026c in ?? () (gdb)
      
      





これで、1Bitsyにロードされたファームウェアをデバッグできるようになりました。 1Bitsyを使用すると、接続に問題がなく、すべてがシンプルで非常に便利です。 別のボードを使用する場合、シンプルさと利便性は維持されますか?







STM32マイクロコントローラーをベースにしたマザーボードがありました-STM32F429I-disc1、これを使用すると同時に、興味深いファームウェアを追加します。 このボードでの作業と1Bitsyでの作業の主な違いは、JTAGではなくSWDインターフェイスを介した接続です。







作業を開始する前に、次のスキームに従ってJTAG / SWD アダプターを介してボードを接続します。

SWDインターフェイスで(上部の出力から数える場合):







  1. SWCLK
  2. GND
  3. SWDIO
  4. 3V-tVref。


STM32F429I-disc1およびBlack Magicプローブ







デバッグプロセスの操作性を実証するために、いくつかのソフトウェアモジュールを含むファームウェアが使用されました。 それらの1つはゲームリバーシで、最も興味深いデバッグが行われます。







ファームウェアをボードにアップロードし、gdbで1Bitsyとほぼ同じコマンドを入力しますが、ボードがSWDを介して接続されているだけであるため、swdp_scanコマンドを使用する必要があります。







 (gdb) target extended-remote /dev/ttyACM0 Remote debugging using /dev/ttyACM0 (gdb) monitor swdp_scan Target voltage: 3.3V Available Targets: No. Att Driver 1 STM32F4xx (gdb) attach 1 Attaching to Remote target warning: No executable has been specified and target does not support determining executable automatically. Try using the "file" command. 0x0800026c in ?? () (gdb)
      
      





私たちの大きな悲しみに、私たちは勝つことができなかったので、私はそれに何かを打ち破りたかったです。 まず、 ソースを調べました。 おそらくBoardの最初のセルのアドレスを示すBoard変数がそれらの中に見つかりました。 近くには「Reversi-Player 1」と「Reversi-Player 2」の行があります。







 static void _SetPlayer(int Player) { int Score, ValidMoves, PossibleMoves; char ac[256]; _Board.ActPlayer = Player; if (Player == 1) { FRAMEWIN_SetText(_hFrame, "Reversi - Player 1"); } else { FRAMEWIN_SetText(_hFrame, "Reversi - Player 2"); } FRAMEWIN_SetBarColor(_hFrame, 1, (Player == 1) ? GUI_RED : GUI_BLUE); PossibleMoves = _CalcValidMoves(&_Board); GUI_Exec(); if (!PossibleMoves) { GUI_Exec(); _Board.ActPlayer = 3 - Player;
      
      





これらの行をIDA逆アセンブラーで検索しました。 疑似コードから、ボードのセルの開始アドレスであるアドレスを見つけることができることがわかりました。







  v1 = a1; v2002CB74 = a1; if ( a1 == 1 ) { sub_D8B3C(v2002CB80, "Reversi - Player 1"); v2 = 255; } else { sub_D8B3C(v2002CB80, "Reversi - Player 2"); v2 = 16711680; } sub_E06A8(v2002CB80, 1, v2); v3 = sub_DEDF8(0x2002CAF4); result = ((int (*)(void))sub_C91B4)(); if ( v3 ) return result; sub_C91B4(result); v2002CB74 = 3 - v1; v5 = sub_DEDF8(0x2002CAF4);
      
      





次に、このアドレスにあるものを確認するためにgdbを使用することにしました。







Gdb出力

ゲーム開始







わかった。 このテーブルとゲーム開始時のチップの位置を注意深く調べてみると、001は赤のチップ、002は青を意味していることがわかります。 いずれかのセルの値を変更してみてください。 これを行うには、次のコマンドを使用しました。







set *(char *) 0x2002CAF4 = 1









結果:







Gdb出力

コマンド入力後のセル状態







その後、すべてのセルの値を統一して、最初の動きからゲームに勝とうとすることにしました。







スクリプトの結果:







スクリプト実行結果

スクリプト実行後のセル状態







スクリプトは正常に動作し、ゲームに勝ちました。つまり、Black Magic Probe Mini V2.1ボードの助けを借りて、gdbを介してファームウェアを正常にデバッグおよびブレークできます。

そして、点滅するライトを使用した退屈な例もいくつかあります。







STM32F103C8







JTAGインターフェイスを介してSTM32F103C8をBlack Magic Probe V2.1に接続します。







JTAGインターフェイス







ファームウェアボードのソースは、 ここから入手できます







ソースコードでは、電球の点滅速度を変更して、電球のオン時とオフ時の時間間隔を増減させることができます。







STM32vldiscovery







つまり、STM32vldiscoveryボードをSWDインターフェイスを介してBlack Magic Probe V2.1に接続します。







  1. 3V3-tVref
  2. PA13-SWDIO
  3. PA14-SWCLK
  4. GND-GND


ファームウェアボードのソースは、 ここから入手できます







ここではすべてが前のボードと似ていますが、光源の時間間隔も変更し、電球を確認します。







結論







Black Magic Probe Mini V2.1ボードは使いやすく、オープンソースコードを備えたツールとライブラリのセットがあり、これが主な利点です。

欠点は、arm64プロセッサとTexas Instrumentsプロセッサのアーキテクチャのサポートが不足していることです。







http://1bitsy.org/overview/introduction/

https://1bitsquared.com/products/black-magic-probe

https://github.com/esden/1bitsy-bmpm-exercises/blob/master/embedded_programming_with_black_magic_and_lights_on-workshop_guide.pdf

https://github.com/blacksphere/blackmagic/wiki







著者










All Articles