
2026/04/18 23:21
# リバーシエンジニアリング:Mass Effect 2(ME2)用 USB コントローラーのディスアセンブリ ## 必要な工具 * ヘア dryer(熱風ガン) * 多機能包丁 ## 手順 1. ヘア ドライヤーを使用してコントローラーのケース全体に均等に熱を与え、プラスチックを柔らかくして取り外しやすくします。 2. ケーシングの接合線に沿って細心の注意を払って多機能包丁を挿入し、内部部品を損傷することなくケースの半分開閉させます。 3. 外部ケースが完全に外れた後、USB ケーブルアセンブリを取り外します。 4. 内部回路を確認し、特にチップおよびコネクタインターフェースに焦点を当てて調べます。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
主な成果は、2008 年製の ME2 ハンディデバイスのリバースエンジニアリングの成功であり、元の PC ドライバおよび「ME2 Desktop Buddy」が消失した後もオフラインでの使用を可能にしました。ソフトウェアのコピーがオンラインでの調査で存在せず、また当初 USB インターフェースを介して利用不能なゲームクライアントが必要とされていたため、研究者らはデバイスを分解し、エポキシ製のアンプーラ(glob-top)を溶かし、マイクロコントローラーを露出させました。その後、Siliconprawn のアーカイブを用いたダイソートマッチングにより、そのマイクロコントローラーが GeneralPlus 社の GPL162002A/B 型であることを特定しました。Ghidra(μ'nSP サポート付き)による静的解析の結果、フラッシュメモリの読み出し・プログラム・消去用のカスタム USB コマンド(ID 0xFF)が発見されました。バッファオーバーフローを悪用することで完全なメモリ読み出しが可能となり、コマンドの同期不整合を活用することで SST39VF3201 フラッシュチップへの制御された書き込みも実現しました。Miuchiz Reborn の保存作業を踏襲し、このプロジェクトでは ME2-Restoration リポジトリ内に、プロプライエタリなエコシステムを一切必要とせず、メモリダンプ、仮想ポイントおよびジェムの管理、入力の監視を実現するスタンドアロンのコマンドラインユーティリティを構築しました。
本文
ミュチュイズ 2(ME2)の USB コントローラのリバースエンジニアリング:ヒートガンとカッターナイフを用いて
背景
2024 年、bjiru という方が、約 2008 年発売で USB を介してオンラインワールドとの間でポイントやジェムを同期する機能が備わったハンドヘルド機器「ミュチュイズ 2(ME2)」に関する動画を投稿しました。同ゲームは極めてニッチなタイトルであり、当初ソフトウェア、ドライバ、リソースなどのアーカイブは存在しませんでした(少なくとも bjiru がオンラインゲームクライアントを発見するまで)。
私は、2015 年に立ち上げられ、このようなオンライン部と USB で接続されるハンドヘルド部を備えたゲームの保存、リバースエンジニアリング、エミュレーション、およびアクセシビリティの維持を目指している「ミュチュイズ・リバーンド」プロジェクトのリーダーです。同様に古く、USB を介した接続を特徴とするゲームである ME2 の事実は、私を率いるコミュニティが 2018 年に「おそらくアーキテクチャに類似点があるのではないか」と思い込んで指摘したものですが(実際には誤認でしたが)、長年その存在を知っていた私にとって、bjiru の動画こそが本格的な調査を開始するトリガーとなりました。
当初の取り組みは、bjiru が復元したコンピューター版ゲームを動作可能にするために必要なサーバーのリ作成にのみ注力していましたが、その過程で inevitably にハンドヘルド装置にも関心が向けられていきました。オンライン版ゲームのリ作成において、ポイント同期機構が不可欠であることを考えると、コンピューターと ME2 間の通信こそがこのゲームの最大のギミックであり、これを理解しなかった限り完全なリ作成は不可能です。私は、以前にミュチュイズ系ハンドヘルドでの経験を活かして、デバイス内の通信プロトコルを迅速に解明できると考えました(ただし、リバースエンジニアリングすべきコードが入手できればの話ですが)。
好奇心の限界を超えて ME2 装置を調達するに至り、eBay では法貨を犠牲にするしかありませんでした。やがて、私が前にしたのはこれらの試作品たちです。
これらはボタン数個とメスキュ USB ポートのみを持つ小型デバイスです。本体にはケーブルは付属していますが、ソフトウェアやドライバのディスクは含まれていません。この USB ポートを介してコンピューターとハンドヘルド間でポイントを同期するわけですが、ミュチュイズ系ハンドヘルドのケースでは、同梱の Windows ソフトウェアの動作をリバースエンジニアリングすることでフラッシュメモリへの完全なアクセスを取得していました。ME2 の場合、対応するソフトウェアが存在せず、デバイスの通信方法を調べるためのリバースエンジニアリング対象もありませんでした。Wayback Machine や bjiru において探しても、これらの機器と対話するために使用されたソフトウェアの生存コピーは見つかりませんでした(「ME2 デスクトップバディ」と呼ばれていたようですが、bjiru が復元したゲームクライアントとは別物のアプリケーションでした)。ハンドヘルド側は外付けストレージデバイスとして認識されますが、その内容はオンラインで ME2 ゲームをダウンロードするよう促し、現在は入手不可能です。
残された選択肢は一つしかありません:ハードウェアを開けて見るしかないのです。
内部の構造
メインの ME2 ファームウェアは、SST39VF3201 という 2 メガワード(4 メガバイト、アドレス可能なユニットとして 16 ビット)のフラッシュチップ上に格納されています。メインマイクロコントローラーは……硬いエポキシで固められた丸い塊の下に埋め込まれています。これは「オン・ボード・チップ(CoB)」と呼ばれる構造であり、コスト削減策ですが、その副作用として、集積回路に関する特定情報を隠蔽してしまう点にあります。通常のパッケージされたチップには、フラッシュチップと同様に識別用のマーキングがありますが、このようなデバイスで使用されるマイクロコントローラーには内部 ROM が搭載されていることが多く、私がリバースエンジニアリングしたい USB コードの全てまたは一部がその ROM に含まれている可能性があります。ROM 内にコードが存在する利点は、破損したデバイスの復旧や、製造元が対応する場合の組立後のファッショング可能です。しかし、私はこの mysterious なオン・ボード・チップを識別する方法を持っていませんでした。
フラッシュチップからデータを抽出することは、比較的単純でよく文書化されたプロセスです:チップハンダ取りし、XGecu などの市販フラッシュプログラマに装着して内容を書き出します。マイクロコントローラーの ROM からの情報も必要であれば少し難易度は上がりますが、この種のデバイスでは保護策が施されていないため、まだ可能でしょう。過去には、タマゴチ Pix の SPI フラッシュにコードを追加して起動 ROM をフラッシュチップの自由領域にコピーし、その後同じプログラマで読み出す手法を試しましたが、その際はマイクロコントローラーが正常にパッケージされており、型番も印字されていたため、データシートの入手や命令セットの特定、ROM のメモリ空間内での位置の確認などが容易でした。ME2 の謎めいたオン・ボード・チップについては、そうした情報は全く持ちませんでした。
抽出作業
不確実性が伴う中でも、これからの唯一明らかな道はフラッシュチップをハンダ取りして外すことです。私はまた、ハンドヘルドの PCB にソケットをハンダ付けし直せるようにと、フラッシュチップ用のソケットも購入していました。もしマイクロコントローラーから内部 ROM を抽出するコードを書く必要がある場合でも、素早く試行錯誤できるようになるための策でした。
残念ながら、ヒートガンではなく普通のハンディロンドーナーで無理やり外そうとした結果、チップ自体に損傷を与えてしまい、フラッシュチップをはずすことに失敗しました。数回の失敗後、この技能不足を解消するため、最大 500°C に達すると謳うリワークステーション(実質的には高温ヒートガン)を購入し、ホットエアーでハンダを溶かしてチップを外すことに成功しました。これでフラッシュの内容は問題なく書き出すことができましたが、購入したソケットを使ったことが実は私の能力の範疇を超えていることも同時に明らかになりました。48 の微小なピンを PCB にハンダ付けするだけでなく、ソケットのプラスチック部分を溶かさない程度の速さで行う必要があったのです。私はそのためのツールも技能も持っていなかったため、ROM を取得する必要がある場合、別の戦略を検討する必要がありました。
書き出し結果は良好でした。既に作成していたフラッシュダンプから未圧縮ビットマップを検出するための専用ツールを使用し、通常デバイスに表示される画像を見つけることができました:
命令セットの発見
フラッシュチップからファームウェアのダンプを取得しましたが、本格的なリバースエンジニアリングを開始する前に、少なくともどの命令セットで動作しているかを知る必要があります。ハードウェア自体にはマーキングがなかったので推測しなければなりませんでした。Ghidra(オープンソースのディスアッセンブラ/デコンパイラであり、私を雇用し続けている奇妙な Nightmare)を用いて、サポートされているほぼ全てのプロセッサ仕様のうちどれを試みても、あらゆる ARM 派生?6502 の後継者?MIPS?いや、Ghidra がサポートするものなら何でも?全て「いいえ」という答えでした。
あらゆる方法を試しましたが、このコードをディスアッセンブルすることはできませんでした。それは明らかにコードであることがわかりました(なぜなら、私が探していた一部のコードさえ見つけることができるからです!)。
以前にミュチュイズ系ハンドヘルドでの作業から、USB マスストレージデバイスの動作についてある程度の知識があり、以下のスニペットはおそらく 'U', 'S', 'B', 'S' をどこかに移動させる処理であることを特定できました。これは私が探していた USB マスストレージ通信の典型的なシグネチャです。このデバイスとの対話方法を解明するためにリバースエンジニアリングすべき USB コードの一部、あるいは全てがこのフラッシュダンプに含まれている可能性は極めて高いですが、どの命令セットで書かれているかの手がかりが全くないため、ディスアッセンブルすることができませんでした。
この時点で、壊れた ME2 ヌニットを数機所有していました。愚策のように見えますが、もしかするとエポキシ塊の下にマーキングがあるのでしょうか?おそらくないでしょうが、研究段階では、完全に破壊されたユニットの方が、単に壊れているユニットよりも価値があることがあります。
さて、私はヒートガンとカッターナイフを持っていました。「ヒートガンとカッターナイフを持っていれば、何でも……爪に見える」と言われます(伝説のようです)。
リワークステーションを最大温度まで設定し、カッターナイフで無理やり開けると、エポキシ塊全体が解放されました。オン・ボード・チップから外れた後、その下にはマーキングは一切発見されませんでした。マイクロコントローラーのシリコンダイの裏面は確認できますが、エポキシには小さな空気の気泡があり、そこからボンディングワイヤーが見えます。
前述のとおり、完全に破壊されたユニットの方が価値がある場合もありますし、私にはヒートガンとカッターナイフ、そして慣用句を再考するための切実な必要がありました。
ふっ。 あー。 コブ型(Chip-on-Board)をその方法でデカプスレート(解離)するなんて知らなかったのです。きれいに飛び出してくるだけでしたが、その温度も高かったので、私の方に向かって跳ね返ってくるのは恐るべきことでした。とても美しいですが、ここからは新たな道が見えます。電子顕微鏡で詳しく見させてください。
……はい、それが取扱説明書の通りです。公平を期すために申し上げますと、少なくとも 1 つの電子は含まれています。 「ハッキング」対象となる他の玩具の微小部品が視界に挑戦し、溶接手先での何が起きているかほとんどわからなくなった経験を繰り返すうちに、友人からの非常に丁寧な勧めで購入した安価なデジタル顕微鏡(硬貨用および溶接作業向け)を使用していました。
本来この作業には適さない設備であるにも拘わらず、取扱説明書の主張と逆ですが、この画像を顕微鏡で撮影することに成功しました。ダイ上の文字を読み取るレベルからは甚だ離れていますが、大まかなレイアウトは判明しており、類似の画像を探す場所がわかりました。
Siliconpr0n(現在は Siliconprawn)には多くの人がダイショットをアップロードしているアーカイブが存在しますが、私のものより通常は品質が良いものが多数あります。残念ながら、私が持っている情報だけでサイトを検索する有用な手段はなく、クリックとスクロールのループに陥りました…
その指紋は記録に残っています! 数時間後の午前 4 時、ようやく馴染みのあるものを見つけました。品質は私のものより優れていますが、レイアウトは一目瞭然です。John McMaster が撮影した対応画像と比較すると、GPL162002A(または B)が 180 度回転している状態です。これは GeneralPlus のマイクロコントローラーで、データシートもインターネット上で入手可能であり、命令セットは μ'nSP です。
ファームウェアのリバースエンジニアリング
μ'nSP は、実はこのタイプかつ時代の玩具では比較的一般的です。名前にラテン文字以外の文字が含まれている命令セットだということは推測できず、そこについては許してもらえれば幸いです。それでもなお、Ghidra では標準サポートされていないニッチなものです。幸いに既存のサードパーティ製ワークが利用可能だったので、Ghidra でディスアッセンブルし始め、関数名付けやデータシートからレジスタ名をインポートすることができました。
私がフラッシュダンプのハックスみただけで USB コードであることに確信していた以下の関数です。マイクロコントローラーのデータシートで規定されている通り、USB レジスタと対話しています:
前述の通り、この種の USB マスストレージデバイスの通信方法については、ミュチュイズ USB ライブラリを libusb を使って macOS に移植した実験的な作業を通じてある程度親密に知っていました。USB マスストレージデバイスは本質的に SCSI コマンドをトンネル化しており、これらはオンラインでよく文書化されています。例えば、デバイスからの読み出し要求や書き込み要求などのコマンドがあります。
ただし、通常のコマンド(読み込み/書き込み)は私の目的にはあまり有用ではありません。これらはコンピューターが組み込みマスストレージドライバですでに知っており、通常の外付けメディアデバイスのように扱う際に発行します。この場合、読み出しコマンドはヘルプファイルを含むファイルシステムを返すだけであり、書き込みコマンドは実行されません(書き込めないように設計されているため)。これらは全体フラッシュチップと対話するためのものではなく、新規ユーザーを手助けするための微小なシミュレートされた CD-ROM です。
しかし、いくつかのコマンド ID はベンダーが実装したい内容に予約されています。一部の予約済み ID 用のハンドラは、通常の ID 照合実行前に素直にインジェクトされています。
静的解析を用いることで、私が探していた「read(読み出し)」、「program(プログラム)」、「erase(消去)」の関数を特定し命名しました。これらは ME2 およびおそらく他の GeneralPlus デバイス用に実装された非標準コマンドであり、当初デバイスの付属だったソフトウェアやドライバでほぼ確実に使用されていました。任意のこれらのパスをトリガーするために USB メッセージを作成できます。Read はフラッシュからデータを取得し、Program はフラッシュを「プログラム」します。Erase はフラッシュ領域内のすべてのビットを 1 にリセットし、Program コマンドと組み合わせて使用すれば、「プログラム」は 1 から 0 へのみビット反転できるので、フルなフラッシュ書き込みを発行できます。私が興味を持っているカスタムコマンドの全ては、予約済み ID 0xFF を続き、サブコマンド ID と操作に必要な任意のパラメータが続く形式で構成されています。
コマンドの正確な構造については読者への詳細な説明を省略しますが、方法は重要かもしれません。私は libusb(実際には rusb)を使用して、USB 上の全ての対話を促進しています。この手法は、新しいドライバを書くのではなく、ユーザーランドコードで USB デバイスと対話することを可能にします。
Windows ME2 ソフトウェアがインターネットから消えたのは、その言語の第 2 の最後のスラング師が亡くなったようなものです。ME2 ハンドヘルドデバイスは、ある意味での「終端スピーカー」になりました。少しの実験と、ときどき正確なデコンパイルを読むことで、ほぼ絶滅したその言語の言葉を読み解くことができました。
あなたのフラッシュからセクターを借用できますか? ……いいえ?私のアクセントが問題でしょうか。調整して再質問します:あなたのフラッシュからセクターを借りてよろしいですか?次のセクターはいかがでしょうか?そのセクター内のビットのいずれかをプログラムしてもよろしいですか?再度あなたのフラッシュを見せて、変化があったか確認できますか?消去もお願いできますか……そして、破壊させようとしているのがどのセクターなのかを理解していただけますか?
順番に、ME2 が聞かねばならないメッセージを構造し、埋め込み、送信するためのコードを書きました。お互いに同じページにいるようになりましたら、異なるポイント数を設定した状態でフラッシュダンプを送ってほしいと伝えます。それらの比較を通じて、フラッシュ内のポイントの保存場所を特定し、最後にコンピューターを使って変更することができました!
確かに、使用してはいけないアクティブに実行中のコードの消去を除けば、これらのコマンドを介してデバイスに対してあらゆることを行うことができました。ME2 は、ミュチュイズ・リバーンドのエンブレムが表示されるべきではない場所に表示されている私のデバイスコレクションに加わり、その中にはダイショットを撮影したデジタル顕微鏡も含まれていました。
埋め込まれた ROM と埋め込まれたバグ
admittedly、初めてフラッシュの読み書きを試みたときは少し危険な行為でしたが、すべての実行コードが可視化できなかったためです。例えば、いくつかのコードはマイクロコントローラーの内部 ROM または RAM ルーチン(ROM からそこにコピーされたもの)を呼び出します。他の関数に対する私の推測の一部は、直接メモリアクセス(DMA)レジスタの設定方法から得られました。例えば、USB バッファからコピーする DMA が設定されていれば、おそらくフラッシュへのプログラムではなく、フラッシュからの読み出しに使用该データを使用している可能性が高いです。
このコードのように、フラッシュ以外の関数を呼び出すことで自身の下にあるコードを破損せずに戻る処理を行う場合があります。デバイスを brick しないよう非常に注意が必要です。
対象のメモリ領域はデータシートで明確に定義されています:
私がまだアクセスできていない「埋め込まれた」ROM が 128 キロワードあり、システムの完全な理解を妨げています。
幸いに、カスタムフラッシュ読み出しコマンドのための関数は境界チェックを行いません。つまり、非常に高いフラッシュアドレスからの読み出しを試みる特別に作成されたメッセージを用いると、マイクロコントローラーの全アドレス空間を超回り、元に戻ってしまいます。これは任意の読み出し能力を意味するため、この回にはデバイス内でのダンプコードを書く必要がありません!メモリの全てが読めるため、このバグを利用して埋め込まれた ROM を読み取り、後続のリバースエンジニアリングのために保存しました。
メモリ全体を通じて、デバイスのフレームバッファ RAM の位置を発見し、その時点でデバイス画面に表示されていた画像を確認できました:
また、データシートで指定されている位置を参照することで、デバイスのアドレス空間から汎用入出力(GPIO)レジスタも読み出すことができました。このバグを秒数十回トリガーすることで、ボタン入力をポーリングでき、望む場合は USB コントローラーとしても動作させることができました:
テストの途中に、フラッシュ内の値の奇妙な変更を発見しました。これは保存データであるようなものではありませんでした。
0x00AA(このシステムのワードサイズは 16 ビットであることを思い出してください)は、私が要求しなかった場所に書き込まれていました。埋め込まれた ROM を通じて、この行為を説明するコードを最終的に確認できました。
これらのフラッシュチップは特定のアオフセットにデータを書き込むことでコマンドを実行します。RAM と異なり、書き込んだデータを即座に確定させるわけではないため、フラッシュアドレス空間への単一の書き込みで実際のデータ変更は起こりません。フラッシュをプログラムしたい場合、0x5555 に 0xAA を書き込み始めてから、希望するアドレスに希望するデータを書き込むまでを含む多段階コマンドシーケンスを発行します。
余暇が多い(そしておそらくヒートガンとカッターナイフも持っている)ユーザーが、デバイスの動作をプローブしようと考えた場合、フラッシュチップの容量を超えるセクタへのプログラムを要求してしまう可能性があります。プロセッサはすべてのステップを把握していますが、フラッシュチップにはありません。最終コマンドサイクルはフラッシュチップのアドレス空間全体をスキップするため、フラッシュは何でも喜んでその場所でプログラムすべき値を待っています。
- プロセッサ:さあフラッシュ!別のワードのプログラミングを始めたい!
- フラッシュ:はっきり聞こえました!0x5555 に 0xAA をプログラミングします!
- プロセッサ:……え?
同期がずれたコマンドサイクルにより、フラッシュは次のコマンドの最初のサイクルを直前のコマンドの最後のサイクルと誤認し、0xAA が 0x5555 にプログラムされてしまいます。典型的な 8 ビットバイト相当のアドレスは 0xAAAA であり、私のフラッシュダンプで 0x00AA が書き込まれた位置と一致します。
これは特定のフラッシュ単語を破損することに問題がなければ任意の書き込みにも使用可能ですが、デバイスは既に十分に侵害されており、さらに brick したくないため興味はありませんでした。埋め込まれた ROM のリバースエンジニアリング結果から、独自の USB ハンドラおよびフラッシュ読み出し/プログラム/消去の実装を含むことが判明し、これらのデバイスを復旧できる可能性もあるかもしれません。しかし、ROM をその状態(フラッシュコードではなく)に起動させるのは一回だけであり、二度とは成功していません。ROM のデコンパイル結果から、GPIO ポートが浮遊していることに依存している可能性があると思われますが、確信はありません。いずれにせよ、私のミッションはすでに達成されました。
最終製品と教訓
このいたずらの結果生まれたのは、以下の機能を持つコマンドラインツールです:
- フラッシュの読み取り
- フラッシュの書き込み
- ポイントの読み取り
- ポイントの設定
- ジェムの読み取り
- ジェムの設定
- メモリダンプ(エクスプロイト経由)
- ボタン入力監視(エクスプロイト経由)
これらに加え、ゲームサーバーコードやその他の研究成果は ME2-Restoration リポジトリで公開されています。実装の詳細は同リポジトリにあり、通常の読者には興味深いものではないため、ここではプロセスと技術を説明するために具体的な技術詳細は省略しました。
より重要なのは、公式ソフトウェアが失われたにもかかわらず、ME2 のブラックボックスであるハードウェアとファームウェアからプロトコルを再構築し、本来機能していなかったインターフェースを再度使える状態に復旧させたことです。これは USB などのインタフェースに限った話ではありません。私がどのようにして長年のライセンスサーバーを再現し、10 年物のベクタエディタを生き返らせたかの詳細も参照してください。
また、これは私がコブ型集積回路をデカプスレートする初めての経験であり、その敬意を表するため、より良い顕微鏡を購入し、現在では Web 表示用に解像度を下げて公開しています: