HOME >> 書籍・人物 >> 山崎はるかのメモ


PS/PS2 セーブデータのメモ

- 保存したり・いじってみたり -

△メモエリアにもどる


はじめに

 市販ゲームが、「ファミコン(任天堂)」と「PC-9801/9821(NEC)」で席巻されてたころ。
ゲームの改造といえば、P-ROMのバスにPICをジャンパして吸い出すか(FC/SFC)。
あるいはFDの実行用バイナリデータをWizard/V3WEST SIDE)で吸い出す。
いずれの場合も、PC上にて保存したあと、バイトオーダーでいじっていくことを指した。

 PS/PS2とN64全盛のいま。
ゲームの改造といえば、「セーブデータの加工」である。(というか、普通はそうだろう。)

いやもちろん、PSなどでは、正規ディスクでスタートしたあと、改造ディスク(CD-R)に差し替えて ちがったシナリオを実行させるという方法も あるこたある。
セーブデータ改造だけでは表示できない「画像」や「パラメータ」を適用させるのに使うテクニックだが・・・

 普通の人が気軽に 触れるという点では、メモリーカードに書き込まれたセーブデータを、安価な専用機器を使って PC上に吸い出して、いじくって、メモリーカードにもどす。
これだよ、これ。
ゲーム機本体で、その内容を読み込んで開始すれば、いきなりLV.100からスタートだ。

ゲーム改造の是非について -人それぞれでいいだろうよ -

そもそも 「セーブデータの改造」というのは、私は あまり好きではない。
高いカネだして買ってきたゲームを、なんでそうムダに消費できるのよ。
レンタルビデオを、最初の10分から→いきなりラストの30分に早送りするようなものである。
そりゃ もったいないよ。

 ただ、何十回とも やったゲームとなると、少し ハナシがちがってくる。
通常では持ち得ない武器の組み合わせで「どう反応するか」ためしてみたり、あるいは、わざとシナリオをハングアップさせてみて、その後がどう展開するかとか。
(作りかけのシナリオや ボツになったシナリオが出現することもある)

私は、「FF」を3年ぐらい延々 繰り返してやってるようなヤツなので、ホネまでしゃぶりつくしてるだけに、そういう新しい展開は新鮮だ。
卑怯論うんぬんがあっても、「そうでしか見られないシーン」がセーブデータ加工によってのみ見られようになるなら、それは誰でも興味のあることではないか?

そういうわけで、「セーブデータの改造」というのは、法的・倫理的・人間関係的にいろいろ考え方はあると思うが、人それぞれに 事情があるんだから、人それぞれでよいと私は思ってる。

だまってりゃ わからん。

環境について

私の環境は次の通り。

本体:PSまたはPS2

吸出:GAMETECH 「メモリージャグラー(シリアル版) 」
※\3,000でドンキホーテ環七店で買った・通販でもよく売ってる・USB版もある


バイナリエディタ:NON-STANDARD「SFXtypeB
普通はこれ1本でなんとかなる。
※シェアウェアだけどGuestで延々使えるし・・・メインサイトが最近 閉鎖しているみたいなので、カネ払っていいのか・・・

補助エディタ:
c.mos's :「Bz」 バイナリエディタ(フリーウェア) ・・・手早さがいいので
BLACK BOX:「ED(エディー)」・・・評判がよいもんで
Edcom:「Edbin」バイナリエディタ(最近はシェアウェア)・・・古くから使ってるもんで

その他:
Windowsのアクセサリにある『電卓』で 「表示→関数電卓→16進数モード」にして使うと便利

PCはなんでも使うが、私は 特に専用機は準備しない。
ただ改造にはまっているときには、古いノートPCにWindows98SEやWindows2000を入れて 専用機にすることが多い。


PSのセーブデータの注意点(チェックサムやパリティについて)

「PS」のセーブデータは、『チェックサム』や『パリティ』をとって改造(破損)を監視している場合が多い。
そのため、部分的に 数値を改変すると「データが破損しています」と表示されて、実行できない場合がある。

《速習・チェックサム》
たとえば
70 72 6F 62 72 61 6D
というバイト配列があったとしたら、その合計値は「02F3」 (10進数で755)である。
これは 専門的には「横サム」と呼ばれる計算方式で、チェックサムとは、大筋で この合計値の 末尾1バイトのこと。この場合は「F3」である。
システムがデータをセーブする際、メインデータと共に そのチェックサムをとって 一緒に保存しておけば、メインデータが破損・改造を受ければ チェックサムの値と異なるので検出できる。
偶然の合致確率は1/256または1/65536なので 改造プロテクトとしては けっこう実用的。

