Как кто-то может получить фактическое местоположение / адрес функции результата 1002DDCC3 через смещение в IDA PRO?
В частности, часть «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
Ваша формулировка очень неясна. При условии, что QueryInterface()
действительно имеет какое-то отношение к IUnknown::QueryInterface()
:
Если вы спрашиваете «каково значение возвращаемого значения sub_1002DDC3()
«, это, вероятно, HRESULT. Самые важные значения здесь равны нулю (S_OK
), -1 (общая ошибка) и ненулевое значение (конкретные ошибки).
Или вы спрашиваете «каков адрес sub_1002DDC3()
?»
Это было бы на самом деле Полегче чтобы понять это, если бы вы могли опубликовать сырой разборки.
Отредактировано, чтобы добавить
Адрес метода интерфейса определяется во время выполнения. Дизассемблер не знает адреса заранее и поэтому не может сказать вам, какой метод вызывается.
Да, вам нужно разобрать COM-объект отдельно.
Это зависит от значения аргумента ‘a1’. Поскольку эту функцию можно вызывать с разными значениями «a1», это невозможно определить, просто взглянув на листинг. Вам придется запустить его под отладчиком или проверить вызывающих.