在 IDA PRO 中修复伪代码中的“__asm”(不一致的 fpu 堆栈错误)

逆向工程 艾达 汇编
2021-07-03 13:34:29

所以我在 IDA 中做了一些 REing,改变了一个函数参数类型,突然我的堆栈指针搞砸了 ( 1025B361: inconsistent fpu stack)。有谁知道在这里寻找什么或如何解决它?

我尝试了以下方法:

  • 取消定义-重新定义和更改参数类型。
  • 在伪代码中将 `double game_time` 类型更改为 `float`,但它不会让我(`抱歉,不能更改变量类型`,因为它在伪代码中使用)。
  • 将堆栈定义从 `0000018C var_18C dq ?` 更改为 `dd`。
  • 更改 `director_debug` 的签名。
  • 手动编辑 HEX 代码从 `DD 1C 24` 到 `D9 1C 24`(强制 m32fp)。
  • 依次为:更改函数签名、更改堆栈值、取消定义调用函数并将其重新定义为函数(代码)。

然而,这些都没有帮助。

伪代码

_EDX = game_time_ptr_12; //float edx@2
__asm
{
  fld     dword ptr [edx+0Ch]
  fstp    [esp+18Ch+var_18C]
}
director_debug("%3.2f: Director debug: %s.\n", *(_QWORD *)&game_time, "NORMAL MODE"); //double||__int64 game_time ST24 8@2

拆卸

.text:1025B35B 0 184                 mov     edx, game_time_ptr_12
.text:1025B361 0 184                 fld     dword ptr [edx+0Ch]
.text:1025B364 1 184                 push    offset aNormalMode ; "NORMAL MODE"
.text:1025B369 1 188                 sub     esp, 8
.text:1025B36C 1 190                 fstp    [esp+18Ch+var_18C] ;qword ptr [esp]
.text:1025B36F 0 190                 push    offset a3_2fDirectorDe ; "%3.2f: Director debug: %s.\n"
.text:1025B374 0 194                 call    director_debug

它应该变成什么

game_time = *(game_time_ptr_12) + 12);
director_debug("%3.2f: Director debug: %s.\n", game_time, "NORMAL MODE");
2个回答

在反汇编视图中,单击“编辑→其他→重置反编译器类型信息”,然后选择大部分或全部复选框并单击“确定”。

我这样做是为了修复一些我不小心组合成双精度的寄存器变量,然后无法再次将它们分开。

我最近遇到了同样的问题,我只能通过检查以下内容来解决它:

每当某些方法返回floator 时double,调用方法会显示__asm fstp指令而不是伪代码赋值,尽管这些方法的堆栈看似定义良好。此外,inconsistent fpu stack列出这些方法时会显示在“输出”窗口中。

切换到一个乱七八糟的反汇编方法。它的地址行前缀伴随着(似乎是)有问题的 FPU 堆栈指针。它将.text:0x0065789-1在它调用应该返回float或的方法的位置显示一个负值(如double

我仔细检查所有的返回类型的那些方法,切换他们来回intfloat/ double,最终再次固定的调用方法的反编译。