记脱壳后运行报R6002 floating point support not loaded错误
问题描述
脱壳前程序可以正常运行,脱壳后在使用某些功能时弹出VC++的错误弹窗,描述为floating point support not loaded.
解决问题
先说解决方案:
将__IsNonwritableInCurrentImage
函数的返回值设置为1
定位这个函数可以搜索特征码4D 5A,目的位置距离函数头部很近,且函数不大。大概长这样:
在此处下断点运行,断住后上一层调用为__IsNonwritableInCurrentImage
函数。
复现
编写一段包含浮点计算的代码,易语言示例:
分别使用不同链接器进行链接,这里从vc6测试到vc2013,编译加壳后脱壳,得到如下文件:
经测试,vc8、vc9、vc2010和vc2013链接的文件脱壳后调用浮点运算都会运行时错误,vc6和vc7则不会。
定位问题所在
弹窗后,在调试器中暂停,调用堆栈中定位到用户代码,逐层调用检查。
发现这里有一个退出,先跳过。EIP设置到下一条指令,随后正常单步调试。
继续回到上层调用。之后会来到一个较大的库函数,调用的函数由decode_pointer
返回:
观察传入的参数:
默认的值指向__fptrap
这个函数,也就是我们刚刚报错的函数。
检查它的交叉引用,会定位到一个名为__cfltcvt_init
的函数,__fpmath
函数调用了它,而__fpmath
又被__cinit
调用
最终看到这里的代码逻辑:
_cinit函数
vc6和vc7
vc6和vc7只判断了指向__fpmath
的指针不为空,就会初始化__fpmath
vc8、vc9、vc2010、vc2013
vc8、vc9、vc2010和vc2013都判断了指向__fpmath
的指针不为空,并且指针所在区段没有写入属性,才会执行__fpmath
函数。
脱壳后文件的区段有了可写属性,所以__fpmath
函数不会执行。最终导致了运行时错误。
PS:这个运行时错误可能会借着其他库函数报出来,不同程序在出现这个错误的时候分析过程可能与上方的不一致。
实例下载
参考
程序加壳后报R6002,和浮点库相关,各位帮忙啊-加壳脱壳-看雪
脱壳后运行显示”foating point support not loaded”-加壳脱壳-看雪
拓展资料
非本文原因导致的该错误:R6002- floating point support not loaded问题的一种解决方法
利用初始化浮点支持机制出的题:[结束][第一阶段◇第三题]看雪论坛.腾讯公司2008软件安全技术竞赛-4)腾讯公司2008软件安全竞赛-看雪