IDA/Hexrays:局部变量分配失败;如何解决这个问题?

逆向工程 艾达 反编译 六线谱 堆栈变量
2021-06-20 20:24:29

我正在对使用 DOS/4GW 扩展器的旧 DOS 游戏进行逆向工程。该游戏包含一些我已经在不同应用程序中成功反转的库,因此我非常确定出现问题的函数的声明是正确的。尽管如此,有问题的函数会显示错误消息// local variable allocation has failed, the output may be wrong!查看程序集时,堆栈定义似乎存在问题,如下所示:

在此处输入图片说明

我已经尝试编辑该函数并进行一些调整(不幸的是我在那里缺乏一点经验),但无济于事。这是声明/堆栈框架和函数的初始选项的屏幕截图,没有更改:

在此处输入图片说明

分配失败的原因可能是什么,如何解决?

1个回答

首先,局部变量分配失败并不一定意味着反编译不正确。例如,当使用强制变量时,它们可以自然发生。我会继续尝试像往常一样分析该功能。

如果您看到任何无法协调的奇怪变量操作,我建议您在整个函数中仔细检查堆栈指针。从返回站点开始:您是否在ret说明中看到任何负位移如果是这样,这表明在整个函数的某个地方有错误的堆栈点。

如果返回站点看起来不错,我建议您停下View->Open subviews->Problems来开始工作,修复任何显示BADSTACK. 当我说“修复”时,我的意思是确保每个被调用的函数都有正确的堆栈位移信息。对于直接调用,您可以通过编辑函数来修复这些问题,以确保它们清除的字节和帧指针增量是正确的。对于间接调用,请使用ALT-K“更改 SP 值”以确保正确的清除量。