【问题标题】:Is it possible in IDA Pro to make a struct field offset to vtable which is defined in .data segment?在 IDA Pro 中是否可以对 .data 段中定义的 vtable 进行结构字段偏移?
【发布时间】:2011-08-21 08:47:40
【问题描述】:

这就是我想要实现的目标。我确定了一个类,我将其定义为存储类数据的结构。该类的方法之一使用类字段,就好像它是指向 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 设置为“用户定义的偏移量”,但没有帮助:(

非常感谢!

【问题讨论】:

    标签: com reverse-engineering vtable disassembly ida


    【解决方案1】:

    当然有可能!

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

    【讨论】:

    • 嗨!在我的情况下, vtable_40194AE0 不是结构。它是结构 struc_4 的字段的名称。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-31
        • 1970-01-01
        相关资源
        最近更新 更多