记脱壳后运行报R6002 floating point support not loaded错误

问题描述

image-20240804160803659

脱壳前程序可以正常运行,脱壳后在使用某些功能时弹出VC++的错误弹窗,描述为floating point support not loaded.

解决问题

先说解决方案:

__IsNonwritableInCurrentImage函数的返回值设置为1

定位这个函数可以搜索特征码4D 5A,目的位置距离函数头部很近,且函数不大。大概长这样:

image-20240804172510427

在此处下断点运行,断住后上一层调用为__IsNonwritableInCurrentImage函数。

复现

编写一段包含浮点计算的代码,易语言示例:

image-20240804162020458

分别使用不同链接器进行链接,这里从vc6测试到vc2013,编译加壳后脱壳,得到如下文件:

image-20240804165027277

经测试,vc8、vc9、vc2010和vc2013链接的文件脱壳后调用浮点运算都会运行时错误,vc6和vc7则不会。

定位问题所在

弹窗后,在调试器中暂停,调用堆栈中定位到用户代码,逐层调用检查。

发现这里有一个退出,先跳过。EIP设置到下一条指令,随后正常单步调试。

image-20240804174319345

继续回到上层调用。之后会来到一个较大的库函数,调用的函数由decode_pointer返回:

image-20240804174615081

观察传入的参数:

image-20240804174712920

默认的值指向__fptrap这个函数,也就是我们刚刚报错的函数。

检查它的交叉引用,会定位到一个名为__cfltcvt_init的函数,__fpmath函数调用了它,而__fpmath又被__cinit调用

最终看到这里的代码逻辑:

image-20240804175111612

_cinit函数

vc6和vc7

image-20240804165406529

vc6和vc7只判断了指向__fpmath的指针不为空,就会初始化__fpmath

vc8、vc9、vc2010、vc2013

image-20240804170202019

vc8、vc9、vc2010和vc2013都判断了指向__fpmath的指针不为空,并且指针所在区段没有写入属性,才会执行__fpmath函数。

脱壳后文件的区段有了可写属性,所以__fpmath函数不会执行。最终导致了运行时错误。

PS:这个运行时错误可能会借着其他库函数报出来,不同程序在出现这个错误的时候分析过程可能与上方的不一致。

实例下载

文章用到的所有文件.zip

参考

加壳对运行时库中浮点操作支持问题-加壳脱壳-看雪

程序加壳后报R6002,和浮点库相关,各位帮忙啊-加壳脱壳-看雪

脱壳后运行显示”foating point support not loaded”-加壳脱壳-看雪

脱upx壳踩的一些坑 - bodong - 博客园

拓展资料

非本文原因导致的该错误:R6002- floating point support not loaded问题的一种解决方法

利用初始化浮点支持机制出的题:[结束][第一阶段◇第三题]看雪论坛.腾讯公司2008软件安全技术竞赛-4)腾讯公司2008软件安全竞赛-看雪