Skip to content

第2章 箱の中で考える

リバースエンジニアリングは、歯ごたえがあってやりがいもあるゲームだ。勝つには、スキルと運の両方が少し必要になる。そしてどんなゲームとも同じで、スキルを磨くにはひたすら実践あるのみだ。

ハッカーとしてのスキルを磨く第一歩は、素材に対する直感を養うことだ。ハードウェアの場合、感覚をつかむにはあらゆるもののカバーを外して、部品が何で何をするものかを把握しようとするのが近道だ。Digi-Key、Jameco、Newark Electronics といった部品販売業者から紙のカタログを取り寄せて、空き時間にページをめくってみるのもいい。最初は部品カタログを読むのが辞書を引くように感じるかもしれないが、回路基板(circuit board)を多く見ていくうちに、次第にすべてが理解できるようになっていくだろう。

リバースエンジニアリングの次に強力なツールは、パターンマッチングだ。ハードウェアエンジニアはみな同じ物理法則の制約を受け、同じ種類の部品を使う。また、既存の設計を部品化して使い回すのも好む。その結果、同じ設計パターンがさまざまな製品に繰り返し現れる。設計パターンを見分けられるようになれば、部品番号がひとつも分からなくても回路の機能を特定できる。正式な電気工学の訓練を受けなくても、リバースエンジニアリングでかなりのスキルを身につけられる。

リバースエンジニアリングの最後のツールは実験だ。直感とパターンマッチングで回路の秘密が解けないときは、システムをいじって応答を観察し、機能を推測するしかない。実験でハードウェアが壊れることもあるが、民生用ハードウェアのほとんどは製造上の要件として検査できるよう設計されているものだ。しかもXboxの場合、新品が比較的安く手に入る。最初から2台買って1台を「生け贄」にしてしまえば、ハードウェアの実験に思い切って踏み込める。

本章では、リバースエンジニアリングの基礎を紹介する。直感を養うための回路基板の読み方といった基本テクニックから、パターンマッチングや基本的な設計パターンの認識といった中級テクニックまで取り上げる。

回路基板を読む

典型的な電子機器のカバーを外したときに最初に目に入るのが、回路基板(プリント基板)だ。一般に緑色や茶色をしたこの基板は、銅箔・ガラス繊維・エポキシ樹脂を重ねた多層構造で、その配線パターンには部品同士の接続関係、つまりネットリストがそのまま刻み込まれている。配線パターンをたどれば、各部品がどのように接続されているかを正確に把握できる。部品の配置と配線パターンのレイアウトにも、設計者の思考プロセスへのヒントが含まれている。

回路基板の基礎

典型的なプリント基板は、エポキシ樹脂を含浸させたガラス繊維のシートで絶縁された複数層の銅箔の配線パターンから成る。生の基板の色は白みがかった色や茶色で銅の配線が見えているが、ほぼすべての基板にははんだレジスト(soldermask)と呼ばれる薄い樹脂膜が塗られており、おなじみの緑色が生まれる。溶けたはんだははんだレジストに付着しないため、製造中に余分なはんだが基板に付着してショートを起こすことがない。ランドやパッドにあたる部分のはんだレジストには開口部があり、銅の酸化を防いではんだ付け性を高めるため、薄いスズやはんだのめっきが施されていて銀色に光っている。

はんだレジストの上には通常、シルクスクリーン(silkscreen)と呼ばれる白い文字のレイヤーがある。基板上の各部品はシルクスクリーンレイヤーに輪郭と固有の指定記号(reference designator)を持つ。指定記号を見れば、基板上の部品と回路図の部品を素早く対応させられる。指定記号は部品の命名規則に基づいているため、部品の機能を推測する手がかりにもなる。表2-1はXboxで使われている部品命名規則をまとめたものだ。

指定記号部品種別
Cコンデンサ
R抵抗器
U集積回路またはトランジスタ
Lインダクタ
RP抵抗アレイ(resistor pack)
Qトランジスタ
CRダイオード
Jコネクタまたはジャンパ
RTリセッタブルヒューズ
Yクリスタル(水晶振動子)

表2-1: Xboxの部品命名規則。

TIP

Xboxのマザーボードにはシルクスクリーンレイヤーで基板の端に沿って印刷された便利な座標系がある。部品面では側面に沿ってAからG、上下に沿って1から8までの座標になっている。基板の裏面は側面に沿ってMからVまでだ。文字I、O、Q、Sはそれぞれ数字の0、1、5と混同しやすいため省略されている。Xboxマザーボードの部品指定記号はこの座標系を使ってエンコードされており、たとえばJ7D1(LPCデバッグポート)は表面の座標7Dにある。本書ではこの座標系と部品指定記号を頻繁に使って特定の部品を指し示す。

配線レイヤー間の接続は、銅が充填された穴であるビア(via)によって行われる。回路基板のコストはレイヤー数が増えるにつれて上がるため、民生用電子機器のほとんどはレイヤー数を最小限に抑えるよう設計されている。ラジオ受信機やオーディオアンプは一般的に片面基板を使うが、最新のPCマザーボードは6〜8層に及ぶことがある。Xboxのマザーボードは4層構成だ。上の2層はチップ間の情報伝達に、内側の2層は電源供給に使われている。内側の電源層がほぼ銅の固体シートのため、Xboxのマザーボードは一見不透明に見える。リバースエンジニアリングにとって朗報なのは、すべての信号層が不透明な電源層の外側にあるため、Xboxマザーボード上のすべての接続を目視でたどれるという点だ。これは2〜4層の信号層を電源層の内部に埋め込んでいるマザーボードとは対照的だ。信号層を埋め込むと信号の追跡が難しくなる。(なお、信号を電源層の内部に埋め込む判断は、通常セキュリティではなく、基板の層間での電気信号の相互作用の物理的特性によって決まる。)

