5

これが私が達成したいことです。クラス データを格納する構造体として定義したクラスを特定しました。クラスのメソッドの 1 つは、class-field を vtable へのポインタであるかのように使用します。

int __thiscall SignOn(struc_4 *this)
{
  v1 = this;
  if ( !v1->vtable_40194AE0 )
    return E_UNEXPECTED;
  v1->field_3E8 = 0;
  if ( !sub_686F7193(v1) )
    return (*(*v1->vtable_40194AE0 + 12))(v1->vtable_40194AE0, 0, 0); // sub_40128EEE
}

ご覧のとおり、vtable から 3 番目の関数を呼び出します。実行時に、vtable_40194AE0 が次のような .data セクションの配列を指していることを確認しました

off_40194AE0    dd offset InternalQueryInterface
                dd offset AddRef
                dd offset Release
                dd offset sub_40128EEE  ; 3
                dd offset sub_40128F8C
                dd offset sub_4012C2E2  ; 5

vtable_40194AE0 が常に 0x40194AE0 の vtable を指していることを何らかの方法で IDA に伝える方法はありますか?

return vtable_40194AE0->sub_40128EEE(v1->vtable_40194AE0, 0, 0);

?

構造体の vtable_40194AE0 を「ユーザー定義のオフセット」に設定しようとしましたが、役に立ちません:(

どうもありがとう !

4

3 に答える 3

4

もちろん可能です!

「構造」ウィンドウを開き、クラス構造体 (この場合はstruc_4 ) を見つけて開きます (折りたたまれている場合)。vtableフィールドを選択し(最初にあるはずです)、Yを押して、開いたウィンドウにvtable構造体へのポインタとして型宣言を入力します(あなたの場合はvtable_40194AE0*)。それでおしまい。

于 2011-11-26T18:12:53.140 に答える
0

私の知る限り、いいえ。IDA 構造体は、逆アセンブルされたデータを視覚化するプロセスを簡単にするために提供されているだけです。できることは、呼び出しサイトにコメントを付けて、呼び出されている実際の仮想関数を特定することです。

于 2011-05-14T07:00:32.217 に答える