[原创]解决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
