1

私はアセンブリ言語の初心者で勉強目的なので、ゲームでメモリアドレスとポインタをスキャンしようとしています。ポインタとアドレスについて少し混乱しています。

YouTubeのチュートリアルでポインターを見つけましたが、このポインターとオフセットについてある程度理解を深めたいです。

ここに画像の説明を入力

ここに画像の説明を入力 これらのオフセットとアドレスがどのように加算され、最終的なアドレスが 1000 の値を格納するのかがわかりません。

私が理解しているのは、00F8EBE0 がベース アドレスで、「22,20,10,C,20」が 5 つのオフセットであるということです。

00F8EBE0 -> 11DA0924 = 1000 どうしてこうなった? C++ で 00F8EBE0 値を読み取るにはどうすればよいですか? 最終的な値を取得するために、これらのオフセットが必要ですか?

4

2 に答える 2

1

ポインターとオフセットを C/C++ に変換する場合は、配列の観点から考えるのが最善です。配列では、通常、配列ポインターであるベース ポインターがあります。特定の値にアクセスする場合は、オフセットに変換されるインデックスを追加します。ここでは、インデックスとオフセットの間に 1:1 の関係があるため、最も単純なケースは char 配列です。

 char p[100];
 p[10] = 32;

10 はオフセットであり、「p」の値が 0x1000 であると仮定すると、値 45 が割り当てられるアドレスは 0x100A になります。

 mov eax, 1000h
 mov [eax+0ah], 20

次のケースは、int のサイズが 4 バイトの整数配列です。ここでは、インデックスを乗算する必要がありますが、これはコンパイラによって行われます。

 int p[100];
 p[10] = 32;

これは次のように変換されます。

 mov eax, 1000h
 mov edx, 0ah
 mov [eax+edx*4], 20

したがって、ターゲット アドレスは 1000h + 10*4= 40 (28h) -> 1028h になります。

C++ では通常、クラスがあります。アセンブラーの観点からは、これは構造体と同じであるため、クラスのアドレスであるベースポインターがあり、オフセットはその特定のクラス/構造体の個々のメンバーをアドレス指定します。ただし、C/C++ で strcut/class を作成する場合、コンパイラはメンバー間にパディング バイトを追加できることに注意してください。これは、基本的に、メンバーからのオフセットが、 C/C++ コード。

iE

 struct { char a; int b; } myStruct;

この場合の b のオフセットは、myStruct+1 ではなく myStruct+2(または 4) になる可能性が高くなります。これは、コンパイラがアラインメントを追加して偶数アドレスまたは DWORD アラインメント アドレスにする可能性が高いためです。

于 2013-10-30T11:30:17.957 に答える