ゲーム改造の基本

ここでRPCS3でゲームを改造して学んだすべての知識をダンプします。

チートエンジンとは何ですか?

Cheat Engineは、Eric Heijnenが作成した無料のメモリスキャナー/ Hexエディター/デバッガーです。

基本的には、プログラムのメモリを調べて、ある程度はその背後にあるコードを調べることができます。 また、編集したい特定の記憶を検索できます。

How コンピューターはどのようにデータ(メモリ)を保存しますか

コンピューターは0と1の集まりで構成されていることを既に知っています。 しかし、これらの0と1はどのようにメモリに保存されますか? 答えは、コンピューターがこれらの0と1の8つを組み合わせて1バイト(16進数)になることです。

これを理解する最も簡単な方法は、Windows 10で電卓を使用し、プログラマモードに変更して、さまざまなオプションを表示することです。 最上部は16進値(00からFF)を表す16進数、2番目は10進値(通常の数字)を表す12進数、最後は2進数値(0と1)を表すBinaryです。

たとえば、 今はあなたのユニットのHP值が60です。ただし、コンピューターでは、60としてではなく、 16進形式で3Cとしてメモリに表示されます。 バイナリ値に関しては、現時点では重要ではありませんが、頭の後ろに保管してください。

バイト、2バイト、4バイト

バイトは2桁で構成されます。最初の数字は最初の4 桁 バイナリを表し、2番目の数字は最後の4桁を表します。たとえば、3Cの3はバイナリで0011で表され、Cは1100で表されます。

バイトの1桁の範囲は0から9で、9を超えるとAからFに続きます。したがって、1バイトの最大値はFF、それとも10進数で255です。 じゃ、255より大きい数値を保存したい場合はどうするか? 答えは、最初のバイトの横に別のバイトを追加して、2バイトにする。 たとえば、256は01 00と表示されます。16桁の2進数があり、各8桁が1バイトを表します。 (01の0は電卓に表示されません)

同じロジックに従って、2バイトに保存できる最大値はFF FF、または65,535、4バイトの最大値はFF FF FF FF、または4,294,967,295(場合によっては7F FF FF FF)です。

4バイトのバイナリで桁数を数えると、32桁になります。 コンピューターの32ビットシステムの由来はこれです。 同様に、64ビットシステムは8バイトシステムを使用します。

RPCS3は可能な限り適切に実際のPS3をエミュレートする。 RPCS3は64ビットアプリケーションですが、ただし、本体PS3は32ビットで実行されるため、ゲーム内のデータのほとんどは4バイトシステムに格納されます。

上記は、Cheat Engineのメモリビューアでメモリがどのように表示されるかの例です。 ご覧のとおり、私のユニットのHPは現在60はでありますが、システム中に00 00 00 3C表します 。

浮動小数点数

システムが値に小数点を使用する場合はどうなりますか? その答えはフロート(浮動小数点数)です。

Windows 10の計算機では、hexをfloatに変換することはできないため、外部プログラムまたはWebサイトを使用して実行する必要があります。 https://gregstoll.com/~gregstoll/floattohex/

常に4バイトの長さであるという事実以外に、浮動小数点数について言うことはあまりありません。 ここでは、ゲームメモリに表示される最も一般的な浮動小数点数をリストします。

1.00 – 3F 80 00 00

1.50 – 3F C0 00 00

2.00 – 40 00 00 00

50.00 – 42 48 00 00

100.00 – 42 C8 00 00

ゲームでフロートを使用する最も簡単な例は、EX ゲージ値です。 50.00 (42 48 00 00) では、ゲージが半分いっぱいになり、100.00(42 C8 00 00)では、ゲージがいっぱいになります。

浮動小数点と通常の値の違い

3F 80 00 00が1,065,353,216ではなく1.00として扱われない理由について混乱するかもしれません。 私があなたに与えることができる唯一の答えは、それがシステムが事前に知っていることであるということです。 4バイトがすぐに値であるかフロートであるかを知ることは不可能であり、テストする唯一の方法は、値を実際に編集し、システムは奇妙な動作をするかどうかを確認することです。 ただし、通常は、 1,065,353,216 (3F 80 00 00)な値を使用しません 。したがって、最初のバイトに3Fまたは40が表示されている場合、この4バイトは浮動小数点値かもしれません。

ビッグエンディアンとスモールエンディアン

ほとんどの場合、エミュレーターはビッグエンディアンです。 なぜそうなのか詳細はわかりませんが、エンディアネスの概念は簡単に理解できます。 基本的には、左から右または右から左に読むことと考えてください。 スモールエンディアンとビッグエンディアンの違いは、バイトの配置方法です。 エンディアネス変換するには、バイトの位置を入れ替えるだけです。

たとえば、ゲームでは10,000の値があり、4バイトの16進数で00 00 27 10で表されます。 RPCS3はビッグエンディアンであるため、スモールエンディアンに変換するには10 27 00 00になります。 バイト位置がどのようにスワップされるかを見てください。ビッグエンディアン値をスモールエンディアンとして解釈する場合、異なる値を意味します。この場合、10,000(00 00 27 10)は270,991,360(10 27 00 00)になります。

