0

私は誰かのコードを読んでいて、彼はこのような関数を呼び出しています。そのブロックの「this」は仮想メソッド テーブルへのポインタであり、彼はオフセットを使用してそのテーブルの関数を呼び出しています。あなたが疑問に思っている場合に備えて、これはハックです。

    __asm
{
    MOV EDI, this
    LEA ECX, [EDI + 0x4]
    MOV EDX, DWORD PTR DS:[ECX]
    CALL [EDX + 0x24]
}   

彼は「これ」とオフセットを呼び出すだけの簡単なコードを持っていますが、私はこれで何が起こっているのか混乱しています。それがまったく役立つ場合は、Ida からの vtable ダンプを投稿できます。

4

2 に答える 2

0

多重継承のようです。このような場合、継承されたクラス インターフェイスごとに個別の vtable があります。したがって、2 番目と 3 番目の命令は、指定された継承クラス インターフェイスの vtable の開始を計算します。呼び出しは明らかです。24 は単なるマジック ナンバーであり、その継承されたクラスで呼び出される関数への既知のオフセットです。

于 2013-04-09T09:24:19.850 に答える
0

thisin C++ は、オブジェクト自体を示すためにオブジェクトのスコープで使用できるキーワードです。

class A{
    private:
        int x;

    void method(){
        this->x = 5;    //"this" is a pointer to the object itself
    }
};

この例では、「これ」はA* const.

于 2013-04-09T03:42:44.877 に答える