信号をたどるのはそれほど難しくない。発信元の部品から基板への接続点から始めて、配線をたどる。配線が円と交差する場合、信号が基板の反対側に続いている可能性が高い。配線が終端して基板の反対側への接続がない場合、電源を配るための広い銅箔の面、つまり電源プレーン(power plane)のいずれかに接続されている可能性が高い。

Figure 2-1: Cross-section of a typical circuit board.図2-1: 典型的な回路基板の断面図。

NOTE

試してみよう

Xboxのマザーボードでいくつかの信号をたどってみよう。手始めに、セクター8Cにある40ピンIDEコネクタJ8C1を見る。IDEコネクタからの信号のほぼすべてが、いくつかの抵抗アレイ(resistor pack)を経由してMCPXと呼ばれるチップに向かっている。そのチップについて何が推測できるだろうか?IDEコネクタからの配線のいくつかが前後に蛇行しているのに気づくだろう。これはすべての配線を同じ長さにそろえるためのテクニックだ。詳しくは「なぜ基板の配線はあちこちで蛇行しているのか?」のコラムを参照。

部品

信号をたどる経験が少し身についたところで、基本的な部品の見た目を学ぼう。

部品は受動素子(パッシブ)と能動素子(アクティブ)に分類される。大まかに言うと、受動素子は信号を増幅できないため、通常リードは2本だ。複数の受動素子が1つのパッケージにまとめられることもあるため、リードが複数になることもある。受動素子にはコンデンサ、抵抗器、インダクタが含まれる。Xboxのマザーボードで最も多い受動素子はコンデンサだ。コンデンサは電荷としてエネルギーを蓄える。Xboxでは主に、CMOSデジタルロジックのスイッチングによる電源電圧の局所的な変動を平滑化し、高周波ノイズを抑えるために使われている。

Figure 2-2: Typical passive components in an Xbox.図2-2: Xboxの典型的な受動素子。コンデンサ、インダクタ、抵抗器。

📦 コラム:なぜ基板の配線はあちこちで蛇行しているのか?

いくつかの回路基板を見ていると、基板上の配線がよく曲がりくねっているのに気づくだろう。目的地に届く前に何度も前後に折り返すことさえある。直線で済むのにと思えるが、基板上の構造物が設計者の気まぐれで置かれることはほとんどない。実は、ハイエンドの電子機器での信号の速度は光速の約4分の1で、信号が目的地に到達するのに要する時間に比べると遅い。たとえば1GHzプロセッサの1クロックサイクルの間(1GHzでの1クロック刻みは10億分の1秒、つまり1ナノ秒)、信号は回路基板上を3インチしか進めない。そのため、同じチップから出る2つの信号は、配線の長さが大きく異なれば目的地への到達時間もかなり異なる。これに対処するために、設計者は短い方の配線に余分な折り返しを加えて、有効な配線長を長い方と同じにする。

Xboxのマザーボードに見られる大型の受動素子には、インダクタと抵抗器もある。マザーボード上の大型のワイヤー巻きトロイダル(ドーナツ形)インダクタはすべて電源サブシステムの一部だ。インダクタは磁束としてエネルギーを蓄える。インダクタとコンデンサは電気的特性が相補的で、間にトランジスタスイッチを挟んだ組み合わせで非常に効率のよい電源レギュレータが構成できる。Xboxのマザーボードの抵抗器のほとんどは、信号配線の終端で余分なエネルギーを熱として逃がすか、配線を特定の論理レベル(0か1の状態)にバイアスするために使われている。

Xboxのマザーボードで受動素子を識別する方法は2つある。1つ目はパッケージの形状で判断する方法だ。受動部品の基本的な種類は多くないため、形状での識別は難しくない。図2-2にはXboxのマザーボードで見られるコンデンサ、インダクタ、抵抗器の写真がある。2つ目は基板上の部品の隣のラベルを読み、表2-1を参考に指定記号から部品の機能を推測する方法だ。

能動素子は信号を増幅でき、3本以上のリードを持つ。最も単純な能動素子はトランジスタで、3本、ときに4本のリードを持つ(ディスクリートの「MOSFET」トランジスタには4番目の「ボディ」端子を持つものがある)。最も複雑な能動素子は集積回路(IC)で、CPUやメモリチップなどは数百、ときに数千のリードを持つ。集積回路はさまざまなパッケージに入っており、ボールグリッドアレイ(BGA:Ball Grid Array)パッケージのように接続部がパッケージの下に隠れることもある。

📦 コラム:デジタル回路基板にはなぜこんなにも抵抗器とコンデンサがあるのか?

多くの基板を見ていると気づくのが、抵抗器とコンデンサの多さだ。コンデンサはノイズを抑え電源電圧を安定させるために必要で、至る所に置かれている。電源を配るための電源プレーンにもわずかな抵抗とインダクタンスが存在するためだ。こうした寄生成分は、電源を通じて大電流が切り替わると大きな問題を引き起こすことがある。コンデンサの正確な配置と選択は一種の職人芸だ。基板上で作業中に小さな砂粒ほどのコンデンサを一つ飛ばしてしまっても、交換なしで済ませられる場合が多い。ただし飛ばしたコンデンサをそのままにしておくと、たまにしか再現しない不安定動作や間欠不良が起きやすい。

コンデンサが各部品のすぐ近くで一時的に必要になる電荷を供給するために至る所にある一方、抵抗器は余分なエネルギーを熱として逃がす。マザーボード上の高速信号は大量のエネルギーを運んでおり、抵抗器によって受信側で制御しながら消費されなければ、信号エネルギーが送信側に反射して問題を引き起こす。体育館の音響に似た現象だ。空の体育館で話すとエコーが起きる。話すのが速すぎると、エコーが干渉して聞き手には聞き取れなくなる。しかし壁に吸音材を貼れば、エコーは吸収されて邪魔されずに話せる。

