Cheat EngineのチュートリアルStep6の記事です。今回はみんな大好きポインターです。
チュートリアルの始め方やプロセスのアタッチの仕方などもこちらに書かれていますので、ご一読いただけると幸いです。
Cheat Engineの使い方 チュートリアル Step2の攻略 - 結果だけでなく過程も見てください
Step6の問題文
要約すると以下の通りです。
- 前回扱ったコードファインダーを毎回実施するより、ポインターを覚えておいてその先を指す値を書き換える方が簡単なこともある
- 初期値は100
- Change valueボタンは値だけを変更し、Change pointerボタンはアドレスと値を変更する
- 該当の場所を指すポインターをチートテーブルに追加し値を5000にして固定した後、「Change pointer」ボタンを押下してください
該当アドレスの絞り込みと、どこからアクセスされているかを取得する
Step2~5でやってきた方法と同様に、初期値100でFirst Scan→問題文ダイアログの「Change value」→Next Scanでアドレスを絞り込みます。値はランダムで変わりますが自分は706でした。
続いて、見つかったレコードを右クリックして「Find out what writes to this address」を選択します。
以下が表示されたら「Yes」を選択します。すると「The following opcodes write to XXXXXXXX」という新しいウィンドウが表示されます。
問題文のダイアログに戻り「Change value」ボタンを押下します。
「The following opcodes write to XXXXXXXX」ウィンドウが変更を検知し、処理(コード)が表示されます。
続いてウィンドウ右部にある「More information」ボタンを押下します。
00426DD7がChange value時に値を更新する処理(コード)となります。
mov [edx],eaxとあることから、新規の値はeaxレジスタに格納されており、edxレジスタのアドレスにある変数の値を更新していることがわかります。
ここで欲しいのは変数へのアドレスなので、edxレジスタの値を使用します。
ポインターのアドレス取得とポインターの手動追加
メインウィンドウに戻り、New Scanボタンを押下した後、①Hexにチェックをいれ、Value:にedxレジスタの値を入力して「First Scan」ボタンを押下します。②に結果が表示されます。ここではAddressの列が緑色の行を選択します。緑色のアドレスは静的アドレスといってアプリケーションを再起動しても固定のアドレスとなります。アプリケーション自体がアップデートされない限りアドレスは不変です。
続いて③の[Add Address Manually]ボタンを押下します。
新しくAdd addressウィンドウが表示されるので、①のPointerにチェックをいれて、②に先ほどメインウィンドウで見つかったアドレスを入力して(※1)、OKボタンを押下してください。
これでポインタのレコードが追加されました。Addressが「P->XXXXXXXX」となっており、変数そのものではなく、変数を指すポインタが追加されたことになります。これによりポインタが指す先の変数が変わった場合でも、常に目的の値を変更できるようになりました。
Valueを5000に変え、Activeにチェックをいれて値を固定します。
問題文のダイアログに戻り、Change pointerボタンを押下すると、Nextが活性化し、次の課題へ進めるようになります。お疲れ様でした。
(※1)処理(コード)にオフセットがある場合の対処方法
今回該当箇所の処理(コード)を見ると、以下のようにedxにオフセットがありませんでした。
mov [edx],eax
しかし、例えば以下のようにedxに12のオフセットがある場合は、Add addressウィンドウにオフセットを入力する必要があります。
mov [edx + 12],eax