Dendy Gamesのハッキング。 ロードファイターの例について

Dendyゲームコンソールのおもちゃのハッキングの原理についてお話したいと思います(Nintendo Entertainment System、Famicom、100,500の中国のクローン、以降NESと略します)。

ゲームのハッキング(またはむしろ改造、ただし「ROMハッキング」という用語はエミューシーンではより一般的です)は、ゲームコードを部分的に分解し、独自の小さなコードを記述することで構成されます。 基本的に、ROMハッキングは通常の「クラッキング」プログラムやゲームのトレーナーを書くこととほとんど変わりません。

被害者は、ロードファイターの1つである9999999のマルチゲームの中国のカートリッジが頻繁に使用する小さなおもちゃです。



これは非常に単純なレースであり、スペースをほとんど消費せず、実験に最適です。 このゲームでは、画面上で車を左右にのみ動かすことができます。 Gameplaynoは正当化されますが、もっと何かが欲しいです。 最初に、レーシングカーを前後に動かす機能を紹介します。

それで、これに必要なもの:

ラムファイルとコンパイラは、記事の最後にあるリンクから取得できます。



ツールと準備自体が揃っていれば、NESコンソールのアーキテクチャの複雑さの一部を理解するのに害はありません。 プロセッサとセットトップボックスの両方のドキュメントで十分なので、要点のみを簡単に説明します。 テキストの次の段落はスキップできます。

6502プロセッサは8ビットですが、16ビットのアドレスバスがあり、アドレス範囲0h〜FFFFhで動作できます。 この場合、最初の7FFhバイト(2KB)がRAMに割り当てられ、特定の事柄が実行され、8000h-FFFFh(32KB)の範囲がコード自体に割り当てられます。 ゲームコードが指定されたボリュームに収まらない場合、特別なメカニズム「マッパー」が使用されます。 マッパーには、プロセッサのアドレス空間でコードのセクションを切り替える機能があります。 つまり、コードのあるセクションを別のセクションに一時的に置き換え、必要なデータをロードします...マッパーは16 KBのメモリブロック(「バンク」)で動作します。 技術的には、マッパーはカートリッジボード上のマイクロチップであり、ROMファイル自体には反映されません。



ステップ番号1。 ROMファイルを拡張します。



そのため、FCEUXエミュレーターを起動し、患者を読み込み、[ヘルプ]-> [メッセージログ]メニューに移動します。

次のようなものが表示されます。



PRG ROM: 1 x 16KiB

CHR ROM: 1 x 8KiB

..

Mapper #: 0

..








Rum Road Fighterの容量は24KBで、そのうち16KBはPRG-ROM(コードとデータ)に、8KBはCHR-ROM(グラフィックス)に割り当てられ、ゼロマッパーも使用します(つまり、マッパーはありません)。 ご覧のとおり、ROMは別の16KBメモリバンクを追加することで簡単に拡張できます。 これは、コードを追加するために必要です。

最初に、[デバッグ]メニューから組み込みのHex Editorを開きます。 住所$ 8000に移動してから、住所$ C000に移動すると、同じデータが含まれていることがわかります。 さらに、データは$ 8000〜$ C000の範囲でミラーリングされます(この範囲にブリックポイントを設定すると簡単に確認できますが、機能しません)。 次に、任意の16進エディタでROMを開き、ヘッダーを編集します。次の形式があります。



0-3 "NES^Z" "^Z" = 0x1A

4 16 PRG.

5 8 CHR.

6 7-4 4 - ROM.

- 3 1 4- VRAM.

- 2 1 512- $7000-$71FF.

- 1 1 SRAM $6000-$7FFF.

- 0 1 , 0 .

7 7-4 4 ROM.

- 3-1 , 0!

- 0 1 VS.

8 8 RAM.

- .NES, 1x8 RAM

- 0.

9 7-1 , 0.

- 0 1 PAL, NTSC.