《速習・パリティ》
パリティとは 偶数・奇数のことである。
プログラミングでは 偶数をEven・奇数をOddとよぶ。
70 72 6F 62 72 61 6D
の合計値は「02F3 (755)」であるから「奇数(Odd)」である。

正確には合計値の末尾1ビットをとるだけでいい。
ここは ビット演算では 数字の「1」をあらわしている部分である。

16進数・2進数の世界は、この末尾1ビットを例外として 基本的に「2の倍数」が足された世界である。
そこに「1」を加算するということは すなわち「奇数(Odd)」である。
したがって、このビットが立っていれば奇数、おりていれば偶数と解釈される。
(専門的には「 And 1 」 を演算しているといえる)

メインデータが破損・改造を受ければ 、パリティ法なら1/2 の確率で検出できる。単独では あまりたいしたことはないが、チェックサムと併用することで 格段に手強くなる。
また 縦パリティなどと呼ばれる手法を併用すると、突破はほとんど困難になってくる。
ハイブリッドプロテクトは いつの時代も 強力だ。

「チェックサム」や「パリティ」の盲点を突く

PS/PS2は UNIXのC言語・gccで作ってるので、このテの演算は そりゃ得意だろう。
だが、いくら ビット演算に強いからといっても 限界がある。あんまり 強いプロテクトをかけすぎると、今度は自分が 正規のセーブを行う際に、苦労する。
正規に保存しても、自己中毒(部分的な破壊)を起こして動かなくなったとしたら、目もあてられん。

 というわけで、「チェックサム」と「パリティ」のみで 改造(破損)プロテクトがかかっている。


「チェックサム」も「パリティ」も 「合計」によって計算されることに注目する。
次の例をみてほしい。

FF 02 05 09 → 計 010F
10進数だと 271
2進数だと 100001111
なので、チェックサムは 0F・パリティはOdd 奇数ということになる。

では 次の配列はどうだろう。
02 FF 05 09 → 計 010F
10進数だと 271
2進数だと 100001111
やっぱり チェックサムは 0F・パリティはOdd 奇数ということになる。

 つまり 「バイト配列の入れ替え」は チェックされないのだ

FF 02 が もしMPや弾数だったとしたら、10進数で766。※
これを
02 FF に逆転するだけで、いきなり 65288 に増えるわけである。
場所を変えるだけだから、チェックはされない。

こういう入れ替え技があることを憶えておくよい。

あっと、ちなみに FF 02 05 09 → 0F F2 05 09 とした場合も、合計値は 010F・チェックサムは 0F・パリティはOdd。
ようするに同じ桁同士の入れ替えでも チェックサムやパリティに影響はない。

※数字は、桁が上がると 左側(←)に文字が増えてゆく。つまり 左端が最大桁である。
しかし コンピュータの世界では数値をバイト表記・つまり文字とした場合、1バイトを1単位として、 下位バイトから 右方向に並ぶ。(文字の横書きと同じ)
つまり 02FF と FF 02 は同じ意味。同じ値。
16進数の間に「空白(スペース)」をきってあるものはバイト表記と考えなければならない。
ややっこしいと思うかもしれないが、Z80-8bit時代からのしきたり。

というか、文章を書くときは 左から右に書くのに、数字だけが 左方向に桁上がりすることのほうが ヘンなんだけどね。我々は その世界で生まれ育っているから違和感を感じないだけだ。
小学1年生の算数のテストの回答を見ると、違和感を感じている子供が多いことを知ることができる。

ちなみに アラビア語は 右から左へ文章を書くので、数字の表記に違和感を感じる子供はいないだろう。

 

「パリティ」だけなら・・・  - もっとかんたん  -

パリティだけしか とっていないシステムなら、合計値すら気にする必要はない。
値をいじって エラーが出たら、それは 合計値が「1多い」か「1少ない」ということだから、どこか1増やすか減らすかすればいいだけだ。

エディタの使い方&選び方