しかし、これはメモリの編集にどのように影響しますか? Cheat Engineはデフォルトでスモールエンディアンをサポートしているため、ゲーム内の値の検索を開始する前に、新しいカスタムタイプの値タイプをCheat Engineに追加する必要があります。 セットアップについては、 このチュートリアルに従ってください。 

チュートリアルは英語なので、添付したリンクはページのGoogle翻訳です。
ただし、Google翻訳の形式が間違っているため、英語版のビッグエンディアンコードをコピーしてください

また、LUA関数を使用する場合は、常にスモールエンディアンで返されます。これは、前後に変換する必要があるため、問題になる可能性があります。 さらに、RPCS3の以前のバージョンでは、すべてのバイトがスモールエンディアンに配置され、すべてのバイト位置がスワップされるため、Cheat Engineのメモリビューアーを調べるのは苦痛になります。 ただし、 0.0.6RPCS3の以降のバージョンは メモリビューアの正しいエンディアンに示されています。 (このチュートリアルのスクリーンショットはすべて0.06-8231 バージョンで作成されています)

メモリアドレス

ここでメモリのインデックス方法について説明します。

メモリアドレスは、その名前が示すように、メモリ内の各バイトに割り当てられたアドレス値です。 バイトを家と考え、それぞれにアドレスを添付します。 アドレスは本質的に16進数です。

上記のヘルスの例に戻り、メモリビューアの左側、341DF0164を見てください。 これが最初のバイトのアドレスであり、00です。各バイトのメモリアドレスはリストします:

341DF0164 – 00

341DF0165 – 00

341DF0166 – 00

341DF0167 – 3C

A それによって、次のバイト341DF0168は2番目の4バイトの新しい開始バイトになります。

簡単ですよね? ここが難しい部分です:正しいのメモリアドレスを検索する。 ヘルス値が341DF0164から341DF0167のメモリ領域のみを占有していることに気付いたかもしれません。これは、9桁の大きな16進アドレスの4バイトにすぎません。言い換えると、メモリアドレスは大きすぎて1つずつ調べることができません。つまり、最大の課題は、必要な関連アドレスを検索することであり、簡単ではありません。

幸いなことに、Cheat Engineの検索機能があります。これは、メモリの編集を行う前に不可欠なステップです。

実際のPS3とRPCS3の違い

検索の詳細に入る前に、PS3とRPCS3のメモリアドレスの違いについて説明したいと思います。

RPCS3はエミュレータであるため、ps3をエミュレートしようとしており、エミュレーションを行うには元のメモリアドレスが必要です。そこで、 PS3の元のゲームメモリアドレスは他の場所に移動されます 。 フルブの場合、30000000に移動します。 RPCS3は、元のPS3アドレスにもう1桁を追加して、エミュレートしやすくし、コードの混乱を防ぎました。

わかりにくいかもしれませんので、例を挙げましょう。 ここでは、PS3用に開発されたWhitelordのBoss CPUチートコードを選択してみましょう。

アーケード/ MSモードボスセレクター
00002000 40AF402C 000138D1

00002000 =指定されたメモリアドレスに指定されたバイトを書き込む

40AF402C =書き込まれるメモリアドレス

000138D1 =書き込むバイト

このコード行は、Destroy GundamとEX-Sを交換するために、000138D1の値を40AF402Cのメモリアドレスに書き込もうとしています。

ただし、RPCS3では、40AF402Cアドレスの値を変更すると、 Destroy GundamとEX-Sを交換しない。システムは実際に40AF402Cアドレスを300000000シフトします。40AF402C と 300000000 加えれば 340AF402C になります。

RPCS3はPS3に割り当てられたメモリアドレスを別の大きなプレイグラウンドに「ダンプ」し、コンソールをよりよくエミュレートできるため、アドレスの40AF402C部分は変更されないことに気付くかもしれません。 これが、RPCS3メモリアドレスの長さが9桁で、PS3の長さが8桁である理由です。 これはポインターにとって非常に重要です。これについては、高度な改造チュートリアルで説明します。

このシフトのために、チュートリアル全体で私の検索範囲が300000000から3FFFFFFFFにセットします。 全て関連データがすべてこのメモリ領域にある。

メモリアドレスの検索

RPCS3で検索を開始する前に、 こちらのチュートリアルで概説されている基本的なセットアップを既に実行していることを確認してください 。 また、ゲームまたはCheat Engineを起動するたびに、RPCS3プロセスでCheat Engineをフックする必要があります。

メモリアドレスの検索は、本質的にフィルタープロセスです。 必要な条件を提供する、Cheat Engineが条件に従ってメモリ検索する。誤った値を保持しているメモリアドレスをフィルターで 除外し、 希望のアドレス取得するまで繰り返します。

HPや弾薬など、既に表示されている値を検索する方法を教える必要はないと思います。 オンラインの基本的なチュートリアルはたくさんあり、Cheat Engineには組み込みのチュートリアルが用意されています。 ここで注目したいのは、不明な値検索です。

不明な値

このセクションでは、例としてブーストゲージを使用します。 値の代わりにゲージの視覚的表現しかなく、ゲージの初期値がわからないため、未知の初期値検索を使用して必要な値のみを検索できます。

