IDA pro からのコード ダンプを見ています。このレイアウトとして次の機能があります。
garbled_name(int this...
unsigned int v5 ;
v5 = *(_Byte *)(this + 4);
...
私が本当に興味を持っているのは、「+ 4」が正確に何をしているのかということです。これは追加ですか、それとも何か他のものですか?
ありがとう
このコードは、整数「this」を受け取り、それに 4 を加算し、それをバイトへのポインターにキャストしてから、「v5」をそのアドレスのバイトの値に設定します。
これはC++クラスの単なるメンバー関数でありthis
、オブジェクトへのポインターです。オブジェクトのこの署名はおそらく次のとおりです。
class some_class {
int i; // int, void*, short, anything with sizeof() <= 4, and it's not char.
// It also can be absent if it's a virtual class (AFAIK it's compiler dependend)
unsigned char c; // or c[N]
...
};
問題のコードは次のとおりです。
some_class::some_fn(...){
unsigned int v5 = c; // or c[0]
...
};
オブジェクトの先頭から 5 番目のバイトへの参照です。そのコードを生成したコンパイラに応じて、オブジェクト インスタンスの 5 番目のバイトにあるクラス オーダーの項目である可能性が最も高くなります。
編集:ため息、「IDA Pro」の部分を見逃しました。通常の C++ コードで "this+4" が何をするのか疑問に思っている人がいる場合に備えて、娯楽の価値のためにここに残しておきます。
「this+4」は、現在の this ポインターを取り、そのサイズの 4 倍前に移動します。次に、それをバイト ポインターにキャストして読み取ります。
このことを考慮:
struct A {
void foo();
int x;
int y;
};
32 ビット システムの sizeof(A) は、ほとんどの場合 8 バイトです。
A myArray[8];
A *pA = myArray;
現在、pA は &myArray[0] を指しています。
pA++;
pA は &myArray[1] を指すようになりました。つまり、8 バイト先に移動しました。
void A::foo() {
A *pA = this + 4;
}
これを &myArray[0] で呼び出すと、&myArray[4]、つまり 32 バイト先を指します。