1

IDA PROのオフセットを介して、結果関数1002DDCC3の実際の場所/アドレスを取得するにはどうすればよいですか? 具体的には「a1 + 0x2E0」の部分です。

明らかに新しい関数 sub_100xxxxx を呼び出します。

まあ言ってみれば

a1 == 942691698;

int (__stdcall *__stdcall QueryInterface(unsigned int a1))(int)
{
 if ( a1 == 942691698 )
            return (int (__stdcall *)(int))sub_1002DDC3;
}

int __stdcall sub_1002DDC3(int a1, int a2)
{
  int result; // eax@2

  if ( a1 )
    result = (*(int (__stdcall **)(_DWORD))(*(_DWORD *)a1 + 0x2E0))(a2);
  else
    result = -1;
  return result;
}

関数 1002DDC3 の生のアセンブリはhttp://img.techpowerup.org/121010/Capture.pngです

4

2 に答える 2

2

あなたの言葉遣いは非常に不明確です。QueryInterface()それが本当に何か関係があると仮定するとIUnknown::QueryInterface()

「の戻り値の意味は何ですか」と尋ねている場合sub_1002DDC3()、それはおそらくHRESULTです。ここで最も重要な値は、ゼロ ( S_OK)、-1 (一般的なエラー)、およびゼロ以外 (特定のエラー) です。

それとも「の住所はsub_1002DDC3()?」と聞いていますか?

生の分解を投稿していただけると、実際にはこれを理解しやすくなります。

編集して追加

インターフェイス メソッドのアドレスは、実行時に決定されます。逆アセンブラは事前にアドレスを認識していないため、どのメソッドが呼び出されているかを知ることができません。

はい、COM オブジェクトを個別に逆アセンブルする必要があります。

于 2012-10-10T15:02:16.183 に答える
1

'a1' 引数の値によって異なります。この関数は 'a1' のさまざまな値で呼び出すことができるため、リストを見ただけではわかりません。デバッガーで実行するか、呼び出し元を確認する必要があります。

于 2012-10-10T14:30:29.177 に答える