Cheat Engineの使い方 チュートリアルStep8の攻略 ポインターのポインター (ゲーム改造/チート)
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が非活性になり次の課題に進めるようになります。お疲れ様でした。
Cheat Engineの使い方 チュートリアルStep7の攻略 コードインジェクション (ゲーム改造/チート)
Cheat EngineのチュートリアルStep7の記事です。
チュートリアルの始め方やプロセスのアタッチの仕方などもこちらに書かれていますので、ご一読いただけると幸いです。
Cheat Engineの使い方 チュートリアル Step2の攻略 - 結果だけでなく過程も見てください
Step7の問題文
要約すると以下の通りです。
- コードインジェクション機能とはコードの一部を書き換えて処理の流れを変える機能です
- 初期値の体力(Health)は100
- Hit meボタンを押すと体力(Health)が1減る
- Hit meボタンを押したときに体力(Health)が2増えるようにしてください (課題)
- 体力を減らすコードを見つけたら、自動アセンブラウィンドウとコードインジェクション機能を使ってください
該当箇所の絞り込み
Step2~6でやってきた方法と同様に、初期値100でFirst Scan→問題文ダイアログの「Hit me」→Next Scanでアドレスを絞り込みます。
絞り込んだアドレス①をダブルクリックします。②に行が追加されるので②を右クリックし、③の「Find out what writes to this address」を選択します。
以下のダイアログが出たら「Yes」を押下します。
新しく「The following opcodes write to XXXXXXXX」というウィンドウが開くので、問題文のダイアログに戻り「Hit me」ボタンを押します。
すると、変数の変更を検知して「The following opcodes write to XXXXXXXX」ウィンドウに該当箇所のコードが表示されます。コードを選択して「Show disassembler」ボタンを押下します。
コードの該当箇所がハイライトされたMemory Viewerが開きます。
今回は該当箇所がすで選択された(ハイライトされた)状態になっているので、そのままメニューバーのTools→Auto Assembleを選択します。新たにAuto assembleウィンドウが開きます。
メニューバーからTemplate→Code injectionを選択します。
今回はコードを選択してここまで来ているので該当アドレスが最初から格納されています。
なのでそのままOKボタンを押してください。
以下のように該当箇所のコードが挿入されます。
コードを以下のように変更します。
originalcode:にはもともとの処理が以下のように書かれています(アドレスは各人によって異なります)。
sub dword ptr [ebx+000004A4],01
これはebxのアドレスからオフセット0x4A4ずれた場所から4byte(dword)分の領域から1を減算するという意味になります。
今回新しい処理に正解の処理を記述するため、こちらの処理はコメントアウトしてしまいます。コメントアウトしないと-1の減算も処理されてしまい都合が悪いためです。
newmem:には今回新たに実施するコードを記述します。
今回Hit meボタンを押したときに体力(Health)が+2されてほしいため、newmem:に以下のコードを追加します。意味はebxのアドレスからオフセット0x4A4ずれた場所から4byte(dword)分の領域に2を加算するという意味になります。
add dword ptr [ebx+000004A4],02
コードが書けたらExecuteコマンドを実行してください。
確認するダイアログが表示されたら「Yes」を押下してください。
その後コードインジェクションが成功した旨のダイアログが表示されるので「Yes」を押下してください。
メモリビューワーに戻ると、赤枠のように先ほど追加した処理が追加されています。
最後に問題文のダイアログに戻り、「Hit me」コマンドを押下してください。
体力(Health)が2加算され、Nextが活性化されて次へ進めるようになります。お疲れ様でした。
Cheat Engineの使い方 チュートリアルStep6の攻略 ポインター (ゲーム改造/チート)
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
Cheat Engineの使い方 チュートリアルStep5の攻略 コードファインダー機能 (ゲーム改造/チート)
Cheat EngineのチュートリアルStep5の記事です。
チュートリアルの始め方やプロセスのアタッチの仕方などもこちらに書かれていますので、ご一読いただけると幸いです。
Cheat Engineの使い方 チュートリアル Step2の攻略 - 結果だけでなく過程も見てください
Step5の問題文
要約すると、以下の通りです。
- ゲームは再起動するたびに値が保存される場所が変わる(動的アドレス)
- ゲームを再起動しても再度解析しないようにするには、値を保存している処理(コード)に注目することが重要
- 値の初期値は100
- 「Change Value」ボタンを押すたびに数値を変更する処理(コード)が実行される
- 値を保存している処理(コード)をみつけ、何も処理しないコードに書き換えてください
アドレスを見つける
Step2~4までにやってきた方法でアドレスを見つけます。
初期値は100なので、100でFirst Scan→Change valueボタンを押す→新しい値でNext Scan...といった感じで該当するアドレスを特定してください。
値はランダムで変化しますが、自分の例では545になりました。
①値を入力してスキャン
②該当するアドレスが絞れたらダブルクリックする
③行が追加される
見つけたアドレスがどこから書き込まれているかを探す
追加した行を右クリックし「Find out what writes to this address」を選択します。
以下が表示された場合は「Yes」を押下すると、「The following opcodes write to XXXXXXXX」というタイトルのウィンドウが新しく表示されます。
ここで問題文のダイアログに戻って「Change value」ボタンを押します。
すると書き込みを検知した「The following opcodes write to XXXXXXXX」のダイアログに行が追加されるはずです。
これが先ほど見つけたアドレスに書き込んでいる処理(コード)となります。
次に、右にある「Show disassembler」ボタンを押下します。
Cheat Engineの使い方 チュートリアルStep4の攻略 浮動小数点 (ゲーム改造/チート)
Cheat EngineのチュートリアルStep4の記事です。
チュートリアルの始め方やプロセスのアタッチの仕方などもこちらに書かれていますので、ご一読いただけると幸いです。
Cheat Engineの使い方 チュートリアル Step2の攻略 - 結果だけでなく過程も見てください
Step4の問題文
要約すると、以下の通りです。
- 体力(Health)と弾薬(Ammo)があり、初期値は100
- 両方小数であり、体力(Health)はfloat型、弾薬(Ammo)はdouble型
- 「Hit me」ボタンを押すと体力(Health)が減り、「Fire」ボタンを押すと弾薬(Ammo)が減る
- 体力(Health)と弾薬(Ammo)の両方を5000以上にしてください
小数の検索
Step2, Step3とほぼ同じやり方で解くことができますので説明はさらっといきます。
違いは値が小数であることだけですので、検索するValue TypeをFloatやDoubleにして検索をします。
例えば、体力(Health)なら、Value Typeを「Float」にして100でNew Scan→Hit meボタンを押す→100から減った値でNext Scan...と繰り返してValueを5000以上の値にします。
弾薬(Ammo)もValue Typeを「Double」にして同じことを繰り返します。
両方の値を5000以上にするとNextが活性化し、次のステップへ進めるようになります。お疲れ様でした。
Cheat Engineの使い方 チュートリアルStep3の攻略 (ゲーム改造/チート)
前回Step2の続きです。Step2の記事は以下です。チュートリアルの始め方やプロセスのアタッチの仕方などもこちらに書かれていますので、ご一読いただけると幸いです。
Cheat Engineの使い方 チュートリアル Step2の攻略 - 結果だけでなく過程も見てください
Step2をクリアして[Next]ボタンを押してStep3まで進めてください。
Step3の問題文
要約すると以下の通りです。
- 今回はStep2と違い初期値はわかりません
- 初期値は0~500の間にあるということはわかっています
- 「Hit me」ボタンを押すと体力(Health)の緑色のバーが減ります
- チートして体力(Health)の値を5000にしてください
初期値がわからない場合の検索
まずはStep2の結果を消すために、「New Scan」ボタンを押下します。
次に、Scan Typeのプルダウンから「Unknown initial value」を選択して、「First Scan」ボタンを押下します。
問題文のダイアログに戻って、「Hit me」ボタンを押し体力を減らします。ダイアログ下部にある緑色のバーが少し減ったのがわかるでしょうか?
Cheat Engineのメインウィンドウに戻り、Scan Typeを「Decreased value」にします。Decreased valueとは1つ前の検索結果から値が減ったものを探すという検索種別です。
その後「Next Scan」ボタンを押下してください。
前の検索結果から値が減った場所が表示されましたが、1つに絞り込めていないため現時点ではまだ該当の場所はわかりません。
検索結果がある程度少なくなるまで、以下を繰り返してください。
- 問題文のダイアログの「Hit me」を押下する
- Cheat EngineメインウィンドウでScan Typeを「Decreased value」にして「Next Scan」ボタンを押す
何度か上記を繰り返した結果は以下です。下記画像では4件まで結果を絞れています。問題文にある通り正解の値は0~500の間にあることはわかっているため、該当の場所(アドレス)は「01892680」であることがわかります。「01892680」をダブルクリックしてください。
チートテーブルに追加された行の値部分をダブルクリックしてください。
以下の通り、値を変更するための新しいダイアログが開くので値を5000に変更してOKボタンを押します。これで体力(Health)の値が467から5000に変更されました。
問題文のダイアログに戻ってみてください。
無事体力(Health)を5000にできたので、「Next」ボタンが活性化され、次の課題に進めるようになっています!お疲れ様でした。
Cheat Engineの使い方 チュートリアルStep2の攻略 (ゲーム改造/チート)
Cheat Engineについて
Cheat Engineは主にゲームに対して使用するメモリースキャナー/デバッガーです。ゲームプロセスのメモリーにアタッチして値を変更することにより、リアルタイムにHPを好きな数値に変更したり、弾を無限にするなどのチートが可能になります。
ダウンロードはこちらから。
Cheat Engine
なお、上記公式サイトにも記載されていますが重要なことなので以下に明記しておきます。
Cheat Engineは私的および教育目的でのみ使用してください。Cheat Engineをプロセスにアタッチする前に、特定のゲーム/アプリケーションのEULA / TOSに違反していないことを確認してください。cheatengine.orgは、Cheat Engineの違法な使用を容認していません。
今回はCheat Engineに含まれるチュートリアルの最初の課題であるStep2を解いていきたいと思います。
当方Cheat Engineのバージョンは7.2です。
チュートリアルの始め方
Cheat Engineを起動したらメニューバーの[Help]からチュートリアルを起動できます。
メッセージが表示されますので、[Next]ボタンを押してStep2に進みましょう。
プロセスへのアタッチ
課題を開始する前に、解析するプロセスにアタッチするため、以下のボタンを押下します。
起動しているアプリケーション一覧が表示されますので「Tutorial-i386」を選んだ後、「Open」ボタンを押下します。
Step2の問題文
要約すると以下のようになります。
- あなたの体力(Heath)の初期値は100です (ダイアログ下部に書かれています)
- 「Hit me」ボタンを押すたびに体力が減っていきます
- あなたの体力(Heath)をチートして1000にしてください
数値の検索
いまあなたの体力(Health)は100なので、100という数字で検索をします。
以下の赤枠の通り、Value:に「100」を入力してください。
また青枠は変更する必要はありませんが「Exact Value」となっていることを確認してください。「Exact Value」は入力した数値と一致する値を検索するという意味になります。
続いて赤枠の「First Scan」をクリックします。
すると赤枠の場所にメモリー上で「100」の値を持つ場所がヒットしました。
複数個所ヒットしたので、目的の場所がどこかは現時点ではまだわかりません。
数値を変化させて再度検索する
課題のウィンドゥに戻って「Hit me」ボタンを押下しましょう。体力(Health)がいくつか減ったと思います。この画像では体力(Health)が100→98に減っています。
そうしたら今度はCheat Engineのメインウィンドウに戻って、今度は「98」で検索をしてみましょう。値に「98」を入力し、「NextScan」を押下します。「Next Scan」を押すことで、先ほど検索した結果からさらに絞り込んで検索をすることができます。
該当の場所を絞り込むことができたら、その行をダブルクリックします。すると②のようにチートテーブルと呼ばれる領域に行が追加されます。
もしNext Scanを押して1件にならなかった場合は、 もう一度「Hit me」ボタンを押下し、体力(Health)を入力して再度Next Scanボタンを押してください。 1件になるまでこれを繰り返してください。