2011年10月14日の日記を表示中

2011年10月14日 (金)

スパIIX電池レス化

ドイさんがCPS2の電池レス化に挑戦し始めたのを見ていたら,自分も再度挑んでみたくなり,以前より考えていた補助ツールを作成して参戦してみることにしました.

補助ツールと言っても大したものではなく,バイナリを16Byte単位で見て,それが命令かデータかを推定するだけのものです.推定の判断基準は,16進数表示した際の「0」の数とか,ASCIIコード範囲の値の出現率とか,同じ数値の出現率とかそういうの.

前にもどっかで書きましたが,CPS2のプログラムは,命令として実行される部分が暗号化された状態でROMに書き込まれています (というか,命令としてROMにアクセスした場合に,読み出した値を復号化し,それ以外の場合には読み出した値そのものを使うようになっている).電池が切れると,復号キーや復号範囲も消えてしまうため,この状態で無理矢理ゲームを動かすには,ROM上の命令部分のみを復号化してあげなければなりません.

復号化のルーチン自体は,既に海外の凄い人が解析していて,MAMEなどにも組み込まれていますが,どこが命令として実行され,どこがデータとして読み出される領域なのかは,実際にプログラムを動かしてみないとわからない部分があるため,静的な情報は存在していないようです.

そこで,CPS2の電池レス化は「どこが命令でどこがデータなのかを明確に切り分ける」という作業を最初に行うことになります (細かいことを言うと,ROMチェックの処理では命令部分をデータとして読み出したりもするはずなので,理論上明確に定まらない部分があったりもするのですが・・・).前置きが長くなりましたが,今回作った補助ツールは,それをある程度自動で推定してくれるものになります.

CPS2のプログラムの暗号化処理は結構気合いが入った処理をしているお陰で,暗号化された状態の命令部分は非常にランダム性が高くなります.一方で,これを復号化した場合,68000の機械語の羅列になるので,同じような16進数が何度も出て来たり,ゼロが多数出現したりするようになり,ランダム性が大幅に低下します.また,データ領域は最初から暗号化されていないため,同じ数が何度も続いたり,ASCIIな値が並んでいたりと,元々規則性が高い状態となっており,逆にこれを無理矢理復号化すると,非常にランダム性が高い状態となります.

そんなわけで,プログラムを逆アセンブルしたり,実行時のトレースを利用したりしなくても,まったく復号化していない状態においてランダム性の低いデータの並びを示している部分がデータ領域で,逆に全体を復号化した際にランダム性の低いデータの並びとなっている部分が命令部分という風に,それなりに領域を推定できることになります.補助ツールでは,この特性を利用して命令とデータの境界を大雑把に推定します.

まあ,理屈はこんな感じなんですが,実際にこれがうまく機能するのか,ひとまず,推定の条件を適当に決めて,以前手作業で電池レス化を済ませたヴァンパイアセイヴァー2のプログラムROMを入力して確認してみました.結果,前の方の数領域に関して,見事に実際の境界と同じところが抽出できました.ふむ,これはなかなか使えそうです.

それでは次に,未知のプログラムに対して適用してみたいと思います.今回対象とするのはスパIIX.某キッチン戦士が電池交換をミスって電池切れさせちゃったやつです.

電池切れスパIIX

開けてみたところ,交換した電池がついたままの状態でした.あー,この交換方式は,美しいんですが,失敗する可能性が・・・.

電池が残っていた

一応念のため,電池切れチェッカーを動かしてみましたが,やっぱり電池切れでしたw

死亡確認w

というわけで,補助ツールを使っての電池レス化を開始・・・.って,スパIIXは先頭の4MByteが暗号化対象範囲なのかよ・・・.広いだろ(;´Д`).しかもROMの中身を見ると,先頭3MByteくらいまでは命令が入ってるっぽいし.ヴァンパイアセイヴァー2よりはるかに大変そうですなこりゃ・・・.今週末で終わるかな・・・.

[コメントを書く]

Doi 2011/10/19(水) 01:28:22
CPS2の電池レス化って傍から見ると格好良いですが
やる事って凄い地味ですね・・・遠い目

とりあえず、自分はココら辺りは絶対に大丈夫と言う
文字が並んでるデータ部意外は、動いてる状態でWP READ仕掛けて
読み込んだ部分を抽出する方法でやって見たいとおもいます。

2011年10月14日の日記を表示中

中の人情報

名前:
nosuke (のすけ)
メール:
sasugaanijaのgmail.com
「の」は「@」みたいな
関連リンク:

カレンダー

2011年10月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          

<<先月分

翌月分>>

最新の10件のエントリ

最近の10件のコメント

過去ログ