抵抗器は壁の吸音材のようなもので、回路が高速で通信できるようエコーを抑える。コンデンサのほとんどとは異なり、これらの抵抗器を作業中に飛ばしてしまうと、回路を正常に動作させるために交換が必要だ。こうした「終端抵抗器」は1パッケージに4個か8個まとめられていることが多く、小型の集積回路のように見える。抵抗アレイ(resistor pack)は光沢があり、少し凸凹しており、白い縁があり、近くに「RP」という指定記号があることで他の部品と区別できる。抵抗アレイを通じて信号をたどる場合、信号は一方のピンから真っすぐ対応する反対側のピンに通過すると仮定するのがほぼ安全だ。

Figure 2-3: Cross sectional view of a BGA packaged part (GeForce2) mounted on a motherboard.図2-3: マザーボードに実装されたBGAパッケージ部品(GeForce2)の断面図。パッケージ下面の隠された接続を示す。

XboxのマザーボードのグラフィックスチップMCPXとCPUはすべてBGAパッケージを使っている。図2-3はBGAデバイスの断面図で、パッケージ下の隠された接続を示している。

特定の集積回路の機能を特定することは、受動素子の場合より難しい。機能的に同一のシリコンが外観の大きく異なるさまざまなパッケージで購入できる。接続先や外観を見て機能を推測できる場合もあるが、最も確実な方法はチップの部品番号を読んでウェブで調べることだ。(一般に部品にはメーカーを識別するロゴや部品番号プレフィックスがあり、メーカーのウェブサイトで詳細を調べられる。)ロゴや部品番号プレフィックスが分からない場合は、以下のサービスが役に立つ。

  1. www.findchips.com は部品番号や部品番号の一部を入力すると、多くのディストリビューターの在庫を検索できる。一般的な部品のほとんどはFindChipsに表示され、部品の簡単な説明だけでなく価格や注文情報も得られることが多い。

  2. www.google.com はウェブ上のあらゆるものをインデックスしており、部品番号も例外ではない。ロゴに含まれる文字と「semiconductors(半導体)」のような説明的な言葉を組み合わせて検索すると、メーカーのウェブサイトを見つけるのにも役立つ。メーカーのウェブサイトでは、専用の部品検索エンジンを探すか、半導体製品のサブページに移動する必要がある。企業トップページの検索機能で部品番号が見つかることもあるが、多くの場合は役に立たない企業やマーケティングページしかインデックスされていない。

  3. これらのサービスで見つからない場合は、部品番号のプレフィックスやサフィックスをいくつか取り除いてみよう。M29F080Aの例では、部品番号29F080だけで検索すると、STMicroelectronicsの部品と機能的に互換性のある部品を製造する複数のメーカーのウェブページが見つかる。

Figure 2-4: Anatomy of a typical IC part number.図2-4: 典型的なIC部品番号の構成。Xboxマザーボードの座標U7D1にあるチップのイラスト。

NOTE

試してみよう

Xboxの部品番号を調べてみよう。Xboxのマザーボード上のU7D1を探そう。図2-4は見つかるものを示している。部品番号は通常チップの上の最も長い数字で、1〜2文字のアルファベットから始まることが多い。メモリチップとプロセッサにはスピードグレードまたはクオリティサフィックスが続くことが多い。また、ほぼすべてのチップにデートコード(製造年週)がある。デートコードは通常YY-WW形式の4桁の数字で、YYはチップが製造された年、WWは製造週だ。この例では、M29F080Aはシンガポールで2001年の第41週に製造され、スピードグレードは70N1だ。残りの番号5881Kはロットコードで、チップを製造施設での特定のシリコンウェハーまたはウェハーロットのトラッキング番号に紐づけるものだ。「ST」ロゴはSTMicroelectronicsを示しており、URLをwww.st.comと推測するか、Googleで検索すればすぐに見つかる。ホームページの検索フィールドにM29F080Aと入力すると、この部品の詳細なデータシートと説明——8 MbitユニフォームブロックシングルサプライフラッシュROM——が直接見つかる。

テストポイント

民生用電子機器のほぼすべての回路基板には、工場での完成品基板の検査を容易にするための構造が備えられている。これらの「テストポイント(test point)」は、製造上の欠陥という避けられない現実に対処するために存在する。Xboxもテストポイントや製造上の欠陥とは無縁ではない。Xboxのマザーボードの底部には、Xbox内のほぼすべての重要な信号にコンタクトプローブでアクセスできる数百もの小さな銀色の円——テストポイント——が並んでいる。テストポイントがあれば、顕微鏡や安定した手が必要な信号にも簡単にアクセスできるため、リバースエンジニアやハードウェアを改造したい人にとって歓迎すべきものだ。

量産ラインでは、針山のように多数のプローブを並べた検査治具を使い、基板上のテストポイントに一斉に接触させて検査する。この種の治具はベッド・オブ・ネイルズ(床)治具とも呼ばれる。名前の通り、スプリング内蔵のポゴピン(pogo pin)が何百本も並んでいる。マザーボードをテストベッドに位置合わせして、機械式プランジャーまたは真空チャックでクランプする。同様に、ポゴピンを使えばテストポイントを活用したはんだ不要の改造もできる。自分で回路基板を製作する必要はある(付録参照)が、できあがるのはネジで固定するだけのボードだ——はんだ付けは不要!

Xboxアーキテクチャ

パターンマッチングの例に入る前に、参考となるパターンが必要だ。Xboxの内部アーキテクチャをその参考として学び、最終的にXboxのアーキテクチャをPCや他のビデオゲームコンソールと比較してみよう。

高レベルの構成

