8: CheatEngineデバッガでゲームの命令を書き換える

概要

CheatEngineで例えばお金の値が入っているアドレスを特定し、そこに高額な値を書き換えるというのを最初の方の記事 で行ったが、例えばお金じゃなく体力の場合、毎回体力が減るたびに値を更新するのはめんどくさい。
そこで、今回は体力のアドレスに書き込みをしている命令(すなわちダメージを受ける命令部分)を書き換えて、 ダメージを受ける処理自体を無くしてしまうという事を目的にやっていく。
今回は別のUnityで作ったゲームを対象にやっていき、ゲームのサンプルはココからダウンロードできる。

体力のアドレスの特定

まずは体力のアドレスをCheatEngine上で特定する。
やり方は基本この記事と同じようにすればよい。
このゲームでは、qキーを押すとプレイヤーのステータスが出てくる。注意として、このゲームの体力はfloat型になっている。 まずは、float ExactValue 2500(体力の初期値)でFirstScanを行い、その後少しダメージを受けて、ステータスで体力を確認し、その値でNextScanをすればすぐにアドレスがわかるはずである。
見つけた値が本当に体力のアドレスか確認したい場合は、特定したアドレスをアドレスリストに入れて、スペースキーでロックした後、敵の攻撃を受けても体力が減らなければ良い。

ダメージを受ける命令の書き換え

それでは本題に入っていく。
判明したアドレスをアドレスリストに追加した後、そのアドレスを右クリックして、Find out what writes to this address をクリックする。 押すと、This will attach the debugger of Cheat Engine to the current process. Continue?と出てくるので、OK を選択する(CheatEngineのデバッガをアタッチしますという確認のメッセージボックス)。

これで、体力のアドレスに対し、書き込みを行った命令がこのウィンドウに出てくるので、実際にゲームに戻り、ダメージを喰らってみる。 そうすると、ウィンドウにその命令が下図のように出てくるはずである。 この命令を無効化すれば良いので、編集できるように、横にあるShow disassemblerボタンを押す。 そうすると、この体力書き換えの行付近のアセンブラ命令が見える。
movss [rdi+00000130],xmm5という命令が体力の書き換えを行っているわけだが、難しい事は考えず、 これを何もしない命令(nop命令)に書き換えてしまえば、ダメージを受ける命令を無効化する事ができる。

これは、movss [rdi+00000130],xmm5の所を右クリックし、Replace with code that does nothingを選択すれば、 簡単に選択した部分をnop命令に書き換えてくれる。 押すと、What name do you want to give this codeみたいに出てくるが、ここはそのままOKを選択して大丈夫です。

これで、ダメージを受ける処理を無効化して、無敵状態になる事が出来ました! ちなみに、これもゲームのプログラムがメモリ上にロードされたものを、メモリ上で書き換えているだけなので、 ゲームの実行ファイル自体を書き換えているわけではないので、ゲームのファイルを壊してしまうといった心配はない。