欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]解决IDA的F5(hexray 1.5)不能用于FPU栈用满的情况

[原创]解决IDA的F5(hexray 1.5)不能用于FPU栈用满的情况

尝试分析一段fpu指令,测试了让fpu stack占用到7个(st0~st6)都没问题,一旦使用到st7,hexray插件就会打一个inconsistent fpu stack然后直接给汇编。
比如这样的代码:
                fld1
                fld1
                fld1
                fld1
                fld1
                fld1
                fld1
                faddp st(1), st
                faddp st(1), st
                faddp st(1), st
                faddp st(1), st
                faddp st(1), st
                faddp st(1), st
F5可以正确反编译:
        return 1.0 + 1.0 + 1.0 + 1.0 + 1.0 + 1.0 + 1.0;
可只要用到ST7:
                fld1
                fld1
                fld1
                fld1
                fld1
                fld1
                fld1
                fld1
                faddp st(1), st
                faddp st(1), st
                faddp st(1), st
                faddp st(1), st
                faddp st(1), st
                faddp st(1), st
                faddp st(1), st
就报告inconsistent fpu stack并给出这样的结果:
  __asm
  {
    fld1
    fld1
    fld1
    fld1
    fld1
    fld1
    fld1
    fld1
    faddp   st(1), st
    faddp   st(1), st
    faddp   st(1), st
    faddp   st(1), st
    faddp   st(1), st
    faddp   st(1), st
    faddp   st(1), st
  }

个人猜测这应该是个bug,觉得会不会插件实现的代码用了类似if(countof(fpu_stack)>=8) log_error(...)这样的代码……
不知有没有前辈遇到同样问题的,求指教

自己找到这个bug并修复了。1.5版本的hexray插件有这个bug,不确定其它版本是否存在。
在这段代码中会检查整个函数段中的fpu栈深度是否都小于8:
170F0401  |.  2957 04       |sub     dword ptr [edi+4], edx
170F0404      837CF0 04 09  cmp     dword ptr [eax+esi*8+4], 8 <- 这个改成9
170F0409  |.  7C 05         |jl      short 170F0410
170F040B  |.  C64424 17 00  |mov     byte ptr [esp+17], 0
具体位置在hexrays.plw 000EF808: 08 -> 09

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功