SFXtypeBのように、データリロード時に 値の増減が検索・表示できるエディタがあると便利である。
特に 「値検索」は必須で、ゲーム上の10進パラメータから Windows電卓で16進数に変換したあと、バイト順を逆転して検索をする・・・この一連の作業は よくあることなので、値検索機能は 作業用エディタにかならず必要である。



データ改造に はまってみたもん例

 

「PE2」

買って4年ぐらいたつが、デッドリーモードを越えるとどうなるか見てみたくて ちょっと改造してみた。
チェックサム型である。
おかげで、バイト左右逆転技が使え、BPを爆発的に増やすことができ、売店で売ってる 特殊装備も 堂々と買えた。

アイテム位置アドレッシングではない(アイテムのアドレスが定められていない)ため、装備場所のアドレスに アイテムコードを書き込めば、同種の物品であってもいくつでも所有できる。

武器例(M950)

アドレス 武器コード 着衣場所 所有数 2バイト
043C 82 00 01 00

全体のコツとしては タダでいくらでも入る「9mmパラベラム弾」(武器コード:A0)を使うことか?

武器名 武器コード 着衣場所 所有数 2バイト
9mmパラベラム弾(500発) A0 00 F4 01


所有弾数を減らして、武器コードを ひとつ上げる

武器名

武器コード

着衣場所

所有数 2バイト

9mmヒドラ弾(499発)の場合 A1 00 F3 01
9mmスパルタン弾(498発)の場合 A2 00 F2 01

一度 改造して リスタート(再開)すると、パラベラム弾が 他の弾に変化しているから、またパラベラム弾を取ることができる。これを繰り返す。


応用としては こういうのがある。
プロテイン(武器コード 3C)を、まっさら(00 00 00 00)に出現させたいとする。
プロテイン1個のコード配列は(3C 00 01 00)であるから、合計値は 3D となる。
すると パラベラム弾の弾数を減らして こういうことができる。

武器名 武器コード 着衣場所 所有数 2バイト
9mmパラベラム弾(500発) A0 00 F4 01


弾数を61発(3D)減らして、プロテインを作る

武器名

武器コード

着衣場所

所有数 2バイト

9mmパラベラム弾(439発) A0 00 B7 01
プロテイン(1個) 3C 00 01 00

弾が減ったあとは また補充すればよい。これを繰り返す。

16進数の計算は、アタマがこんがらがるので、慣れてる人でも なるべくアクセサリの関数電卓を使うこと。
一度でも まちがえて 破壊状態にすると、もとに戻すのがたいへんだ。

-

なお武器コードについては、アドレッシングこそ異なるが、一般保護違反!の「改造コード」に PE2含めて一覧されている。たいへん便利だ。

 

FFT

「ホントにあれが 正しいラストなのか?」
・・・というか、ガンダムおた風な展開のこのゲームは、やってる当時から、いまひとつ 私はピンとこなかったので、真相が知りたかった。
ある種 こころに残りつづけているゲームで、いろいろ試してみることにした。


サムをとっているところもあるようだが、原則として パリティが中心。
つまり、エラーが出ても 1増減で ぴっちり ハマる。

19B4 付近にクレジット(おかね)がある。パリティ方式だから、いまの値に 2の倍数(偶数)を入れればよい。
奇数に奇数を加えると 偶数である。
だが奇数に「偶数」を加えても奇数のまま。偶数に「偶数」を加えても偶数のまま。
だから パリティをとってるっぽいゲームは 2とか4とかを加えると安全なわけだ。
偶数パリティのゲームは その逆で 奇数を足すことになるが・・・

いずれの方式にしろ  エラーが出たら 1増減するだから 神経質にならなくてもいい。


なお このゲームは「アイテム位置アドレッシング制」(アイテムの数を管理するアドレスが決まっている)のため、アイテムの出現は「0→1」にすることであり、増やすのは それを「1→x」にすることである。
どのアイテムが どのアドレスに対応しているかわかれば 後は早い。
とりあえず 全部 01 で埋めればいいのかもしれんが、アイテム位置は サムをとっているので、どれかを減らして どれかを増やす という方式が安全だ。


おしまいに

ゲームだって 中身をハッキングしていると、いろいろ覚えることができる。
特に パリティ慣れしてると、他のジャンルで力を発揮できる。

あっと、メモエリアなんだよ ここは。
結果が ヘンなことになっても、苦情はいわないでね・・・

(2003/01/18・山崎はるか)


■メモエリアに戻る