Cheat EngineのチュートリアルStep8の記事です。みんな大好きポインターのポインターのポインター…です…。
チュートリアルの始め方やプロセスのアタッチの仕方などもこちらに書かれていますので、ご一読いただけると幸いです。
Cheat Engineの使い方 チュートリアル Step2の攻略 - 結果だけでなく過程も見てください
Step8の問題文
要約すると以下の通りです。
- Step6はただのポインターで1回辿れば終わりだったが、この課題は4回辿る必要がありポインターのポインターのポインターのポインターを求める必要がある
- ポインターを辿るときは、ベースポインターとオフセットを意識する
- ポインターは緑色の静的アドレスになるまで辿る
- Change valueボタンを押すとポインターの先が持つ値がランダムに変更される
- Change pointerボタンを押すと、大本のポインタ以外のすべてのアドレスが変更される。その後3秒スリープする。
- Change pointerボタンを押下したときにスリープする3秒間にポインターの先が持つ値を5000に変更してください (課題)
レベル1ポインターの検索
初期値221でFirst Scan→問題文ダイアログの「Change value」→Next Scanでアドレスを絞り込みます。
絞り込んだアドレス①をダブルクリックして②に追加します。②を右クリックして③の「Find out what accesses this address」をクリックします。「The following opcodes accessed 0192FED0」というウィンドウが新規に表示されます。
問題文ダイアログの「Change value」を押して値を変更すると、変更を検知した「The following opcodes accessed 0192FED0」ウィンドウにコード行が表示されます。ここでのベースポインタはesiレジスタでアドレスは0192FEB8、オフセットは18であることをメモなどに書き留めて置いてください。
ポインターを辿るため、①ベースポインターが存在するアドレスを探します。
Cheat Engineメインウィンドウで「New Scan」を一度押下した後、以下のようにベースポインターのアドレスで検索をかけます。
これでベースポインターのアドレスを保持しているポインターは0192FE18であることがわかりました。②をダブルクリックして③に行を追加します。続いていま見つけたポインターを使って変数値を表示するため④を押下します。
①でPointerにチェックを入れ、②にアドレス0192FE18、③にオフセットである18を入力します。青枠にある値が、問題文ダイアログに表示されている値と一致している、つまり正しい位置を指していることを確認してください。OKボタンを押してレコードを追加します。
レベル2ポインターの検索
Cheat Engineに戻ったらわかりやすいようにDescriptionを変更しておきましょう。①1行目は体力(Health)、2行目は作業用なのでそのままで、②3行目は辿った1つ目のポインターとして「Pointer level 1」としておきます。さらにポインターを辿るため、②を右クリックして「Find out what access this address」を押下します。
以下のダイアログが表示されたら「Find out what accesses this pointer」を選択します。
新たに「The following opcodes accessed 0192FE18」ウィンドウが表示されます。
問題文ダイアログの「Change value」で値を変更すると、それを検知して「The following opcodes accessed 0192FE18」ウィンドウにコードが表示されます。
ベースポインタはesiレジスタでアドレスは0192FE18、オフセットは0であることをメモなどに書き留めておいてください。
Cheat Engineのメインウィンドウに戻り、①ベースポインタのアドレスで検索します。②結果が2つ出ていますが下を選びます(※)。これでベースポインタのアドレスを保持しているポインターは01914F34であることがわかりましたので、③に追加して④を押下します。
(※)ここ正直どちらを選べばいいか判断ができなかったのですが、両方試してみて正常に動作する方を選んでいます
①のPointerにチェックを入れ、②のAdd Offsetでオフセットを増やします。これは今求めているものがポインターのポインター(レベル2ポインター)のため、それぞれのオフセットが存在するためです。③にはアドレス01914F34、④にはオフセット0、⑤はオフセット18を入れます。青枠の値が、問題文に表示されている値を一致していることも確認してください。OKボタンを押してレコードを追加します。
レベル3ポインターの検索
ここからは繰り返しです。
Cheat Engineに戻ったらわかりやすいようにDescriptionを変更しておきましょう。その後レベル2ポインターのレコードを右クリックして「Find out what accesses this address」を選択します。
以下のダイアログが表示されたら「Find out what accesses this pointer」を選択します。
新たに「The following opcodes accessed 01914F34」ウィンドウが表示されます。
問題文ダイアログの「Change value」で値を変更すると、それに反応して「The following opcodes accessed 01914F34」ウィンドウにコードが表示されます。
ベースポインタはesiレジスタでアドレスは01914F20、オフセットは14であることをメモなどに書き留めておいてください。
Cheat Engineのメインウィンドウに戻り、①ベースポインタのアドレスで検索します。結果を選びます(②)。これでベースポインタのアドレスを保持しているポインターは018FA6C4であることがわかりましたので、③に追加して④を押下します。
①のPointerにチェックを入れ、②のAdd Offsetでオフセットを増やします。これは今求めているものがポインターのポインターのポインター(レベル3ポインター)のため、それぞれのオフセットが存在するためです。③にはアドレス018FA6C4、④オフセットには14, 0, 18を入れます。青枠の値が、問題文に表示されている値を一致していることも確認してください。OKボタンを押してレコードを追加します。
レベル4ポインターの検索
Cheat Engineに戻ったらわかりやすいようにDescriptionを変更しておきましょう。その後レベル3ポインターのレコードを右クリックして「Find out what accesses this address」を選択します。
以下のダイアログが表示されたら「Find out what accesses this pointer」を選択します。
新たに「The following opcodes accessed 018FA6C4」ウィンドウが表示されます。
問題文ダイアログの「Change value」で値を変更すると、それに反応して「The following opcodes accessed 018FA6C4」ウィンドウにコードが表示されます。
ベースポインタはesiレジスタでアドレスは018FA6B8、オフセットはCであることをメモなどに書き留めておいてください。
Cheat Engineのメインウィンドウに戻り、ベースポインタのアドレスで①のように検索します。結果を選びます(②)。これでベースポインタのアドレスを保持しているポインターは"Tutorial-i386.exe"+2426E0であることがわかりましたので、③に追加して④を押下します。
①のPointerにチェックを入れ、②のAdd Offsetでオフセットを増やします。これは今求めているものがポインターのポインターのポインターのポインター(レベル4ポインター)のため、それぞれのオフセットが存在するためです。③にはアドレス"Tutorial-i386.exe"+2426E0、④オフセットにはC, 14, 0, 18を入れます。青枠の値が、問題文に表示されている値を一致していることも確認してください。OKボタンを押してレコードを追加します。
値の変更
緑文字の静的アドレスまで辿れました。静的アドレスはアプリケーションを再起動しても変化しないアドレスのため、ポインタ辿りはここで終了です。
いよいよ課題のため問題文ダイアログの①「Change pointer」を押してから3秒以内にレベル4ポインタの②Value値を5000に変更します。ここかなりタイミングがシビアですが、がんばってください。これなんで5秒や10秒にしなかったんでしょうね…。
うまく値が変更できると③の通りNextが非活性になり次の課題に進めるようになります。お疲れ様でした。