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

exp*_*ert 5 com reverse-engineering vtable ida disassembly

这就是我想要实现的目标.我确定了一个类,我将其定义为存储类数据的结构.该类的一个方法使用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
}
Run Code Online (Sandbox Code Playgroud)

如你所见,它从vtable调用第3个函数.在运行时我发现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
Run Code Online (Sandbox Code Playgroud)

有没有办法告诉IDA vtable_40194AE0始终指向vtable在0x40194AE0所以给定的伪代码调用看起来像

return vtable_40194AE0->sub_40128EEE(v1->vtable_40194AE0, 0, 0);
Run Code Online (Sandbox Code Playgroud)

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

非常感谢 !

小智 5

当然,这是可能的!

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

  • 你好!在我的例子中,vtable_40194AE0 不是一个结构。它是结构体 struc_4 的字段名称。 (3认同)

sha*_*eMe 0

据我所知,没有。提供 IDA 结构只是为了使反汇编数据的可视化过程更容易。您最多可以做的是注释调用站点以识别正在调用的实际虚拟函数。