3

IDA pro からのコード ダンプを見ています。このレイアウトとして次の機能があります。

garbled_name(int this...
    unsigned int v5 ;
    v5 = *(_Byte *)(this + 4);
    ...

私が本当に興味を持っているのは、「+ 4」が正確に何をしているのかということです。これは追加ですか、それとも何か他のものですか?

ありがとう

4

4 に答える 4

3

このコードは、整数「this」を受け取り、それに 4 を加算し、それをバイトへのポインターにキャストしてから、「v5」をそのアドレスのバイトの値に設定します。

于 2010-12-04T01:45:00.390 に答える
2

これは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]
    ...
};
于 2010-12-04T02:06:36.387 に答える
1

オブジェクトの先頭から 5 番目のバイトへの参照です。そのコードを生成したコンパイラに応じて、オブジェクト インスタンスの 5 番目のバイトにあるクラス オーダーの項目である可能性が最も高くなります。

于 2010-12-04T01:38:20.140 に答える
0

編集:ため息、「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 バイト先を指します。

于 2010-12-04T01:52:35.740 に答える