-
-
[原创]第一阶段第三题
-
发表于:
2008-10-8 21:17
2766
-
分析过程:
打开TestFloat.map搜索"Crash",得到:
0001:0001fd20 ?OnBnClickedBtnCrash@CTestFloatDlg@@QAEXXZ 00420d20 f TestFloatDlg.obj
说明00420d20是点击按钮Crash的处理过程,来到OnBnClickedBtnCrash过程,经跟踪发现
00420D81 E8 7CE0FEFF call 0040EE02
处发生错误
到TestFloat.map搜索0040EE02发现是__snwprintf
到Google和MSDN中搜runtime error R6002,发现
出错原因是:“编译器仅当必要时才通过加载浮点支持以最小化程序大小。编译器无法检测到格式字符串中的浮点格式规范,因此编译器未加载必要的浮点例程。”也就是说编译器出于优化的目的,没有加载浮点运算模块,导致_snwprintf函数处理浮点数的时候出错。
解决方案:
用动态库中的同名函数_snwprintf替换程序中对_snwprintf的调用
00420D81处改为:
00420D81 . /E9 1D0F0000 jmp 00421CA3
00421CA3处代码:
00421CA3 > \68 971C4200 push 00421C97 ; /ProcNameOrOrdinal = "_snwprintf"
00421CA8 . 68 8C1C4200 push 00421C8C ; |/FileName = "msvcrt.dll"
00421CAD . E8 C9003E7C call kernel32.LoadLibraryA ; |\LoadLibraryA
00421CB2 . 50 push eax ; |hModule
00421CB3 . E8 78913E7C call kernel32.GetProcAddress ; \GetProcAddress
00421CB8 . FFD0 call eax
00421CBA .^ E9 C7F0FFFF jmp 00420D86
附修正后的程序文件
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!