Com 在IDA Pro中,是否可以将结构字段偏移到.data段中定义的vtable?

Com 在IDA Pro中,是否可以将结构字段偏移到.data段中定义的vtable?,com,reverse-engineering,vtable,disassembly,ida,Com,Reverse Engineering,Vtable,Disassembly,Ida,这就是我想要实现的目标。我识别了一个我定义为存储类数据的结构的类。类的其中一个方法使用类字段,就好像它是指向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->v

这就是我想要实现的目标。我识别了一个我定义为存储类数据的结构的类。类的其中一个方法使用类字段,就好像它是指向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调用第三个函数。在运行时,我发现vtable40194AE0指向.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,vtable40194AE0总是指向0x40194AE0处的vtable,所以在伪代码中给定的调用如下所示

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

我尝试将结构的vtable_40194AE0设置为“用户定义的偏移量”,但没有帮助:(


非常感谢!

据我所知,没有。提供IDA结构只是为了简化可视化已分解数据的过程。您所能做的最多就是对调用站点进行注释,以确定正在调用的实际虚拟函数。

当然,这是可能的


打开“结构”窗口,找到您的类结构(struc_4),然后打开它(如果它已折叠)。选择vtable字段(它应该位于第一位),按Y键,然后在打开的窗口中输入类型声明作为指向vtable struct的指针(vtable_40194AE0*)。就是这样。

您可以创建一个表示vtable的结构,用
Y
声明其字段的C类型(要键入函数指针),并将
调用[ecx+12]
中的偏移量设置为该结构的
T
偏移量。这样,IDA将识别调用的参数


在表示类的结构中,将vtable字段的类型设置为指向vtable结构的指针,如果幸运的话,反编译器将把所有内容放在一起,并将vtable结构字段名放入调用中,而不是偏移量。

Hi!vtable_40194AE0在我的情况下不是结构。它是结构struc_4字段的名称。