XboxのCPUは733 MHzで動作するPentium-III相当のプロセッサだ。CPUの「S-Spec」番号はMobile Celeronのそれに最も近い。CPUは標準のP6 133 MHzフロントサイドバス(FSB:Front Side Bus)を介して、nVidia製のNV2Aと呼ばれるグラフィックス処理ユニット(GPU:Graphics Processing Unit)兼ノースブリッジコンボチップに接続されている。最も近いPCの類似品はnVidia製のnForce IGPチップだ。

Figure 2-5: High level architectural view of the Xbox.図2-5: Xboxの高レベルアーキテクチャ図。

ノースブリッジロジックとGPUが1つのチップに統合されているため、CPUとグラフィックスプロセッサは共通のメモリバンクを共有できる。これを「ユニファイドメモリアーキテクチャ(UMA:Unified Memory Architecture)」と呼ぶ。従来の分離型ビデオ/メインメモリアーキテクチャと比較して、UMAは専用ビデオメモリを不要にするためコストが低い。ただし、メインプロセッサとグラフィックスプロセッサの間でメモリアクセスの競合が生じるため、特定の状況ではUMAのパフォーマンスが低下する。この競合を軽減するために、システムメモリはしばしば複数のバンクに分割される。nForce IGPの場合、スイッチングネットワークを通じてGPUとCPUの両方が独立してアクセスできる2つのバンクにメモリを分割している。

GPUは「MCPX」と呼ばれる多機能チップにHyperTransportバスという高速で細い(ピン数の少ない)バスで接続されている。MCPXはサウスブリッジチップにXboxの周辺機器のほぼすべて——USBコントローラ、レガシーブートROMインターフェース、Dolbyデジタルオーディオプロセッサ、大容量ストレージIDEコントローラ、イーサネットコントローラ、システム管理機能のインターフェース——を統合している。

Xboxの主要ブロックの接続関係は図2-5に示されており、図2-6はこれらのブロックが実際のXboxマザーボード上のどこに位置するかを示している。

Figure 2-6: Photograph of an Xbox motherboard with the major components labeled.図2-6: 主要部品にラベルを付けたXboxマザーボードの写真。

機能の詳細

以下のセクションでは、Xboxアーキテクチャを構成する各部品の概要を簡単に説明する。特にXboxのセキュリティ機構をリバースエンジニアリングするために必要な詳細に重点を置く。

CPU

CPU(Central Processing Unit、中央処理装置)は従来のコンピュータの計算の中核だ。CPUアーキテクチャというテーマだけで1冊の本に値するほどなので、XboxをリバースエンジニアリングするためのXbox CPUの制御権を得る方法に絞って説明する。

CPUはメモリに格納された命令の並び——プログラム——を読んで、さまざまな計算を行ったり、データに基づいて判断を下したりする。命令はオペコード(opcode)と呼ばれる数値としてメモリに格納される。オペコードは引数としてオペランドを取る。プログラマーは低レベルのマシンコードを書く際、数百のオペコード番号を覚えなくて済むようにアルファベットのニーモニック(mnemonic)を使う。たとえば、バイト単位の減算命令のオペコードは0010.1000(2進数)または0x28(16進数)で、ニーモニックは「SUB」だ。必要な減算オペコードは減算データのソースと幅によって異なる。すべてのオペコードとオペランドの規則を追い続けるのは大変なので、ニーモニックとオペランドを命令番号に変換するプロセスはアセンブラ(assembler)と呼ばれるプログラムが担う。命令番号をニーモニックに逆変換するのはディスアセンブラ(disassembler)だ。なお、ほとんどのプログラムはアセンブリ言語では書かれておらず、Cなどの高水準言語が一般的に使われる。高水準言語はコンパイラ(compiler)を使ってマシン命令に変換される。マシン命令を高水準言語に逆変換する自動デコンパイルは難しいことがある。コンパイル——特に最適化されたコンパイル——の過程で、元のソースコードに含まれる高水準の構造情報の多くが失われるからだ。

プロセッサは命令ポインタ(IP:Instruction Pointer)と呼ばれるもので現在実行中の命令を追跡する。IPはコンテキストによってはプログラムカウンタ(PC:Program Counter)とも呼ばれる。IPは通常、分岐命令に遭遇しない限り、プログラムを1命令ずつ進めていく。分岐命令はCPU内部のデータを調べて新しい場所に分岐する機会をプログラムに与える。命令ポインタの動きを理解することはXboxをリバースエンジニアリングする上で中心的な作業だ。IPを操作できるということは、Xboxが何をできて何ができないかを制御できることとほぼ同義だ。Xboxのソフトウェアアーキテクチャに実装されているセキュリティ機構は、コードを実行する前に暗号学的に真正性を検証することで、IPが常にMicrosoft承認のコードのみを実行することを保証しようとしている。

📦 コラム:2進数と16進数

デジタル回路は1と0を使って数値を表現する。この2進数(「2進法」)表記は、電気信号が数値を表現する方法を反映している。2つの電圧レベルの範囲を使って一方または他方のロジック状態を定義している。2つ以上の電圧レベルを使って情報を表現する電気システムを構築することも可能だが、電力と複雑さのコストを伴う。たとえば現代のモデムは複数の電圧レベルと位相情報を使って1つの時間単位で複数ビットのデータを表現している。

2進数での数値の構成と算術は、おなじみの10進数(「10進法」)表記と同じ規則に従う。10進数では、桁があふれたときを記録するために0がプレースホルダーとして使われる。たとえば9より大きい1桁の数字はないため、9に1を加えるとあふれが生じる。したがって10は最右の10進数の位が1回あふれたことを記録している。同様に2進数では、2進法での最大の1桁の数字は1なので、1に1を加えると10になる。

