Cheat Engineでゲーム内の情報を芋づる式に見つけよう!

Cheat Engineには「Dissect data structures」という機能があります。この機能を使うとゲームを動かしながら、メモリの情報を視覚的にわかりやすく分析でき、値を変更することも可能です。


プレイヤーの体力や弾丸のアドレスを見つければ、そのアドレスの近辺には他の情報もたくさんあります。なぜこのようなことが起こるかというと、プログラミングでは関連するデータをメモリの特定の場所にまとめて管理しているという特徴があるからです。C言語でいう構造体のことですね。これはゲームだけに限らずソフトウェア全般に言えることです。


自分の探している値とは違うものでも見つけておけば、それを手がかりに目的の値を偶然見つけることもよくあります。この機能と似たようなツールにReClass.NETもあるので参考までに。


Dissect data structuresで構造体を分析する

実際にやってみましょう。使用するゲームはAssault Cubeです。
ここで使用するアドレスはプレイヤーの情報にアクセスするためのベースになるアドレスで、プレイヤーベースと呼ばれるものです。Assault Cubeの場合、ポインター50F4F4がプレイヤーベースになります。


Cheat Engineメインウインドウ右下にある「Add Address Manually」をクリックします。



Pointerにチェックを入れ、青枠に50F4F4を入力し、赤枠のアドレスをクリップボードにコピーします。



Cheat Engineメインウインドウ左下にある「Memory View」をクリック。



メニューバーのToolsから「Dissect data/structures」をクリック。



コピーしたアドレスを張り付け、「Define new structure」を選択します。



Structure Nameはなんでも良いので入力し、OKをクリックします。




これで分析に使用するウインドウが出現しました。
赤枠がオフセット、緑枠がデータ型、青枠がアドレスとそのアドレスが保持している値になります。ゲーム内で情報が変化すれば、このウインドウの情報もリアルタイムで更新されます。試しにオフセットのF8まで下にスクロールしてみましょう。



体力を確認できました。
他にも情報がないかスクロールしながら探していきます。
ゲーム画面と一致する値や、それらしい数字を見つけます。



3つほどありました。オフセット114の50も気になりますね。
ある程度情報を見つけたのでこのくらいにして、新たに設定していきます。
↓画像にある矢印のあたりで右クリックして「Lock」を選択します。



さらにメニューバーのFileから「Add extra address」をクリックします。



左に入力してあるアドレスと同じアドレスを右にも入力します。



そうすると↓画像のようになります。



赤枠のアドレスはロックされていて値は変化しません。ロック時の状態を保っています。青枠のアドレスはゲーム内の情報が変わると値も更新されます。これで変化が一目瞭然です。


それではゲームに戻り、試しに銃を撃ってみましょう。



一発撃つと、アサルトライフルのマガジンの弾数が20から19になりました。Dissect data structuresのウインドウを見るとオフセット150の値が20から19に変化しています。


ロック時の状態から値が変化すると画像のように文字が赤色になります。 これで、アサルトライフルのマガジンのオフセットとアドレスを見つけることが出来ました。次はリロードしてアサルトライフルの残り弾数(予備マガジン)を40から39にしてみます。



オフセット128の値が40から39に変化しているので、ここで間違いないでしょう。



見つけた値を使用する場合は画像赤枠のようにポインターとオフセットを入力し、アドレスリストに追加します。このようにDissect data structuresではオフセットを見つけるのが重要で、個々のアドレスは次回起動時には変わってしまうので特に必要ありません。


以上で終わりになりますが、他にもポインターを追いかけたり、共通の値を見つけるなど出来ることがたくさんあるので色々と試してみてください。

関連記事

13 Comments

Real

No title

はじめまして。ポインターサーチのやり方を検索していたら主さんのページを見つけ訪問しました。

お伺いしたいのですが、単純な数値のスキャンなのですが最近のゲームは『FirstScan』→『NextScan』を掛けると0 Result表示なってしまうのですが、対応していないということでしょうか?

使用バージョンは7.2です。
色々試してみようと思うのですが、ここで今躓いています。
差し支えなければ宜しくお願い致します。

  • 2020/12/03 (Thu) 21:36
  • REPLY
ちーたー

なんでもチート

No title

コメントありがとうございます。
Scan TypeをUnknown initial valueでFirst Scan、ゲーム内の値を変更しDecreased valueまたはIncreased valueでNext Scanを試みてはいかがでしょうか。
それでもダメならいったん他のゲームで同様の現象が起きるかどうか調べてみるなど。
最近のゲームでいうとBIOHAZARD RE3では問題なく使えているので、対応はしているはずです。

  • 2020/12/04 (Fri) 19:37
  • REPLY

Real

No title

ご回答ありがとうございます。

Decreased valueもIncreased valueも使用したことが有るのですが、
やはり数値は数字としてはっきりとゲーム画面には出ているのですが、
アクティブ状態にしても数値が変動してしまいます。

因みに手こずっているゲームは先日発売された『風来のシレン5 plus』です。

ゲーム内に満腹度と言うシステムが有りまして、
初期値は100なんですが、100でFirst Searchし99に減ったところでNext Searchを掛けるとResult 0になってしまうというのが現状です。
他にもRPGではなじみのHPもやりましたが、なぜか0になってしまいます。

他に1日違いで発売されたドラゴンクエスト11では問題無く数値を入れると検索に引っかかってくれて、無事反映はされます。

  • 2020/12/07 (Mon) 11:55
  • REPLY
ちーたー

