SaveWizardおよびセーブエディターにおけるPS4コード形式の意味と説明

Save Wizard for PS4 MAXは、改造されていないPS4/PS5本体でも使用可能な、セーブデータの編集・複合・暗号化ツールです。PS4ゲームのセーブデータを強力に編集できるツールとして知られています。同様のツールには、過去にCYBERセーブエディターやXploderなども存在しました。
セーブウィザードは、USBメモリを使用してセーブデータをやり取りします。基本的な改造手順は、PS4本体からセーブデータをUSBメモリにコピーし、PC上のツールで編集後、再び本体に戻すというものです。この過程で「パッチコード」と呼ばれる改造コードの記述が重要となります。SaveWizardには既存のコードや追加したパッチコードを使用する、「シンプルモード」と、中身を開きバイナリを表示し編集する「アドバンスモード」の2つがあります。そのアドバンスモードですが、ゲームセーブデータ容量が大きすぎたり、オンライン要素のあるゲームではアドバンスモードが開放されないこともあります。
Save Wizardは以前のプロアクションリプレイに類似していますが、オンラインでライセンスを購入し、ツールをダウンロードして認証する形式を採用しています。セーブウィザードによって、通常では不可能なゲームプレイを楽しむなどができます。
セーブデータの書き換えはサーバーを介して行われるため、将来的にサポートが終了すれば利用できなくなる可能性があります(※CYBERセーブエディターは現在、販売及びサポートが終了済み)。
また、セーブデータに保存される情報のみを編集するため、実行中のプログラムへの割り込みはできません。つまり、経験値n倍や〇〇減らないといったリアルタイムのチート効果は得られないわけです。
PS4セーブデータ改造ツールで使用されるコード形式は、ゲームのセーブデータを直接操作するための独自の記述方法を採用しており、特定のメモリアドレスを指定してデータを書き換えることでゲーム内パラメーターを改変します。
この記事では、SaveWizardで使用されるコード形式について詳しく解説します。よく使用されるのは、「0コード、1コード、2コード、4コード」ですね。アドレス変動タイプのセーブデータでは「8コード」もよく使われます。
目次
0コード:8ビット(1バイト)通常書き込みコード
0BYYYYYY 000000XX
B = オフセットタイプ (0=デフォルト, 8=ポインターからのオフセット)
Y = アドレス
X = 書き込むバイト
例:
00001234 00000063
アドレス0x1234に値0x63を書き込みます。
1コード:16ビット(2バイト)通常書き込みコード
1BYYYYYY 0000XXXX
B = オフセットタイプ (0=デフォルト, 8=ポインターからのオフセット)
Y = アドレス
X = 書き込むバイト
例:
10005678 0000270F
アドレス0x5678に値0x270Fを書き込みます。
2コード:32ビット(4バイト)通常書き込みコード
2BYYYYYY XXXXXXXX
B = オフセットタイプ (0=デフォルト, 8=ポインターからのオフセット)
Y = アドレス
X = 書き込むバイト
例:
20009ABC 05F5E0FF
アドレス0x9ABCに値0x05F5E0FFを書き込みます。
3コード:加算・減算コード
3BYYYYYY XXXXXXXX
B = バイト値 & オフセットタイプ
(0 = 1バイト加算)
(1 = 2バイト加算)
(2 = 4バイト加算)
(3 = 8バイト加算)
(4 = 1バイト減算)
(5 = 2バイト減算)
(6 = 4バイト減算)
(7 = 8バイト減算)
(8 = ポインターからのオフセット; 1バイト加算)
(9 = ポインターからのオフセット; 2バイト加算)
(A = ポインターからのオフセット; 4バイト加算)
(B = ポインターからのオフセット; 8バイト加算)
(C = ポインターからのオフセット; 1バイト減算)
(D = ポインターからのオフセット; 2バイト減算)
(E = ポインターからのオフセット; 4バイト減算)
(F = ポインターからのオフセット; 8バイト減算)
Y = アドレス
X = 加算/減算するバイト
例:
31003E3D 0000112A
2バイト分の値を指定し、アドレス0x3E3Dに値0x112Aを加算します。8バイト値タイプの場合、4バイトのデータが書き込まれますが、それ以上書き込めない場合はその後もバイトの書き込みが続行されます。
4コード:連続書き込みコード
4BYYYYYY XXXXXXXX
4CCCDDDD ZZZZZZZZ
B = バイト値とオフセットタイプ
(0 = 1バイト)
(1 = 2バイト)
(2 = 4バイト)
(8 = ポインターからのオフセット1バイト)
(9 = ポインターからのオフセット2バイト)
(A = ポインターからのオフセット4バイト)
Y = 開始アドレス
X = 書き込むバイト(初期値)
C = 書き込みを繰り返す回数
D = 書き込みごとにアドレスに加算する値(アドレスオフセット)
Z = 書き込みごとに値に加算する値
例:
41004500 00000063
4004000C 00000002
アドレス0x4500から書き込み開始。書き込みごとに0xC(12)バイト離れたアドレスに値0x63を書き込み、書き込みごとに値を2ずつ増加。それを4回繰り返します。いわゆるシリアルコードと呼ばれる形式です。
5コード:バイトコピーコード
5BYYYYYY XXXXXXXX
5BZZZZZZ 00000000
B = オフセットタイプ (0=デフォルト, 8=ポインターからのオフセット)
Y = コピー元のバイトアドレス
X = コピーするバイト数
Z = ペースト先(コピー先)のアドレス
例:
500000A1 00000004
500000C1 00000000
アドレス0xA1から4バイト分のデータをコピーし、アドレス0xC1にペーストします。
7コード:比較書き込みコード
7BYYYYYY XXXXXXXX
B = バイト値&オフセットタイプ&比較条件
(0 = 指定値以上(≧): 1バイト)
(1 = 指定値以上 (≧): 2バイト)
(2 = 指定値以上 (≧): 4バイト)
(4 = 指定値以下 (≦): 1バイト)
(5 = 指定値以下 (≦): 2バイト)
(6 = 指定値以下 (≦): 4バイト)
(8 = ポインターからのオフセット; 指定値以上 (≧): 1バイト)
(9 = ポインターからのオフセット; 指定値以上 (≧): 2バイト)
(A = ポインターからのオフセット; 指定値以上 (≧): 4バイト)
(C = ポインターからのオフセット; 指定値以下 (≦): 1バイト)
(D = ポインターからのオフセット; 指定値以下 (≦): 2バイト)
(E = ポインターからのオフセット; 指定値以下 (≦): 4バイト)
Y = アドレス
X = 書き込むバイト(比較対象の値)
このコードは標準の書き込みコードと同様ですが、指定したアドレスの現在の値が X で指定された値以上(No Less Than の場合)または以下(No More Than の場合)である場合にのみバイトを書き込みます。例えば、「指定値以上 (No Less Than)」を使用すると、アドレスの値が X より大きい状態を実現できます。もし、そのアドレスの値がすでにコードで指定された値よりも大きい場合は、このコードは何の効果ももたらしません。
8コード:前方バイト検索コード
8BCCYYYY XXXXXXXX
*(このコードの後には他のコードが続きます)*
B = オフセットタイプ (0=デフォルト, 8=ポインターからのオフセット)
C = ポインタを設定するまでに見つける回数(例: 1なら最初に見つかった場所)
Y = 検索するバイト数(例: 1 = 1バイト、2 = 2バイト)
X = 検索するバイト列
例:
80010002 01B00117
28000010 7FFFFFFF
01B00117という2バイトの並びが最初に見つかったアドレスが、後のコードで使用するためのポインタとして設定されます。
そして見つかったアドレス(ポインタ)から10バイトずれたアドレスに、値0x7FFFFFFFを書き込みます。
このコードは、指定したバイト列を前方に向かって検索し、見つかったアドレスを基準(ポインタ)として設定します。その後、設定されたポインタからの相対的なオフセットを使用して他のコード(主に書き込みコード)を実行するために使用されます。
9コード:ポインター操作コード
9Y000000 XXXXXXXX
Y = 操作タイプ
(0 = ポインターをXXXXXXXXのビッグエンディアン値に設定)
(1 = ポインターをXXXXXXXXのリトルエンディアン値に設定)
(2 = ポインターにXを加算)
(3 = ポインターからXを減算)
(4 = ポインターをファイル末尾に設定し、そこからXを減算)
(5 = ポインターをXの値に設定)
X = 設定/変更する値
このコードは、検索後にポインターをオフセットしたり、書き込み前にポインターを設定したりするために一般的に使用されます。
Aコード:一括書き込みコード(Bulk Write)
ABYYYYYY XXXXXXXX
ZZZZZZZZ ZZZZZZZZ
…
(書き込むデータZZZZZZZZが複数行にわたる場合)
B = オフセットタイプ (0=デフォルト, 8=ポインターからのオフセット)
Y = 書き込み開始アドレス(オフセットタイプ8の場合は、ポインタからのオフセット値)
X = 書き込む合計バイト数
Z = 書き込むバイト列
例:
A0004510 00000010
11223344 55667788
99AABBCC DDEEFF00
アドレス 0x004510 から始まる16バイトの領域に、バイト列 「11223344 55667788 99AABBCC DDEEFF00」 が一括で書き込まれます。
このコードは、指定したアドレスから連続した領域に、まとまった量のデータ(バイト列)を一括で書き込むために使用されます。
Bコード:後方バイト検索コード
コードタイプ B:後方バイト検索
BBCCYYYY XXXXXXXX
*(このコードの後には、特定のオフセットタイプ(特にタイプ8)を使用した他のコードが続きます)*
B = オフセットタイプ (0=デフォルト, 8=ポインターからのオフセット)
C = ポインターが設定されるまでに見つける回数
Y = 検索するバイト数(例: 1 = 1バイト、2 = 2バイト)
X = 検索するバイト列
このコードはコードタイプ8と同様に機能しますが、代わりにファイル(またはポインタ)の末尾から後方に向かって検索します。
Cコード:オフセットバイト検索コード
CBFFYYYY XXXXXXXX
*(このコードの後には、特定のオフセットタイプ(特にタイプ8)を使用した他のコードが続きます)*
B = オフセットタイプ & 検索方向
(0 = 指定アドレスから前方へ検索)
(4 = 指定アドレスから後方へ検索)
(8 = ポインタからのオフセット; 指定アドレスから前方へ検索)
(C = ポインタからのオフセット; 指定アドレスから後方へ検索)
F = ポインターが設定されるまでに見つける回数
Y = アドレスから検索するバイト数(例: 1 = 1バイト、2 = 2バイト)
X = 検索に使用するバイト列が格納されているアドレス
このコードは8コードやBコードのように、あらかじめ与えられたバイト列を検索するのではなく、代わりに特定のアドレスにあるバイト列を使用して検索を行います。
まとめ
Save Wizardの運営元はパッチコードの形式を公式には公開していません。上記で紹介したコード形式の大部分は、過去10年以上にわたりユーザーコミュニティによって発見され、リバースエンジニアリングされたものです。現在も海外フォーラムなどを中心に、セーブデータの解析や新たなコードタイプの発見に向けた活動が続けられています。
Save Wizardが提供する既存コードの適用は比較的簡単ですが、独自でパッチコードを作成・理解するには、セーブデータの構造解析に関する専門知識が不可欠です。
必須となる基礎知識
16進数(16進法)の理解と計算
エンディアン(バイトオーダー)の概念
メモリアドレスの特定方法
バイナリエディタ(Save Wizardのアドバンスモードなど)の使用方法
16進数変換ツールの活用
メモリ構造の解析スキル
PS4のセーブデータは暗号化されているため、コードの解析や作成を行うには、Save Wizardによって復号化された状態のデータをアドバンスモード(バイナリ)で確認する必要があります。
PPS3のセーブデータとは異なり、S4セーブデータの大半はリトルエンディアン形式を採用しています。Save Wizardはこの形式に合わせて、コードのデータ値を書き込む際に自動的にバイト順を反転させています。例えば、コードに 「12345678」 と記述すると、実際には 「78 56 34 12」 としてデータに書き込まれるわけです(4バイトの場合)。
以下のコードタイプの特定部分については、バイト順の自動変換は行われません。
- ポインタ検索コード(タイプ 8, B, C): 検索対象として指定するバイト列 (X の部分)
- 一括書き込みコード(タイプ A): 書き込むデータとして指定するバイト列 (Z の部分)
<利用上の注意点とリスク>
- セーブデータ破損の可能性
コードの記述ミスや不適切な編集は、セーブデータを破損させる可能性があります。例えば「ゲームがロードされない」場合は、セーブデータが破損している可能性が高いです。コードを適用する前には、必ずセーブデータのバックアップを作成してください。Save Wizardは適用時に自動でバックアップを作成しますが、万が一に備え、特に自作のパッチコード適用前には手動でのバックアップを推奨します。 - 実行順序について
ポインタオフセットを使用するコード(タイプ8, B, Cなど)と通常の書き込みコードを併用する場合、コードが実行される順序が結果に影響するため、注意が必要です。 - バグや互換性の問題
自作コードや非公式コードの使用は、予期せぬゲーム内のバグを引き起こすことがあります。ゲーム中に「ブルースクリーンでアプリケーションエラー」が発生している場合がそれです。さらに、ゲームのバージョンアップデートにより、セーブデータ内のメモリアドレスが変更されると、既存のコードが機能しなくなる場合もあります。 - オンライン利用規約違反
オンライン機能を持つゲームで改造されたセーブデータを使用することは、多くの場合でサービス利用規約に違反し、アカウント停止などのペナルティを受けるリスクがあります。
おすすめ記事
コメント
この記事へのトラックバックはありません。
この記事へのコメントはありません。