したがって10進法では、4桁の10進数 d₄d₃d₂d₁ の値は以下のように分解できる:

d₄×10³ + d₃×10² + d₂×10¹ + d₁×10⁰ = d₄×1000 + d₃×100 + d₂×10 + d₁×1

同様に、4桁の2進数 b₄b₃b₂b₁ は以下のように分解できる:

b₄×2³ + b₃×2² + b₂×2¹ + b₁×2⁰ = b₄×8 + b₃×4 + b₂×2 + b₁×1

たとえば、2進数1010 = 1×8 + 0×4 + 1×2 + 0×1 = 10進数の10となる。

2進数で数値を追い続けるのはすぐに煩雑になる。10進数の968を表すには10桁の2進数が必要だ。画面スペースを節約するために、2進数は8進数または16進数に変換される。8進数(「8進法」)は初期のコンピュータ時代には一般的だったが、今は稀だ。16進数(「16進法」)が事実上の標準だ。16進法には16の数字があるため、10進数の10〜15に対応する16進数はAからFの文字で表される。表2-2は最初の16個の正の整数の2進数・10進数・16進数の変換をまとめたものだ。

16進数を10進数と区別するために、多くの人はC言語の慣習を使う。0x[数値] は16進数を表し、[数値] は暗黙的に10進数だ。2進数にはCに類似した標準がないため、Verilogの標準 [桁数]'b[数値] を使う人もいる([桁数] は2進数の桁数)。また1と0の文字列の後ろに「b」を付けた 1010.1100.1110b も2進数として使われる。なお、2進数の桁を4桁ずつにグループ化するために「.」が使われており、2進数を頭の中で16進数に変換するのを助けてくれる(= 0xACE)。

2進10進16進2進10進16進
000000100088
000111100199
001022101010A
001133101111B
010044110012C
010155110113D
011066111014E
011177111115F

表2-2: 2進数・10進数・16進数変換表。

CPUの中核はレジスタファイルと呼ばれる非常に小さいが高速なメモリだ。1プロセッサクロックサイクルに複数のデータを読み書きできる。レジスタファイルのデータは、算術論理演算装置、つまり ALU(Arithmetic Logic Unit)と呼ばれる演算実行ユニットに送られる。ALUが計算する機能はメモリからフェッチされた命令によって制御される。データがALUで処理されると、レジスタファイルに書き戻すか、メモリに格納される。

ほぼすべての現代CPUが持つ重要なパフォーマンス機能として、キャッシュ(cache)と呼ばれるメモリアクセスアクセラレータがある。キャッシュはCPUコアが近い将来に使用しそうなデータや命令のコピーを格納する小型高速メモリだ。キャッシュはレジスタファイルより遅いがメインメモリより速く、レジスタファイルより多くのデータを格納するがメインメモリより少ない。

Xbox CPUのキャッシュについて知っておくべき重要な特徴は、ライトバックキャッシュ(writeback cache)だという点だ。ライトバックキャッシュでは、CPU内部に格納されたデータのコピーがメインメモリの内容と同期していない状態になることがある。このタイミングの差は、外部メモリのトラフィックを観察するだけでCPUの実行をたどろうとする試みを複雑にする。また、キャッシュメモリはメモリバスを観察している者から中間的な計算結果を隠すためにセキュリティルーティンに活用されることもある。

ノースブリッジとサウスブリッジ

ノースブリッジ(northbridge)とサウスブリッジ(southbridge)という用語はPCアーキテクチャ固有の用語だ。ほぼすべてのPCに搭載されている2つの基本的なサポートチップを指す。ノースブリッジチップはCPUをメインメモリやAGP・PCIなどの高パフォーマンス拡張バスに接続する。サウスブリッジチップはノースブリッジチップからぶら下がるように接続され、一般的なPCに見られるすべての追加周辺機器——パラレル、シリアル、USB、マウス、キーボード、IDEコントローラ、オーディオコーデックなど——を含んでいる。CPU、ノースブリッジ、サウスブリッジという3つの主要モジュールに分割することで、PC設計者はさまざまなメモリアーキテクチャを多様なプロセッサや周辺機器と組み合わせられる。

ノースブリッジとサウスブリッジのチップセット間の接続はチップセットによって異なる。Xboxの場合、HyperTransportと呼ばれる高パフォーマンスの細い並列バスが、ノースブリッジとサウスブリッジに相当する機能の接続に使われている。このバスは各方向8ビット幅しかないが、200 MHzでクロックされ各クロックエッジでデータがサンプリングされるため、実効ピーク転送レートは各方向400 MB/秒だ。ノースブリッジチップはフロントサイドバス(FSB)でCPUに接続される。XboxのFSBはAGTL+ロジックレベルを使用する64ビット133 MHzバスだ。

リバースエンジニアリングにおいてチップ間の接続の種類を知って理解することは非常に重要だ。接続の種類によって、各部品間のデータを傍受する難しさが決まるからだ。比較的傍受が容易なバスであるHyperTransportバスの詳細については、第8章「Xboxセキュリティのリバースエンジニアリング」で説明する。

XboxのサウスブリッジはnVidia設計のMCPXというチップで、nVidia nForce MCP(Multimedia and Communications Processor)の派生品だ。ノースブリッジチップもnVidia設計で、NV2A GPUと呼ばれる。どちらもTSMC(Taiwan Semiconductor Manufacturing Corporation、台湾積体電路製造)によって製造された。NV2AはGPUと、ほとんどのノースブリッジチップに見られる従来のメモリ・拡張バスコントローラの両方を統合している。前述のように、グラフィックスプロセッサとノースブリッジを統合することで、システム設計者はグラフィックスメモリをメインメモリに統合でき、そのトレードオフとして幾分かのパフォーマンスが犠牲になる。

RAM