10-15 , 0!








PRGバンクの数を2に設定しました。 次に、ファイルに、ヘッダーの直後にサイズが16KB(4000h)の空のブロックを挿入します(ただし、上書きしないでください)。 これで、ファイルの重量は40KBになります。



ステップ2。 データを探しています。



ここで、車のY座標を担当するRAM内のセルと、キーコードが押されたセルを見つける必要があります。 これは、エミュレータに組み込まれているRAM検索ツール([ツール]メニュー)を使用して実行できます。 この場合、エミュレータHEXエディターを実行し、最初の100hバイトを目で見るだけで十分です。 プロセッサには、この範囲にすばやくアクセスするための特別な「短い命令」があるため、よく使用されるデータはここにあります。 エミュレーターのメインウィンドウとHex Editorウィンドウを同時に開き、「left / right」を押すと(コントロールの構成を忘れないでください)、それに応じていくつかのセルが変化することがわかります。 07h-キーコードと65h-X座標が必要です。Y座標がX座標の隣にあると仮定し、セル66hを任意の数値に変更し、出来上がり-車がY軸に沿って移動しますC8h、燃料の量を保存します。



ステップ3。 コードを挿入し、スタブを配置します。



必要な変数のアドレスを知っていれば、すでにコードを書くことができますが、今のところどこから呼び出すのかわかりません。 ブリックポイントをレコードのセル65h(16進数のコンテキストメニューまたはデバッガーを使用)に配置し、ゲーム内を左右に移動すると、次のコードでデバッガーウィンドウが開きます。



01:D52B:E6 65 INC $0065 = #$64

01:D52D:60 RTS

01:D52E:C6 65 DEC $0065 = #$64

01:D530:60 RTS








デバッガーは時々コマンドを誤って無効にします。そのため、デバッガーウィンドウを上にスクロールすると、一部のコマンドが正しく表示されません。 コードを少し上にスクロールするか、RTSにステップバイステップでアクセスして、キーコードをチェックする手順とその後の自動車の動きが呼び出されるアドレスに移動します。



01:D4D0:20 D9 D4 JSR $D4D9

01:D4D3:20 E1 D4 JSR $D4E1

01:D4D6:4C E9 D4 JMP $D4E9








JSR $ D4D9をプロシージャコール-JSR $ 8000に置き換えます。 これを行うには、コマンドアドレスの左側にあるストリップをクリックして、インラインアセンブラで目的のコマンドを実行します。 ステップバイステップのデバッグを使用して、アドレス$ 8000に移動し、スタブをカットJSRおよび手順からの後続のRTSの形式で配置します。



00:8000:20 D9 D4 JSR $D4D9

00:8003:60 RTS








ステップ番号4。 コードを書き、ROMに挿入します。



テキストファイルRoadFighter.asmを作成し、そのような単純なコードを入力します。



$=$8000



LDA $07

AND #$04

BEQ checkUp

BNE backward:



checkUp:

LDA $0007

AND #$08

BEQ exitInject



forward:

LDA $66

CMP #$50 ;

BMI exitInject

DEC $0066

JMP exitInject



backward:

LDA $66

CMP #$B0

BPL exitInject

INC $0066



exitInject:

JSR $D4D9

RTS








ここで、パラメーター「-l roadFighter」を使用してコンパイラーを実行します。 出力はリストファイルとバイナリになります。 バイナリを開き、その内容をオフセット10hでROM Road Fighterにコピーします。



ステップ5。 フィニ・タ・ラ



すべてが正しく行われ、エミュレータで変更されたROMを実行すると、レースカーを前後に移動できるようになります。したがって、トラック上ではなく、無害な車をプッシュする方が便利です(そして破壊のためにポイントが与えられます!)。

コンパイラ、ソース、元のラム、変更されたラムを使用したアーカイブ-RoadFighterModSource.zip (人々)

RoadFighterModSource.zip (megaupload)




All Articles