Hex Rays转换

时间:2012-10-10 14:23:15

标签: c++ c x86 masm

如何通过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

2 个答案:

答案 0 :(得分:2)

你的措辞很不清楚。假设QueryInterface()确实与IUnknown::QueryInterface()有关:

如果您询问“sub_1002DDC3()”的返回值的含义是什么,则可能是HRESULT。这里最重要的值是零(S_OK), - -1(一般错误)和非零(特定错误)。

或者您在问“sub_1002DDC3()的地址是什么?”

如果您可以发布原始反汇编,实际上更容易理解

已编辑添加

接口方法的地址在运行时确定。反汇编程序事先不知道地址,因此无法告诉您调用哪种方法。

是的,您需要单独反汇编COM对象。

答案 1 :(得分:1)

取决于'a1'参数的值。由于可以使用不同的'a1'值调用此函数,因此仅通过查看列表就无法判断。您必须在调试器下运行它或检查调用者。