Xboxのマザーボードはメインメモリとして64 MBのDDR SDRAMを使用している。DDR SDRAMとはDouble Data-Rate Synchronous Dynamic Random Access Memory(倍速同期ダイナミックランダムアクセスメモリ)の略だ。同期化とDDR技術を組み合わせることで、Xboxのメインメモリの合計帯域幅は6.4 GB/秒を達成している。

RAMは基本的にCPUによってインデックスされる情報のテーブルだ。RAM内の各位置にはアドレスと呼ばれる固有のインデックス番号があり、「ランダムアクセス」という名称が示すように、データアクセスの順序に制限がない。1

「ダイナミック」という用語は、データの整合性を保つために常にリフレッシュしなければならないRAMに適用される。たとえばXboxで使われているRAMはすべての場所を1秒間に約30回読み出して書き戻す必要がある。現代のDRAMチップにはこのプロセスを最適化する専用ハードウェアが組み込まれているから、パフォーマンスへのペナルティはそれほど大きくない。

「同期」という接頭語は、DRAM内部でデータアクセスの手順が一連のステップに分割されることを意味する。各ステップは独立していて並列に実行できるため、複数のデータリクエストを同時並行で処理できる。クロックと呼ばれる外部タイミング信号が、DRAM内部の各ステップを通じたデータアクセスリクエストの移動を同期させる。その結果、データアクセスリクエストはパイプの中を水が流れるように各ステップを通過する。このテクニックはパイプライン処理(pipelining)とも呼ばれる。パイプライン処理によって複数のリクエストを同時に処理できるため、同期DRAMはその前身よりも高い帯域幅スループットを持つ。ただし、SDRAMへのアクセスが最初に発行されてからデータが出力に現れるまでの時間——アクセスレイテンシ——はパイプライン処理によって改善されない。

「ダブルデータレート」という用語は、同期データが同期クロックに対してどのように転送されるかを指す。クロック波形は高低信号の繰り返しパターンからなる。従来のシステムではデータはクロック波形の低から高への遷移のときにのみ転送される。DDRシステムでは低から高への遷移と高から低への遷移の両方で転送される。したがって同じクロック周波数で2倍のデータを転送できる。DDR SDRAMベンダーが引用するパフォーマンスの目安(DDR266など)は転送レートを指すため、実際のクロック速度はその半分——この場合は133 MHzとなる。

ROM

すべてのコンピュータには、スタートアップ(ブート)プログラムを格納するための何らかの不揮発性メモリが必要だ。DDR SDRAMはこの用途には使えない。電源が切れるとすべてのデータが失われるからだ。現行バージョンのXboxは、電源が切れても消えないデータを格納するためにフラッシュROM(FLASH ROM)を使用している。ROMはRead-Only Memory(読み出し専用メモリ)の略で、FLASHは電気的に再プログラム可能な特定のスタイルの記憶素子を指す。PCではフラッシュROMは便利で、エンドユーザーがブートコードのミスを修正するために再プログラムできる。しかしXboxでは、エンドユーザーによるフラッシュROMのプログラミングは意図的に無効化されている。プログラミングに必要な書き込み信号は、Xboxマザーボードの背面の部品位置R7R4にあるジャンパを省略することで切断されている(「フラッシュROMプログラミングハードウェアの有効化」コラムを参照)。Xboxの場合、フラッシュROMの再プログラム可能性は主に開発・製造中のMicrosoftの利便性のために利用されている。Microsoftがブートプログラムとカーネルをシリコンに刻み込む準備ができたと判断したら、数ヶ月以内にXboxはより安価なハード配線の「マスクROM」を使用するようになる可能性がかなりある。

📦 コラム:フラッシュROMプログラミングハードウェアの有効化

Microsoftがインシステムのフラッシュ ROMプログラミングを禁止するために切断した信号にパッチを当てるのは比較的シンプルな手順だ。フラッシュROMの書き込み信号は、Xboxマザーボードの底面のセクター7Rに位置する1つの抵抗器(部品番号R7R4)を省略することで切断された。2つの銀色のパッドの間にワイヤーをはんだ付けするか、大量のはんだでパッドをブリッジするだけでよい。

ただし、このパッチによってハードウェアでフラッシュ ROMプログラミングが有効になっても、実際に再プログラミングを行うプログラムはまだ持っていない。そのようなプログラムを実行することは、Microsoftが設置した暗号的なソフトウェアセキュリティシステムのためにはるかに大きな課題だ。

ブートROMにはシステム全体の初期化を担う重要なコードが含まれているから、コンピュータのリバースエンジニアリングにおいて極めて重要だ。Xboxの場合、ブートフラッシュROMはさらに重要な役割を果たす。厳格なソフトウェアセキュリティシステムの実装を部分的に担っているからだ。セキュリティシステムにおけるフラッシュROMの正確な役割については後で説明するが、今の段階で覚えておくべき重要なことは、フラッシュROMがXboxのハードウェアの初期化を制御し、初期のオペレーティングシステムカーネルイメージも格納しているということだ。

その他

Xboxにはシステム管理コントローラ(SMC:System Management Controller)と呼ばれる小型の8ビットコプロセッサがある。SMCはRAM、ROM、プロセッサを1つのパッケージに収めた完全なミニコンピュータだ。SMC内部のプロセッサはPIC(Peripheral Interface Controller)アーキテクチャを採用しており、もともと1975年頃にハーバード大学で開発され、General Instrumentsによって商業販売向けに適応されたものだ。Arizona Microchip Technology(現在はMicrochip Technology、www.microchip.com)は1985年にPIC製品ラインを買収し、以来販売し続けている。SMCはXboxのセクター7Bにあり、指定記号はU7B2だ。