なんでもチート

Value TypeをByte型、Scan TypeをExactValueで現在の値でFirstScan、値を変更し、変更された値でNextScanしたらどうなるでしょうか?

それがダメなら別の方法でまずScan TypeをUnknown initial valueでFirstScan、ゲーム内の値を変更し、Changed ValueでNextScan。
途中でUnchanged Valueもはさみながら、検索結果が100以下ぐらいになるまで絞り込みます。

絞り込まれた検索結果の半分くらいを一気に別の値に変更して、ゲームに反映されればその中に目的の値があります。
それで何も反映されなければ、残り半分の値を一気に変更して様子を見てください。
半分→半分→半分を繰り返していると、2つ3つくらいまで絞り込まれるのであとは個別に値を変更してどれが本物の値なのかを見極めて完了です。
上の手順をバイト型、4バイト型の2通りやってみて違えば他のデータ型も試してみてください。

また値を一気に変えるとゲームがクラッシュする可能性があるので、セーブデータのバックアップは忘れないようにお願いします。

途中、絞り込まれた検索結果をざっとみて、ゲーム画面の数値と一致しないなら値が暗号化されている可能性があります。

暗号化された値を見つける方法は下記の動画が参考になります。
https://www.youtube.com/watch?v=NOOWl1eOMKA
お金を増やすチートなら参考になりそうなのを見つけました。
https://fearlessrevolution.com/viewtopic.php?f=2&t=14570

  • 2020/12/07 (Mon) 18:52
  • REPLY

Real

ご回答ありがとうございます。

やはりResult 0になってしまいます。
First Scanの時点ですでに目的のアドレスを暗号化されている影響で、
検索しきれていない可能性もあるかもしれません。

一通り試しましたが、やはり暗号化されている可能性が有るようです。

こちらでも調べるとここ最近は風来のシレンで絞り込める所まで行ける方が
いらっしゃるようなのですが、アクティブ化(数値固定)しても反映されない
状態が現状の様です。

リンク先の動画を一通り見て見ます。

  • 2020/12/09 (Wed) 14:20
  • REPLY
ちーたー

なんでもチート

To Realさん

これらも有効ではないかもしれませんが、Cheat EngineのEditからSettings、Debugger OptionsのDebugger methodをUse VEH Debuggerにするとデバッガーを検知するチート対策を回避できます。
また暗号化された値を検索するときは、Cheat EngineメインウインドウにあるMemory Scan OptionsのFast Scanのチェックをはずしてスキャンするのも有効だそうです。
下のURLの中腹当たり
https://guidedhacking.com/threads/how-to-find-encrypted-or-obfuscated-variables-in-cheat-engine-guide.11445/
PUBGというゲームではほとんどのポインターがシフト命令とXOR命令で暗号化されているらしいので、その類だと手ごわそうです。

  • 2020/12/09 (Wed) 19:35
  • REPLY

Real

To なんでもチートさん

全て試しましたが撃沈です。やはり手ごわそうですね。

運よく検出されても数値変更が反映されないです。

HP0になり振り出しを繰り返す度にアドレスが都度変更もしくはリセットされている感じです。

PUBGは名前だけ存じ上げています。

まぁ、アンチチートも同梱されているゲームも有るのでPUBGの様な暗号の塊
が有っても不思議ではないかもしれません。

  • 2020/12/09 (Wed) 19:47
  • REPLY
ちーたー

なんでもチート

To Realさん

こちらでもやってみたところ、Entity Listが見つかりました。
https://imgur.com/ZJw2jDj.png
プレイヤーも敵もオフセットが似ているので同じクラスから生成されたインスタンスだと思います。
ぱっと見たところ座標とフラグ、歩数をカウントしている変数がありました。
また、木の矢と石の個数もbyte型で検索したところ見つけることができました。
上のコメントで貼ったURLにもありましたが、お金も見つけることが出来るはずです。
ただ、満腹度はいろんなパターンを試しましたが見つかりませんでした。
ゲームオーバーになった時にセットされるフラグのようなものからバックトレースすると見つかるかもしれません。

  • 2020/12/11 (Fri) 22:40
  • REPLY
ちーたー

なんでもチート

To Realさん

満腹度見つけることが出来ました。
7FF75CE4CFA0と7FF75CE4CFA4を4バイトでアドレスリストに追加して、二つ一緒に固定すると減らなくなります。

  • 2020/12/16 (Wed) 06:27
  • REPLY

なんでもチート

To Realさん

値を固定するとしばらくは大丈夫ですが、何らかのタイミングでゲームが強制終了してしまいました。
上の2つのアドレスに書き込んでいる命令が全部で4つあるので、それらを全部replace with code that does nothingで潰すと今のところ正常に動いています。

  • 2020/12/16 (Wed) 08:25
  • REPLY

勉強中

教えてください
当たり前のようにプレイヤーアドレスは○○ですとありますが、どう見つければ良いのでしょうか?

ちーたー

なんでもチート

To 勉強中さん

コメントありがとうございます。
こちらに返信記事を書きました。
http://cheatwhatever.com/blog-entry-32.html
まだ未完成でわかりずらいと思いますが、後に肉付けしていくのでしばらくお待ちください。

  • 2021/01/12 (Tue) 21:36
  • REPLY

勉強中

早急な対応ありがとうございます!
過去記事を見るだけではぼんやり理解だったのが新記事ではっきりしてきました!
ありがとうございました

  • 2021/01/14 (Thu) 15:42
  • REPLY