PlayerBase Entity Listの見つけ方

・プレイヤーオブジェクトとはメモリに実体化されたプレイヤーの構造体 インスタンスまたはエンティティとも言う
・プレイヤーベースポインターとはメモリに実体化されたプレイヤーオブジェクトの先頭アドレスを保持しているポインタ変数

PlayerBaseの見つけ方

仮にHPのアドレスを見つけたとします。
次にHPのアドレスにアクセスしている命令を調べmov [edi+E4],eaxとなっていれば、おそらくediがプレイヤーオブジェクトの先頭アドレスです。
あとはediの値でアドレス検索すれば緑色のベースポインターのアドレスがヒットするはずです。
ヒットしない場合はポインタースキャンを使ってください。

また、プレイヤーオブジェクトを見つければ必ずしも情報がざくざく見つかるわけではありません。
例えば風来のシレン5plusの場合、2D画面上の座標はありましたが、肝心のHP、満腹度、経験値は別の構造体にありました。
これはゲームを作成したプログラマーが構造体をどう定義するかによって変わってきます。
assault cubeのように1つの構造体にHP、名前、座標、弾丸などたくさんの値を定義していれば連鎖的に値を見つけることができます。

まずは何でもいいので値を見つけていき、ポインタースキャンInjection copyを使用して次回起動時からもその値を参照できるようにしておきます。
次にその値の近辺(同じ構造体)に他の情報がないかダンプ画面とdissect data structureを使用してゲームを動かしながら探します。
流れとしてはこんな感じです。

Entity Listとは

赤枠がプレイヤーベースポインター(PlayerBase)、青枠がプレイヤーオブジェクトの先頭アドレスです。

風来のシレン5plus

Counter Strike Source

Entity ListとはEntity(実体)が格納されている配列のことです。
上の画像のオフセットに注目してみると風来のシレンは0x8バイトずつ、CSSは0x10バイトずつアドレスが離れていることが分かります。
この2つのゲームの場合ポインター配列になっており、ポインターのアドレスが規則正しく並んでいるのが特徴的ですね。
Entity Listを見つける際はこの特徴を利用します。
どちらもオフセット0、つまり配列の先頭にプレイヤーの実体があるのも重要な点です。

参考URL
関連記事

1 Comments

初級者  

座標の見つけ方について

いつも分かりやすい記事を楽しみにしています。
記事のコメントで、「最近のゲームでいうとBIOHAZARD RE3では問題なく使えているので」と書かれてありました。
RE3をお持ちであることを前提に質問させてください。

いつもは上下軸の座標アドレスを見つけるために、
Unknown initial.../Float で初期検索したあと、
①階段を昇ったりしてプレイヤーの高度が上がったら、「Increased value」
②階段を降りたりしてプレイヤーの高度が下がったら、「Decreased value」
③プレイヤーが停止中に「Unchanged value」
を繰り返していました。(Sleeping DogsとDEATH STRANDINGはこの方法で見つかりました。)
しかし、RE3では③を実施するとFound:0となり、失敗します。
管理人さんのこれまでの経験からこの原因は分かりますでしょうか?
(DEADRISING 2 OFF THE RECORDも同様に失敗しました)

あと一つ、Sleeping DogsとDEATH STRANDINGでは、上下軸のアドレスを見つけたものの、空中状態で値をロックしても空中で静止してくれません。
たとえば、上下軸:10でロックしたとすると、10→9→10…を繰り返す感じです。
更新周期のようなものがあるのでしょうか?
上下軸:10→重力により落下して9→次の更新時にまた10→落下して9→更新して10… のように見えます。
この回避方法をご存じでしたら教えていただけませんか?
(重力を無効にする方法がある?)
よろしくお願いいたします。

2021/01/18 (Mon) 11:27 | EDIT | REPLY |   

Post a comment