SMCはXbox前面の電源ボタンを監視するため、CPUが電源オフのときでも動作していなければならない。そのため、Xboxがプラグインされているときはいつでも低電流の3.3V「スタンバイ」電源ラインがアクティブになっている。SMCはまたXboxの電源ボタン周りのライトの制御と、DVDイジェクト機構の制御も担っている。さらにSMCにはCPUの健全性を監視してクラッシュした場合にCPUを再起動する機能がある。自分のオペレーティングシステムをXboxで動作させたい場合は、SMCの監視機能を無効にする必要がある。SMCはI²Cと呼ばれる1ビットシリアルインターフェースを通じてMCPX経由でCPUと通信する。

Xboxのもう一つの重要な機能はLPCデバッグポートだ。LPCデバッグポートは33 MHzで動作する4ビット幅のバスだ。LPCとは「Low Pin Count(低ピン数)」の略で、もともとはキーボード、シリアルポート、パラレルポート、ブートROMなどの多数の低速レガシーデバイスを、シンプルな中間変換チップを経由してサウスブリッジチップに接続する方法として考案された。デバッグポートはおそらくMicrosoftのハードウェアメーカーによる製造テスト目的でXboxに設けられている。Xboxが製造の最終段階に近づくと、LPCデバッグポートを使ってXboxマザーボードのテスト、診断、バーンインを行うブートプログラムを読み込む。LPCデバッグポートについては第11章で詳しく説明するが、今知っておくべきことは、LPC準拠のROMデバイスを接続してフラッシュROMのデータピン(D0)の1本を特定の電圧(ゼロボルト)にショートさせることで、XboxがLPCデバッグポートを通じて最初のブートROMイメージを読み込むよう強制できるということだ。これはXboxを自分のコードで起動させる最も簡単な方法の一つだ——Xboxを保護している秘密のブートコードを回避する方法を知っている場合に限るが。

パターンマッチング

Xboxアーキテクチャに慣れたところで、最も強力なリバースエンジニアリングツールの一つ——パターンマッチング——のための参考になる。部品の接続性、配置、形状を観察するだけでさまざまな部品の機能について根拠のある推測をできることが、一流のリバースエンジニアになるための第一歩だ。パターンマッチングの力を示すために、XboxのマザーボードをPCのマザーボードおよびニンテンドーゲームキューブのマザーボードと比較する。

多くのパターンを学ぶことがパターンマッチングの上達には最善の方法だ。僕は購入するすべての機器を分解して、回路基板を熟読することで他の設計者が何を知っているかを「読む」ようにしている。すべての回路基板はその設計プロセスについての物語を語っており、何らかの意図された目的を持たない特異な回路の特徴に出会うことはほとんどない。

WARNING

注意

電子機器を分解する際は、まず電源を抜いて、電源内の大型コンデンサの電荷が放出されるまで1分ほど待つこと。また、第1章で説明した適切な静電気対策を忘れずに!

比較:Xbox対PC

PCプラットフォームは非常によく文書化されているため、XboxのPCへの類似性はハッカーにとって大きな恩恵だ。Xboxのすべての部品には典型的なPCにアナログとなるものがあるため、高レベルの質問には類似したPC部品について読むだけで答えられる。XboxのマザーボードとPCの標準的なマザーボードとの類似点をより詳しく見ることには価値がある。さらに、本書の情報の多くはPCにも直接適用されるため、Xboxをハッキングして学んだことを多くの場面に応用できる。

Xboxの最も近い仲間は、nVidia nForceやVia TechnologyのProSavageDDRのようなユニファイドメモリアーキテクチャを使用するチップセットに基づくシステムだ。前のセクションのアーキテクチャ図は、XboxとnVidia nForceチップセットのnVidiaウェブサイト上の公開仕様を読むことで得られた。このセクションではXboxをVia Technology ProSavageDDRベースのP4M266マザーボードと比較する。XboxをnVidia以外のチップセットマザーボードと比較するのは、XboxとPCとの広範な類似性を強調するためだ。

図2-7はPCマザーボード、Via P4M266の写真を示している。チップセットが異なるメーカーによって製造されているにもかかわらず、P4M266とXboxの類似性は顕著だ。

Figure 2-7: Via P4M266 motherboard with integrated graphics.図2-7: 統合グラフィックスを搭載したVia P4M266マザーボード。

前のセクションで取り上げたほぼすべての内容がこのPCマザーボードにも適用される。主な違いはいくつかの雑多なポートとコネクタ、そして高パフォーマンスのPCIおよびAGP拡張ポートの存在だ。Via P4M266にはまた、すべてのレガシー周辺機器がLPCマルチI/Oチップによって直接実現されているため、明示的なLPCデバッグコネクタがない。

対比:Xbox対ゲームキューブ

ニンテンドーゲームキューブはXboxと比較すると興味深い。ゲームキューブはXboxと同じ目的——ゲーム——のために設計されたマシンだが、設計思想が大きく異なる。Xboxとゲームキューブはどちらも同じ大まかなアーキテクチャ——CPU、グラフィックスコプロセッサ、メモリ、サポートチップ——を使っているが、類似点はそこで終わる。ゲームキューブの設計は細部とコストへの徹底した注意を示している。ゲームキューブのマザーボードは小型でシンプルで、部品数は最小限に抑えられ、ヒートシンクと熱設計は非常にシンプルだ。ゲームキューブのマザーボードの配線パターンがほぼすっきりとした直線的なレイアウトになっているのは、ほぼすべてのICがゲームキューブ専用にカスタム設計されていることの表れだ。その結果、ゲームキューブはXboxよりもはるかに経済的に製造できるプラットフォームだ。

