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*)。就是这样。