Cheat EngineのチュートリアルStep9の記事です。チュートリアルのラスボスとなります。
チュートリアルの始め方やプロセスのアタッチの仕方などもこちらに書かれていますので、ご一読いただけると幸いです。
Cheat Engineの使い方 チュートリアル Step2の攻略 - 結果だけでなく過程も見てください
Step9の問題文
要約すると以下の通りです。
- プレイヤー2人チームと敵2人チームがある
- 「Restart game and autoplay」ボタンを押すとゲームが開始されるが、そのままだとプレイヤーチーム側が必ず負ける
- プレイヤーのHealthを固定する方法以外で、「Restart game and autoplay」ボタンを押した状態でプレイヤーチームを勝たせてください (課題)
- 「Restart game」ボタンを押すと全員のHealthがリセットされます
- 「Attack」ボタンを押すとHealthが減ります
- HealthはFloatです
Healthを減らすコードは共通
Healthを減らすコードを探すと、プレイヤーも敵もHealthを減らすコードは共通です。そのため、安易にHealthを減らさないようにコードを変更する方法を取ると、敵のHealthも減らなくなってしまいます。ここではプレイヤー側のチームであるかどうかを確認する必要があります。
Healthを減らすコードを探す
Step2~8の方法と同様に、Player1の「Attack」でHealthを減らしつつ、①Value Typeを「Float」にしてから②First ScanおよびNext Scanで該当コードの箇所を絞り込みます。③コードが絞れたら④の「Find out what writes to this address」を選択します。
問題文ダイアログの「Attack」ボタンを押すと、それを検知して「The following opcodes write to 14CCC1B4」ウィンドウにコードが表示されますので「Show disassembler」ボタンを押して、Memory Viewerを表示させます。
mov [ebx+04],eaxが新たなHealth値を代入している共通コードであることがわかります。ここの処理を変更したいのですが、先にプレイヤーチームであることを認識する方法を探す必要があります。
プレイヤーチームであることを認識するデータを探す
該当コードを右クリックして「Find out what addresses this instruction accesses」を選択します。これはこのコードを実行するたびにそれを検知して記録する「Accessed addresses by 4288D9」というウィンドウを表示するものです。
ウィンドウが開いたら、問題文ウィンドウに戻りAttackボタンを順番に一回ずつ押してください。
「Accessed addresses by 4288D9」ウィンドウに検知したアドレスや回数が記録されているので、4つとも選択した上で右クリック→Open dissect data with selected addressesを選びます。
いくつかダイアログが表示されます。そのままOKやYesを押して進んでください。
「Structure dissect」ウィンドウにそれぞれアクセス元のアドレスを解析し、それぞれの構造を解析した結果が表示されます。
まず目につくのは0x15の名前でしょう。Dave, Eric, HAL, KITTの名前は問題文ダイアログにあるそれぞれのプレイヤーや敵の名前と一致します。そのため最初の2つがプレイヤーチーム、後半2つが敵チームと推測できます。
名前で判断してもいいのですが他により簡単にチームを判断できるデータを探すと0x10にプレイヤーチームは「1」、敵チームは「2」と推測できこちらで判断した方が簡単そうということがわかりました。
Memory Viewerに戻って、該当コードを書き換えます。
該当コードを選択してTools→Auto Assembleを選択しましょう。
Template→AOB Injectionを選びます。この後いくつかダイアログが表示されたらそのままOKボタンを押します。
コードを改造します。変更するのは以下の通りです。
- code:部分。プレイヤーか敵かを判断して敵ならばkill:にジャンプさせるような処理に変更します。またHealthを減らすコードも削除します。
- kill:の追加。kill:はプレイヤーのHealthを0にして一撃で殺すコードです。そのためmov[ebx+04],0としてHealthに0を入れます。
- label(kill)の追加。ラベルを新たに記述するのでこのコードが必要になります。
コードが書けたらExecuteボタンを押下します。
問題文ダイアログに戻り「Restart game and autoplay」ボタンを押下すると、プレイヤー側のHealthは減らず、敵側は即座に0になり、次に進めるようになります。おつかれさまでした!