4: 座標特定

概要

以前の記事で、CheatEngineを使ってお金の値が格納されているアドレスを特定し、値を改竄することができました。
今回はお金ではなく、初期値がわからないxyz座標をCheatEngineで特定するのを目標にします。xyz座標の三つのメモリアドレスをそれぞれ見つけないといけないですが、実はx座標だけ見つければ、その次がy座標だったりと隣合ってる可能性が大きいです。 このように、やることはお金のアドレスの特定と同じでも、ちょっとした工夫やフィルターのかけ方が違ってきたりします。
Unityで作ったゲームを対象にやっていき、ゲームのサンプルはココからダウンロードできる。

CheatEngineでy座標を特定

まずは、どれか一つの座標から特定していきます。ゲームを起動し、CheatEngineをアタッチしましょう。
ここから、まずはとりあえず型だけ指定してFirstScanし、プレイヤーを動かしては "今増加/現象した数" のようにフィルター掛けしていくことにより、座標を特定していきます。 とりあえず、初期値は分からないので、下図のように型はfloatだと仮定して、Unknown initial valueでFirstScanしましょう。 ここで、普通はワールドのどっち向きが何座標なのかというのはわかりません。それなので、増加していると思ったら逆に減少方向に走っていたりなどがあります。 最初は動かずに、カメラの視点操作や武器取り外しだけをしながら、"今変化しなかった値" でフィルター掛けしたり、逆に少し動いてから、"今変化した値" のように調べていってもいいですが、これだと条件が緩いので、中々候補が減りません。

ここでポイントなのが、y座標は上に行くほど大きい値の事が多いという点です。他のゲームでは上下はy座標じゃなく別の座標だったりするのかもしれませんが、少なくともUnityでは上下はy座標になっています。
さらに、大半のゲームにはジャンプがあったり、段差があったりするので、増加/減少/不変が結構分かりやすいです。それなので、まずはy座標を特定していきます。

サンプルのゲームにはジャンプは無いですが、ある剣を使って上昇することができます。以下の場所にある剣です。 画像にも書いてある通り、4キーで装備でき、Nキーを押すと上昇できます。
では早速、Nキーを押して高く飛んでみましょう。この時にはFirstScanしたときよりも明らかに高度は高い(y座標は大きい)と思うので、Increased valueでNextScanを掛けましょう。 この後、重力で落ちていくと思います。今度は逆に、Decreased valueでNextScanをしましょう。 これを何回か繰り返していきましょう。もちろん間に、すこし地面に立った状態でスキャンしてから、動かずにUnchanged valueでNextScanなどをしてもOKです。
これを繰り返すと、大体50ぐらいまでには絞れると思います。ここまで来たら、中々数字が減らなくなってくると思います。

候補数が減らなくなってきたら、アドレスの値を半分ずつ固定していて、プレイヤーが動かなくなるかを見ていきます。 まずは、現状の候補を下図のように全選択し、AddressListに追加しましょう。 そして、下図のようにAddressListの内半分を固定して、プレイヤーのy座標がうごかなくなるか試してみましょう。
動かなくなったらロックしてない方をDelete、動いたらロックしてる方にはy座標は無いのでDelete、のようにして候補を絞っていくと、最終的に一つに絞れると思います。
なお、完全にその座標でとまるというよりかは、ガクガクした感じにはなると思います。また、y座標じゃないアドレスという事は何かゲームの制御に関するアドレスだったりすることもあるので、たまにゲームがクラッシュしたりすることがあります。 そうなるとゲームを再起動してまた最初からやり直しになってしまうので、なるべくすぐ動くか動かないか確認し、確認が終わったら固定をすぐ外して、アドレスをロックしてる時間を極力短くすることを心がけましょう。
これでy座標は特定できたはずです。

x座標とz座標の特定

普通ゲームを作るとき、座標を格納する変数を用意するとしたら、以下みたいな感じで連続で定義すると思います。
float x;
float y;
float z;
それなので、y座標のメモリアドレスの隣がx座標だったりz座標だったりします
今回、自分が見つけたy座標のアドレスは0x1E0A79FADE4でした。float型は4Byteなので、前後の0x1E0A79FADE0, 0x1E0A79FADE8を手動で下図のように追加してみましょう。 追加できたら、早速 "固定" して、その方向に動けなくなるかどうか試してみましょう。ちょうどxyz座標どれも取れているはずです。