Вот чего я хочу добиться. Я определил класс, который я определил как структуру для хранения данных класса. Один из методов класса использует 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. Во время выполнения я определил, что 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
Есть ли способ как-то сказать IDA, что vtable_40194AE0 всегда указывает на vtable по адресу 0x40194AE0, поэтому данный вызов в псевдокоде будет выглядеть так:
return vtable_40194AE0->sub_40128EEE(v1->vtable_40194AE0, 0, 0);
?
Я попытался установить vtable_40194AE0 структуры как «определяемое пользователем смещение», но это не помогает :(
Большое спасибо !