5

这是我想要实现的目标。我确定了一个类,我将其定义为存储类数据的结构。该类的方法之一使用类字段,就好像它是指向 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 总是指向 0x40194AE0 处的 vtable 所以给定的伪代码调用看起来像

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

?

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

非常感谢 !

4

3 回答 3

4

当然,这是可能的!

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

于 2011-11-26T18:12:53.140 回答
2

您可以创建一个表示 vtable 的结构,使用Y(作为类型化函数指针)声明其字段的 C 类型,并call [ecx+12]使用T. 这样,IDA 将识别调用的参数。

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

于 2013-11-11T19:45:43.777 回答
0

据我所知,没有。IDA 结构只是为了简化反汇编数据的可视化过程而提供的。您最多可以对调用站点进行注释以识别被调用的实际虚拟函数。

于 2011-05-14T07:00:32.217 回答