Cheat Engineで実際のPCゲームをチートしてみよう!

Cheat Engineの使い方を覚えるには、実際のPCゲームで手を動かしながらやってみるのが一番効果的です。 今回はAssault CubeというオープンソースのFPSゲームを解析して、体力が減らないように改造してみましょう。
目次
手順と必要なツール
1.体力のアドレスを特定する
2.動的アドレスの場合、そのアドレスを格納しているポインタ変数をさかのぼっていき、
静的アドレスを見つける(マルチレベルポインタ)
3.マニュアルでポインターとオフセットを設定
4.値をフリーズして完成
実行した環境
・Windows 10 HOME
必要なツール & ダウンロード先
・Assault Cube -
https://assault.cubers.net
・Cheat Engine -
https://www.cheatengine.org
体力のアドレスを見つけにいく
それでは、Assault CubeとCheat Engineを起動してアタッチしましょう。
まずプレイヤーの体力の初期値は100になっているのを確認できるので、これを手掛かりにスキャンをかけていきます。
Scan TypeはExact Value、Value Typeは4Bytesなのを確認し、Value:に100を入力してFirst Scanをクリックします。
そうすると、たくさんのアドレス(この場合だと596)がヒットしたので、ここから絞り込んでいきます。
絞り込むために、プレイヤーの体力を変動させる必要があります。
少しマップ内を探索してグレネードを手に入れ、自分にダメージを与えましょう。
キーボードの3を押すとグレネードに切り替えれます。
ダメージを与えれたでしょうか?
近すぎると即死するので注意しましょう。
私の場合、88になったのでこの値で再検索していきます。
Value:に88を入力して、 Next Scanをクリックします。
これでアドレスが2つに絞り込まれました。
上のアドレスをダブルクリックして、アドレスリストに追加し、値を1000に変更してみましょう。
ゲーム画面に戻ると、体力が1000になっているのを確認できますね。
この状態で値を*フリーズすると無敵になりますが、厳密に言うと即死攻撃を受ければ死んでしまいます。
これはおそらく、通常攻撃を受けた場合と、即死攻撃を受けた場合で処理ルーチンが違うためです。
※フリーズとはCheat Engineの機能で入力した値をミリ秒単位で上書きし固定します。
さらに、このアドレス(変数)はプロセスが起動してから動的に確保されたメモリ領域のため、ゲームを再起動すると参照できなくなってしまいます。これでは不便なのでまた検索をかけて、このアドレスを保持しているポインタ変数を見つけにいきます。
※スキャンしてヒットしたアドレスが黒字で表示されている場合は動的アドレスです。
Cheat Engineでアドレスを検索する
新しくスキャンを始めるので、まずNew Scanをクリックしてください。 次にValue:の左にあるHexにチェックを入れて、先ほど見つけたアドレスを入力してFirst Scanをクリックします。
ここで使うアドレスは皆さんの環境によって異なります。私の場合DFA128
Hexは16進数のことです。アドレスは16進数で表されるので、検索するときはこのチェックボックスをチェックします。
スキャンすると何もヒットしません。
これはそのままの意味でこのアドレスを格納しているポインタ変数が存在しないということです。
なので別のアプローチをしていきます。
コードファインダーを使う
Cheat Engineにはコードファインダーという機能があります。
対象のアドレスにアクセスしているコード(命令)または、書き込んでいるコードを見つけるというものです。
アドレスリストのアドレスを右クリックして「Find out what writes to this address」を選択してください。
コードファインダーでこのアドレスに書き込んでいる命令を見つけにいきます。
新しいウインドウが出現したと思うので、そのままゲームに戻り再度グレネードで自分にダメージを与えます。
↓画像のように体力のアドレスに書き込んでいる命令を見つけました。
もう少し詳細な情報を得るために「More information」をクリックしてみましょう。
アセンブリ言語を読解する
注目すべきは赤字の部分です。
mov命令でeaxの値を[edx + F8]にコピーしています。
eaxにはダメージを受けた後の体力が、edxにはアドレスが格納されています。電卓のプログラマーモードでeaxの値を16進数で入力して10進数に変換すると、現在の自分の体力と一致するはずです。
F8はオフセットです。
オフセットはベースアドレスからの相対的な距離で、再起動しても値は変わりません。
ただしゲームがアップデートされると変わることがあります。
そしてもう一つ重要なのが
「The value of the pointer needed to find this address is probably 00DFA030」
の部分です。
要約すると体力のアドレスDFA128にアクセスするために、edxの値DFA030を必要としているという意味です。DFA030というベースアドレスにオフセットのF8を足して、DFA128にアクセスしています。
電卓で計算すると、DFA030+ F8 = DFA128になりますね。
静的アドレスを見つけよう
Cheat Engineのメインウインドウに戻り、edxの値でアドレス検索をします。
New Scanをクリックし、Hexにチェックを入れDFA030を入力し、First Scanをクリックします。
いくつかアドレスがヒットしました。
少しスクロールすると緑色で表示されているアドレスが3つあります。
これが静的アドレスと呼ばれる再起動しても消滅しないアドレスです。
ここで表示されているアドレスはすべてポインターのため、正確に言うと静的なポインターのアドレスになります。Cheat Engineはスキャンしてヒットしたアドレスが、プログラムの.dataセクション内にあるかどうかで静的か動的かを判断しているようです。
3つありますが、こういう場合はアドレス値の一番小さいものを使うのが基本みたいです。 したがって、509B74を使います。先頭の0は含めても含めなくてもどちらでもよいです。
ゲームが起動してからこの509B74にプレイヤーオブジェクトが作成され、プレイヤーの様々な情報にベースアドレスとオフセットを使用してアクセスしています。体力や弾丸のアドレスを特定しても、再起動すると参照できなくなるのはプレイヤーオブジェクトが作成されるアドレスがゲーム起動毎に変わるためです。
これで必要な情報がすべてそろいました。
ポインターを設定する
Cheat Engineメインウィンドウの右下にある「Add Address Manually」をクリックしてアドレスを追加します。
□Pointerをチェックします。
先ほど見つけたアドレス「509B74」とオフセットの「F8」を下記画像のように入力しOKをクリックします。
画像のようにアドレスリストにP->00DFA128と表示され、Valueが正しいことを確認できたらチート完成です。このチートテーブルを保存し、ゲームを再起動して再度アタッチするとそのまま使用できることを確認できます。
このポインター509B74に格納されているアドレスの近辺には、体力以外にもプレイヤーの様々な情報があります。参考までにオフセットのF8を158に変更すれば、グレネードの保持数のアドレスになるので試してみてください。
まとめ
以上で終わりになります。
この記事では静的アドレスを見つけることにフォーカスしていますが、絶対に見つけなければいけないというわけではありません。Cheat Engineのスクリプトを使い、コードを書き換えてしまえば同じことが出来ます。任意のタイミングでスクリプトをオン、オフにすることも可能です。
またポインタースキャンという機能もあり、ある程度自動で静的アドレスを見つけ出すことも出来ます。3レベル、4レベルポインターになるとこの記事のやり方では見つけ出すのが大変になります。
≫ポインタースキャンの使い方。アドレスが変わって困っている方におすすめ
ゲームをチートするにはC言語とアセンブリ言語の知識が必要になりますが、ポイントを絞って学習すれば覚えることはそんなに多くありません。このAssaulet Cubeを一通りチートすることで他のゲームでも出来るようになるのでぜひ挑戦してみてください。
書籍紹介
プログラムはなぜ動くのか 第2版 知っておきたいプログラムの基礎知識
管理人も愛読しているおすすめの書籍。
CPUの仕組みからポインター、アセンブラまで幅広く解説されており、
この1冊でチートするうえでの基礎知識を身に付けることが出来ます。
第3版が出版されました。