【3DSチート入門④】RAMチート

3DSチート

はじめに

RAMチートとは、ROMとセーブデータ以外のデータを書き換えることを指します

ROMはカセットのことで、このデータは変動しないので、サーチで見つかるセーブデータ以外は全てRAMチートの領域

やってみる

MH4Gで大剣の溜めを瞬時に行えるチートを考えてみます

RAMは中身がどうなっているか予想して、こうしたらできそうだなと考え、あとはひたすらサーチかなと

モンハン知らない方向けに動画載せますと、こんな感じでボタン押してる間、溜めが溜まっていくので、どこかに溜め時間を保存してるアドレスがあって、そこを変えれば作れそうだなと考えます

サーチはセーブデータと同じ感じ

溜め時間を保存しているアドレスは、溜め時間が少ない時は値が小さく、溜め時間が多い時は値が大きくなると予想できるので、今回はUnknown searchでこの2つの値を大小で比較します

少溜めでUnknown search→多溜めでBigger Than(前回より値が大きい)→小溜めでSmaller Than(前回より値が小さい)って感じでサーチして絞れました

細かい時間はそれなりにバイト数ないと表せないのでValue Typeは4Bytesで、中々絞れない時はエリアチェンジとかで環境変えてます

で、どれが大剣溜め時間のアドレスなのか1つずつ確認していく訳ですが、これは溜めるとその時間に応じてリアルタイムで値が更新されるもので、Hex Editorで値を書き換えるだけではまた溜めた時に値が上書きされてしまうので、値が変動しないように固定する必要があります

Xボタンを押して、New cheatを選択

テキトーに名前をつけます

コードが自動で作られるのでそのままBボタン

コードは次回以降詳しく説明しますが、これは上で選択したアドレスに、そのアドレスの現在の値を代入するコードを生成してくれてます

つまり大剣溜めが最大の時にCTRPFメニューを開き、確認したいサーチ結果のアドレスを選択してNew cheatを押すことで、選択したアドレスの値を大剣溜め最大の値に書き換えるコードが作れます

ActionReplayを押すと、つけた名前でコードが保存されてるので、チェックを入れてCTRPFを閉じます

これでどれが大剣溜め時間のアドレスなのか探します

アドレスが合っていれば、コードを有効にしている間は値が固定されるので、常に溜め時間を最大にするチートになります

これで完成の場合もあれば、アドレス自体が変動してしまって、次回以降は使えなくなってしまう場合もあります

変動アドレスの話

先ほどはアドレスの値(そのアドレスにある値)が変動するから値を固定するという話でしたが、アドレスそのものが変動してしまって、値を書き換えようにもそこに目当ての値がないっていう事がよくあります

多分ゲーム上で場合によって必要なデータ、不要なデータがあり、必要なデータだけをその都度メモリの上から敷き詰めるので、アドレスが変動してるんだと思います

これの解決法は、変動アドレスの開始場所を、値として持っている、ポインターアドレス(ベースアドレス)というものがあるので、それを見つけて、毎回ポインターが指している値(目当ての値)を書き換えられるようにすること

見つけるのは大変ですが、ベースアドレスは例えばプレイヤーデータの開始位置みたいな感じで、一度見つけてしまえば結構使い回しができるので頑張りましょう

ベースの探し方

ポインターは変動アドレスの開始場所を値として持っていると書きました

以下の画像は、アドレス1062ED4に、プレイヤーデータ開始場所として8967C40が指定されてます

分かりやすいように先に見せましたが、これを探していきます

値として開始場所が保存されているのでサーチが使えます

見つけた変動アドレス(今回は大剣溜め時間の8971F90とします)をサーチにかける訳ですが、ポインターの値は大剣溜め時間のアドレスではなく、プレイヤーデータの開始アドレスなんですよね

プレイヤーデータ群があり、その中に大剣溜め時間がある訳です

つまり大剣溜め時間のアドレスは、プレイヤーデータ開始アドレスからいくつか下の位置にあることになります

どれだけ下の位置にあるのかは分かりませんが、1纏まりのデータはそんなに多くないので(今回だとプレイヤーに関するデータだけなので)、どんなに下にあったとしても0x10000も下にはいかないかなと

見つけた変動アドレスから16進数で10000引いた数 〜 見つけた変動アドレスまでの数

の間にプレイヤーデータの開始アドレスがあることになります

これをサーチすればokです

①今回の変動アドレス、8971F90より小さい値をサーチ

②0x10000引いた、8961F90より大きい値をサーチ

これで値が、8961F90 ~ 8971F90 のアドレスに絞られます

③まだ値が多いので、ここからイコールサーチでさらに絞ります

今回だとクエスト中はポインターの値が変わらないものを求めているので、一旦CTRPFを閉じて、できる限りクエスト中で激しいアクションを起こし、Unknown search Equal Toで、それでも値が変わらなかったアドレスに絞ります

これを繰り返してから残ったアドレスで以下を確認するといいです

ベース確認

ベース候補(残ったアドレス)がそこそこたくさんあると思います

ベースアドレス候補の値が、お目当てデータ群(今回だとプレイヤーデータ群)の開始アドレス候補な訳です

見つけた変動アドレスからベースアドレス候補の値を引く事で、目当てのデータ(大剣溜め時間)が開始アドレスからどれだけ下にあるのかを求めることができます

Addressがベース候補、New valueがその値、見つけた変動は8971F90でしたね

とりあえず1つ差分を求め、サーチ結果と見つけた変動をメモしておき、以下の確認コードで動かなくなったらまた次の差分を求めて試すでいいと思います

BXXXXXXX 00000000
YYYYYYYY ZZZZZZZZ

X=ベースアドレス
Y=変動アドレス-ベースアドレスの値
Z=書き込む値 (今回だと大剣溜め最大時間の42F8D46F)

クエストをクリアしてまた入り直すなど、ポインターを変化させて、ベースが機能しているか確認してください(してなかったら次の差分を求めてまた試す)

これでポインターに対応できます

コード(Gateway条件)は次回説明しますが、これはアドレス x の値をアドレスとして認識して、そのアドレスから +y した位置を z に書き換えてます

おまけ

Hex Editorでこのポインターコードをたどってみよう

ベースアドレスに飛ぶと、値がポインターになってますよね

この値をアドレスとして認識してジャンプするには、普通にJump toから入力してもいいんですが、Jump to valueを押すと入力を省けます

飛んだ先がデータ群の開始アドレスです

Jump relativeを押すと、現在のアドレスから入力した分を加算した位置にジャンプしてくれます

差分を入力した先が、現在の変動アドレスになります

上のコードはこんな感じで飛んだ先を書き換えてくれてます

あと他に、履歴保存のBrowse historyと、それを一瞬で飛べるMove forward、10進数と16進数変換のConverterとかありますね(触れてなかった)

触ってみてください!

コメント

  1. 【3DSチート入門④】RAMチート | blog.mh4.jp
    admzgjvnftg
    [url=http://www.g2371smy5epr783emvar3li72c272a98s.org/]udmzgjvnftg[/url]
    dmzgjvnftg http://www.g2371smy5epr783emvar3li72c272a98s.org/