Cheat Engineで使う重要な用語

Static Address 静的アドレス

Cheat Engineの検索結果で緑字で表示されるアドレス。↓画像の赤枠部分
静的アドレスは再起動してもアドレスが変わりません。
Cheat Engineはスキャンしてヒットしたアドレスが、プログラムの.dataセクション内にあるかどうかで静的か動的かを判断しているようです。.dataセクションにはプログラム内で使うグローバル変数と静的変数が格納されています。
マルチレベルポインタ(ポインタのポインタ)の場合、この静的アドレスをコードファインダーやポインタースキャンで見つけにいくことになる。

Cheat Engineの動的・静的アドレス

Dynamic Address 動的アドレス

黒字で表示されるアドレス。↑画像の青枠部分
プロセスが起動してから、動的に確保されたメモリを示すアドレス。
プログラムは実行中に必要な時に必要なサイズだけヒープと呼ばれる領域にメモリを確保している。
これをメモリの動的確保という。
どのアドレスにメモリを確保するかはOSが自動で行うため、再起動した時には場所が変わっており参照できなくなってしまう。「せっかく値を見つけたのにゲームを再起動したら使えなくなった」となるのはこれが原因である。

Base Address ベースアドレス

起点となるアドレス。オフセットと一緒に使われる。
何をもってベースというのか難しいが、多くの場合メモリに実体化された構造体またはクラスの先頭アドレスだと思われる。
ゲーム内のプレイヤー(敵も含めて)の情報はC言語でいう構造体、C++でいうクラスで管理されている。また、プレイヤーの情報にアクセスするためのベースになるアドレスをプレイヤーベースと呼ぶ。

Offset オフセット

ベースアドレスからの相対的な距離。
例えば、プレイヤーの体力のアドレスを特定したとき、
ほとんどの場合、このオフセットが使われている。
例:ベースアドレス + オフセット = 体力のアドレス

マルチレベルポインタのイメージ図

Cheat Engineで静的アドレスを見つける場合は、最初に体力のアドレスを見つけて次に青矢印のように順々にバックトレースしていきます。図は簡略化したもので、実際の解析ではオフセットを伴うので、もう少し複雑になります。
関連記事

3 Comments

holmirr  

static addressについて

gamehackについての日本語での解説は少ないので助かります。
一つ疑問に思ったのが、static addresssについてです。私の想像では、マルチレベルポインターはC++でいうnewの繰り返しで実装されているではないかと思っていますが、その場合、最初のnew(malloc)のポインターが非staticなローカル変数に格納された場合、このポインターは.dataセクションではなくstackに積まれるのでstatic pointer(exeからのオフセットが常に同じ)にはなり得ないのではないかと考えてしまいます。
本当に初心者なので、こんなどうでもいいことを疑問に思ってしまうのですが、もしお分かりになりましたら教えていただけるとありがたいです。

2021/05/15 (Sat) 21:48 | REPLY |   
ちーたー

なんでもチート  

To holmirrさん

私の理解は以下の通りですが、間違ってたらすいません。

ローカルなポインター変数にnewして動的生成すると、static pointerは存在しない。
グローバルなポインター変数にnewすれば、static pointerが存在する。
static pointerはグローバルなポインター変数のことで、base pointerともいう。

参考になりそうなサイトがありました。
Visual Studio等でコンパイルしてCheat Engineで検証してみてください。

https://l3nsec.blog/2018/04/29/what-are-multi-level-pointers/
https://www.youtube.com/watch?v=0iOxUOaogb8

https://dl.dropboxusercontent.com/s/mybd2v45pwasj6m/PointerTest.cpp
https://dl.dropboxusercontent.com/s/zg6g8zmi110jqx8/PointerTest2.cpp

2021/05/16 (Sun) 19:47 | REPLY |   

-  

返信ありがとうございます。

私が書くような些細なプログラムではグローバル変数を使わなかったので勘違いしていましたが、ゲームなどではオブジェクトへのポインタはグローバル変数として格納しているのかなあと、なんとなく分かりました。

分かりやすいサイトまでご紹介いただき、ありがとうございました。

2021/05/18 (Tue) 19:04 | REPLY |   

Post a comment