ゲームキューブの大まかな構成は、任天堂が提供する基本的なマーケティング情報から各チップの機能を推測することで認識できる。ゲームキューブのアーキテクチャのさらなる詳細は推測が難しい。標準的なPCに対応する部品を持たないカスタム部品が多数使われているからだ。マザーボードの配線パターンから、ボードの中央にある大型チップ「Flipperチップ」がPC内の統合グラフィックスノースブリッジチップに相当するものだと推測できる。これはほぼ正しい。重要な違いは、Flipperチップがメモリコントローラとグラフィックスコントローラを1つのパッケージに統合しているにもかかわらず、グラフィックス機能は依然として同じチップの内部に組み込まれた専用メモリを持つという点だ。この構成により、グラフィックスエンジンに非常に高性能なメモリが使用できる。トレードオフとして、チップ外部のメモリを使った場合よりもメモリが少し小さくなる。オンチップメモリの小ささは、極めて高速なチップ外メモリの使用によって部分的に補われている。

ゲームキューブはXboxのようなDDR SDRAMを使用せず、代わりに1-T SRAMと呼ばれるものを使っている。1-T SRAMはSRAM(スタティックRAM)という非常に高速なタイプのメモリをエミュレートするDRAMメモリだ。SRAMはDRAMよりもランダムアクセスのレイテンシがはるかに低く、DRAMのようにすべてのメモリセルを1秒に30回リフレッシュする必要もない。DRAMが高速SRAMとして振る舞えるようにする実際の仕組みはかなり複雑で本書の範囲を超えているが、1-T SRAMメーカーのウェブサイト www.mosys.com で詳細を確認できる。

Figure 2-8: GameCube motherboard plus its power regulator card.図2-8: ゲームキューブのマザーボードと電源レギュレータカード。マザーボードはXboxのマザーボードの約半分のサイズ。

ゲームキューブにはARAMと呼ばれるもう一つのメモリもある。1-T SRAMよりも遅く、高帯域幅のアクセスを必要としないオーディオサンプルなどを格納するために使われる。異種のメモリアーキテクチャを持つことで、ゲームキューブは各サブシステムからより一貫したパフォーマンスを引き出せる。これはフレームラグを最小限に抑える上で重要だ。そのトレードオフとして、ゲームキューブのプログラムがより難しくなる可能性があり、複数のメモリの管理が適切でないとパフォーマンスの問題が生じる可能性がある。

ゲームキューブとXboxのもう一つの重要な違いは、ゲームキューブのXboxよりもはるかに少ない消費電力だ。両コンソールとも電源コンセントに接続して使用するよう設計されているため消費電力は最初は重要に思えないかもしれないが、ゲームキューブの低い電力エンベロープにより、放熱部品が少なく電源も小型で済み、コスト削減につながる。図2-8には参考としてゲームキューブの電源レギュレータの写真が含まれている。電源レギュレータはXboxの電源供給とXboxマザーボード上のローカルスイッチングレギュレータを合わせたものに比べて体積が何分の一かにすぎない。

公平のために、ゲームキューブには小型の外部AC-DC変換器があるのに対して、Xboxは壁のコンセントから直接コンソールに電源を取ることに注意。また電子部品はアレニウス(Arrhenius)の法則が示すように、温度が高いほど急速に劣化する。たとえば、動作温度が摂氏10度上昇すると部品の故障率が約2倍になる。発熱が少なく、熱管理システムもXboxと同等かそれ以上のゲームキューブは、長年にわたってXboxより信頼性が高いはずだ。

最後に、ゲームキューブはあらゆるところで独自のI/Oインターフェースを使っていることは興味深い。ゲームディスクのフォーマットはミニDVDフォーマットで、DVDリーダーは独自のコネクタでマザーボードに接続されている。より小型のDVDメディアを使用することで任天堂はデータ読み出しのシーク遅延を減らし、ゲームのロード時間を短縮している。ゲームコントローラとメモリカードもまた独自のシグナリングフォーマットを使っている。ゲームキューブ内のすべてはおなじみのPCに多少似ているが、設計に変更なしに直接取り込まれたものは何もない。

ゲームキューブの製造性とコストを最適化することに加えて、ほぼ独自のチップと規格を使用することで、コンソールはXboxよりもリバースエンジニアリングがはるかに困難になる。たとえば図2-8を見るとゲームキューブには明らかなROMチップがない。したがって、ゲームキューブのコードを調べ始めるだけでも、マザーボード上のいずれかのチップのどこかに隠されたROMを探し出して取り出さなければならない!これはセキュリティを難読化によって実現することが奏功する数少ない例の一つだ。たとえゲームキューブのセキュリティが全くなかったとしても、任天堂のカスタムDVDフォーマットにコードを書き込むコストと労力は、個人の愛好家にとって割に合わないものだ。

  1. 実際には、SDRAMはパフォーマンス上の理由からメモリアクセスパターンにいくつかの制限がある(ページモードやバーストモードなど)。「ランダム」という名称は、データが厳格な順序規則に基づいてアクセスされるFIFO(First-In, First-Out、先入れ先出し)方式やLIFO(Last-In, First-Out、後入れ先出し)方式のメモリと区別するためのものだ。

*原著*: *Hacking the Xbox: An Introduction to Reverse Engineering* © 2003 Xenatera LLC
*著者*: Andrew "bunnie" Huang | *出版*: No Starch Press
*日本語訳・レビュー*: ニコ技深圳コミュニティ / 高須正和(@tks) — [https://takasumasakazu.net](https://takasumasakazu.net) — CC BY-NC-SA 1.0
*注記*: 本翻訳は、原著の Creative Commons ライセンス条件に従って公開する翻訳コントリビューションであり、著者 bunnie からも歓迎のコメントをいただいています。出版社による公式日本語版ではありません。

ニコ技深圳コミュニティ / 高須正和(@tks)による日本語訳コントリビューションです。著者 bunnie からも歓迎のコメントをいただいています。原著は Andrew 'bunnie' Huang および No Starch Press に帰属します。