f5生成伪代码出错的几种类型


常见F5出错信息

1.posutuve sp value has been found

  • 成因:IDA会自动分析SP寄存器的变化量,由于缺少调用约定、参数个数等信息,导致分析出错。 一般是程序代码有一些干扰代码,让IDA的反汇编分析出现错误。比如用push + n条指令 + retn来实际跳转,而IDA会以为retn是函数要结束,结果它分析后发现调用栈不平衡,因此就提示sp analysis failed。

  • 解决方案:Option->General设置显示Stack Pointer,检查对应地址附近的调用约定以及栈指针变化。直接使用alt+k修改sp指针,将其修改为应有的值即可(可以改为指向上一行的sp或者修改为0)。(有风险)

2. cannot convert to microcode

  • 成因:部分指令无法被反编译,有未设置成指令的数据字节。

  • 解决方案

    • 最常见起因是函数中有未设置成指令的数据字节,按c将其设置为指令即可。
    • 其次常见的是x86中的rep前缀,比如repxx jmp等。可以将该指令的第一个字节(repxx前缀的对应位置)patch为0x90 (NOP)。
  • 也可以先点击函数点u将其取消定义。

  • 然后选中下面所有数据内容,按C转换为代码。

  • 点击force

  • 点击yes

  • 之后再点击_Z7进行P定义为函数,再用F5反编译。这里可以得到encrypt函数。

  • 下面如果还有红色的不要忘记也P一下,创建函数。

3.call analysis failed

  • 成因:F5在分析调用时,未能成功解析参数位置/参数个苏

  • 解决方案:

    • 对于间接调用(类似call eax等),可使用之前讲过的设置调用地址的方法解决。

    • 对于直接调用,查看调用目标的type是否正确设置。可变参数是引发这种错误的主要原因之一。

4.stack frame is too big

  • 成因:在分析栈帧时,IDA出现异常,导致分析出错
  • 解决方案:
    • 找到明显不合常理的stack variable offset,双击进入栈帧界面,按u键删除对应的stack variable
    • 如果是去壳导致的原因,先用OD等软件脱壳
    • 可能由花指令导致,请手动或自动检查并去除花指令
  • 非常罕见

5.too big function

  • 成因:当前函数大小大于允许的最大值,函数大小最大值有配置文件中的MAX_FUNCSIZE 变量控制。

    MAX_FUNCSIZE 的定义:

    反编译函数大小最大值,使用KB单位计算。只有可读的基本块被统计在内。默认值是64,即64KB。出现这个报错,说明反编译函数的大小已经超过了64。

  • 解决方案:

    ​ 1.修改配置文件:【IDA 安装目录】\cfg\hexrays.cfg

    ​ 源文件为:

    • MAX_FUNCSIZE = 64 // Functions over 64K are not decompiled

      修改为:

    • MAX_FUNCSIZE = 1024 // Functions over 64K are not decompiled

      2.重新启动IDA,使配置生效。

如果函数太大,逻辑太负载,及时调大MAX_FUNCSIZE也会出现新的错误,比如too complex function,这种情况就无能为力了。官方也解决不了。

如果调大以后,出现卡死问题,建议把值调小一些。

6.local variable allocation failed

  • 成因: 分析函数时,有部分变量对应的区域发生重叠,多见于ARM平台出现Point、Rect等8字节、16字节、32字节结构
  • 解决方案
    • 修改对应参数为多个int
    • 修改ida安装目录下hexrays.cfg中的HO_IGNORE_OVERLAPS

7. F5结果不正确

  • 成因:F5会自动删除其认为不可能到达的死代码
  • 常见起因是一个函数错误的标注为noretur函数
  • 解决方案
    • 进到目前反编译结果,找到最后被调用的函数(被错误分析的函数),双击进入(迫使HexRays重新分析相应函数)
    • 如果上述方案不成功,那么进到被错误分析的函数,按Tab切换到反汇编界面,按Alt+P进入界面取消函数的Does not return 属性

8.local variable allocation failed

  • 成因

    • 分析函数 时,有部分变量对应的区域发生重叠,多见于ARM平台出现point rect等8字节,16字节,32字节结构时尤其多见。

    • 此错误消息意味着反编译器无法使用寄存器和堆栈位置分配本地变量。

    • 只有在配置文件中启用了HO_IGNORE_OVERLAPS之后,才会看到这个错误消息。如果输出中允许有重叠的变量,则以红色显示。

  • 解决方案:

    • 修改对应参数为多个int。
    • 更新函数堆栈帧并创建正确的堆栈变量也可以帮助解决这个问题。