2017-10-21 66 views
-1

私は、アドレスの意味とポインタを理解することに問題があります。 私はassault cubeで作業しているので、client.dllのアドレスを取得しています。この場合は "ac_client.exe"です。 このアドレスをベースアドレスに追加して、509b74として出てくるローカルプレーヤーポインタを取得します。 Example Image このポインタでは、localplayerを使用してF8のオフセットを追加します。このオフセットは私に健康状態を示します。 ご覧のとおり、0x509b74→000E1B188 ..... 「000E1B188」はどこから来たのですか?理解できません? それから000E1B188 + f8 = 00E1B280 どうなりますか?わかりません?!ポインタとアドレスとの混同[チートエンジン]

答えて

0

明確にするために、0x509b74は、アドレススペースレイヤーのランダム化が有効になっておらず、.exeが常に0x400000にロードされるため、Assault Cubeでうまく動作するハードコーディングされたアドレスです。また、ac_client.exeモジュールのアドレスを動的に取得し、ToolHelp32Snapshotを使用して相対オフセット0x109B74を追加することもできます。

この練習では、ポインタは単にアドレスを表す数値を含む変数です。ポインタをプログラミングして定義するときは、ポインタが指す変数のタイプを定義する必要があります。これは、コンパイラのためだけです。そのため、データ型の正しい命令と強力な型付きコンパイラエラーチェックを使用して、ポインタの末尾にある変数に適切にアクセスするコードを作成できます。

0x509b74は、動的ローカルプレーヤーオブジェクトを指すポインターであることがあります。別の言い方をすれば、動的プレーヤーオブジェクトポインタは0x509b74にあります。これは、動的に割り当てられるローカルプレーヤーオブジェクトのアドレスである0x00E1B188を指し示します。 0x509b74から0x00E1B188に到達することは、逆参照と呼ばれ、単にポインタに含まれるアドレスを読み取るだけです。

ポインタが参照解除されると、ローカルプレーヤーオブジェクトの "ベースアドレス"と呼ばれるアドレス0x00E1B188が表示されます。また、これがプレーヤーオブジェクトのオフセット0x0にあると考えてください。 0xF8を追加すると、プレーヤークラス内に存在するヘルス変数のアドレスである0x0E1B280が表示されます。この時点では単純な追加に過ぎません。

あなたがそれを学ぶと、実際には簡単です。それは基本的に、コード内でこのようになります。この例では、弾薬

struct player 
{ 
int ammo; 
int health; 
} 

player* localPlayerPtr = new player(); 

が0x0にオフセットされ、健康がオフセットされている0x4の仮定int値は4バイトです。 localPlayerPtrが0x509b74にあり、0x00E1B188にある新しいプレーヤーオブジェクトを指しているとします。オフセット0x0は弾薬です。オフセット0x4を追加すると、ヘルスアドレス0x00E1B18Cが得られます。

C++の観点からポインタとオブジェクト指向プログラミングを理解することで、リバースエンジニアリングポインタがはるかに簡単になり、そのことを磨き上げていくつかの練習アプリケーションを作成することができます。

関連する問題