IDA Pro 结构中的反向偏移

逆向工程 艾达 抵消 德尔福
2021-06-30 13:50:19

我正在逆向 Delphi 程序,并且有一部分内容是这样说的:

Result = *(Self - 44);

但我希望它说:

Result = *(Self - offsetof(VMT_ClassDefinition, vmtClassName));

作为 VMT_ClassDefinition 以下结构:

struct VMT_ClassDefinition {
    Cardinal vmtSelfPtr;
    Cardinal vmtIntfTable;
    Cardinal vmtAutoTable;
    Cardinal vmtInitTable;
    Cardinal vmtTypeInfo;
    Cardinal vmtFieldTable;
    Cardinal vmtMethodTable;
    Cardinal vmtDynamicTable;
    Cardinal vmtClassName;
    Cardinal vmtInstanceSize;
    Cardinal vmtParent;
    Cardinal vmtSafeCallException;
    Cardinal vmtAfterConstruction;
    Cardinal vmtBeforeDestruction;
    Cardinal vmtDispatch;
    Cardinal vmtDefaultHandler;
    Cardinal vmtNewInstance;
    Cardinal vmtFreeInstance;
    Cardinal vmtDestroy;
};

其中 cardinal 是 unsigned int。问题是在数字 44 上使用“右键单击 > 结构偏移”后,它会生成以下结果:

Result = *(Self - offsetof(VMT_ClassDefinition, vmtSafeCallException));

我正在做Hex-Rays Decompiler 1.6 新特性第 3 节中所说的,但是正如你所看到的,预期的结果和我得到的完全不同。

我的猜测是它忘记了“-”符号,只是从 +44 开始前进。有没有办法扭转这种行为?我知道它可以在 ASM 视图中通过用“_”反转然后像在Negated structure offsets 中那样按“T”来完成,但这不适用于伪代码视图。

2个回答

我认为,移位指针应该可以工作。

由于似乎没有其他方法,我最终将 Self 变量转换为指向结构的指针,IDA 生成了以下代码:

Self[-1].vmtClassName

至少它现在是可读的。