首页
社区
课程
招聘
[原创]第一阶段第三题
发表于: 2008-10-8 21:17 2767

[原创]第一阶段第三题

2008-10-8 21:17
2767
分析过程:
打开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


附修正后的程序文件

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 264
活跃值: (30)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
2
错误请重新考虑下!!!
2008-10-14 16:03
0
游客
登录 | 注册 方可回帖
返回
//