このようにCheat Engineをセットアップします。最も重要な部分は、Scan Typeを不明な初期値と4 Byte Big Endianに変更することです。 

でもブーストがフロートではなく値であることをどのように知ることができますか? 答えは私もわからない、推測するだけで、今回は4 Byte Big Endianを使用します。 スキャン中にゲームを一時停止することはオプションですが、チートエンジンがスキャンプロセスを実行している間にゲームをフリーズすることができます。 また、開始と停止に300000000と3FFFFFFFFを使用する必要はありません。必要なメモリアドレスがその領域にあることがわかっているため(上​​記のセクションを参照)、これを使用しました。これにより、検索が大幅に高速化されます。

それが完了したら、ブーストゲージが Full ことを確認し、New Scan ボタンを押してください。

完了すると、大量のアドレスが見つかったことを確認できます。 これは、チートエンジンがメモリ領域内のすべての値にインデックスを付け、将来の比較のために保存することです。

次に、Next Scanを使用して、2つまたは3つのアドレスのみにフィルタリングしてみましょう。

最初のスキャンを実行した後、スキャンタイプから選択するオプションはかなりあります。全てはメモリアドレスを除外するのためのオプションです。 これらはすべて一目瞭然なので、最も一般的なもの、変更された値を使用します。

その名前が示すように、オプションは、最初のスキャンと比較したときに値が変更されたメモリアドレスを検索します。 次に、ブーストの一部を使用してみて、補充する前に[Next Scan]ボタンをクリックします(初期スキャンのフルブーストゲージと比較して値が変更されていないかどうかを確認します)。

これを実行すると、結果セクションにメモリアドレスのリストが表示されます。 各アドレスを1つず調べるにはまだ早すぎますので、さらにフィルタリングしてみましょう。 通常、Scan Type を Unchanged Value に変更して次のスキャンを実行することをお勧めしますが、高度を維持せずに地面に落ちるため(ブーストを補充します)、Changed Value そのままにして、ブーストが補充された後に Next Scan をクリックします(フルブーストゲージと以前に使用したブーストゲージ値を比較します)。

作業が完了しても、まだ大量のアドレスが残っているはずです。 スキャンタイプを変更されていない値に変更し、ブーストゲージ値を使用せずに、[Next Scan]ボタンを押します。

前回の変更値フィルター以降、ブーストを使用していないため、値が変更されたメモリアドレスは、[Unchanged Value]オプションを使用して除外されます。 見つかったアドレスの数がすぐに減少することがわかります。

ヒント:Unchanged Value ボタンを数回押します。値を変更しない限り、Unchanged Valueの次回のスキャンをスパムできます。 これにより、値(この場合はブーストゲージ値)を変更しなかった場合でも、変更されるほとんどの偽アドレスが除外されます。

もう1つのヒントは、 Unchanged Value Scanをスパムしている間にウォーキング、射撃、ブーストゲージの値を変更しないアクションを実行することです。 このようなアクションを実行すると多くの値が変更されるため、これにより、見つかったアドレスの数が大幅に減少します。

Unchanged Valueを使用して、Foundのアドレスを32,324に下げました。 数値をこれ以上下げることはできなかったため、Changed Value に戻します。 

これまでの変更されたスキャンと変更されていないスキャンの全体的なパターンを確認できまか? これらを十分に繰り返すことで、数字を2桁減らすことができます。 私の場合、メモリアドレスをわずか20に下げました。

これら20個のメモリアドレスはすべて、ブーストゲージの値に関連付けられます。 

でもどのアドレスが実際のアドレスであるかをどのように判断しますか? 回答:勘と試行錯誤です。 通常、100または50または1のような合理的な値を探し、それぞれを観察して、自分の行動に応じて値が変化するかどうかを確認します。 このケースでは、ブーストゲージを使用すると減少し、枯渇すると0になったため、私の主な容疑者は10000です。 ただし、10,000の値を持つ2つのアドレスがあります。 どちらを選ぶべきですか? 回答:二つ試してみろうか!

これらの値の両方を以下のチート表に追加しました。 メモリアドレスが正しいかどうかを確認する最も簡単な方法は、左側のボックスをチェックして、メモリアドレスの値をフリーズ(アクティブ)にすることです。

まず、Suspect 1で値を凍結して試してみました。 残念ながら、値はまだ減少しています。つまり、これは値ではありません。

その後、Suspect 2に移動します。

うまくいきました! 無限のブースト!

パレードに行く前に、実際にはメモリリストに3番目の容疑者あります。

浮動小数点も4バイトです、忘れられないでください。 Cheat Engineには4バイト値と浮動小数点値を区別する方法がないため、通常、4バイトスキャンには浮動小数点値が含まれ、その逆も同様です。 これを認識する最も簡単な方法は、リスト全体をフロートに変更することです。最初の値は実際にはフロート1.00の値です。 幸いなことに、それは私たちが欲しかったメモリアドレスではありません。

これで、ここでチュートリアルを終了したいと思います。

Leave a comment

Design a site like this with WordPress.com
Get started