1、通过ollice+GODUP插件,结合IDA分析找到Crash按钮单击后OnBnClickedBtnCrash处理过程,即420d20处。
2、在420D20处下F2断点,运行后通过GODUP插件,可以.map文件的信息导入到Ollyice的注释里,方便查看。
/*420D20*/ push ebp //?OnBnClickedBtnCrash@CTestFloatDlg@@QAEXXZ 00420d20 f TestFloatDlg.obj
/*420D21*/ mov ebp, esp
/*420D23*/ sub esp, 94
/*420D29*/ mov eax, dword ptr [429DA8]
/*420D2E*/ xor eax, ebp
/*420D30*/ mov dword ptr [ebp-C], eax
/*420D33*/ mov dword ptr [ebp-94], ecx
/*420D39*/ mov ax, word ptr [425A30]
/*420D3F*/ mov word ptr [ebp-90], ax
/*420D46*/ push 7E
/*420D48*/ push 0
/*420D4A*/ lea ecx, dword ptr [ebp-8E]
/*420D50*/ push ecx
/*420D51*/ call 0040FD40
/*420D56*/ add esp, 0C
/*420D59*/ fld qword ptr [425DC0]
/*420D5F*/ fstp qword ptr [ebp-8]
/*420D62*/ fld qword ptr [ebp-8]
/*420D65*/ fadd st, st
/*420D67*/ fstp qword ptr [ebp-8]
/*420D6A*/ sub esp, 8
/*420D6D*/ fld qword ptr [ebp-8]
/*420D70*/ fstp qword ptr [esp]
/*420D73*/ push 00425A34 //p
/*420D78*/ push 40
/*420D7A*/ lea edx, dword ptr [ebp-90]
/*420D80*/ push edx
/*420D81*/ call 0040EE02
/*420D86*/ add esp, 14
/*420D89*/ push 40
/*420D8B*/ push 00425A4C //t
/*420D90*/ lea eax, dword ptr [ebp-90]
/*420D96*/ push eax
/*420D97*/ mov ecx, dword ptr [ebp-94]
/*420D9D*/ call 00405C75
/*420DA2*/ mov ecx, dword ptr [ebp-C]
/*420DA5*/ xor ecx, ebp
/*420DA7*/ call 0040ECBD
/*420DAC*/ mov esp, ebp
/*420DAE*/ pop ebp
/*420DAF*/ retn
3、在420D81处,函数在浮点计算过后,调用了处理过程,来将浮点计算结果输出。
4、在40EE02处,可以看到函数__snwprintf
/*40EE02*/ push ebp //__snwprintf 0040ee02 f libcmt:snwprint.obj
/*40EE03*/ mov ebp, esp
/*40EE05*/ sub esp, 20
/*40EE08*/ push ebx
/*40EE09*/ xor ebx, ebx
/*40EE0B*/ cmp dword ptr [ebp+10], ebx
/*40EE0E*/ jnz short 0040EE30
/*40EE10*/ call 0040FCF2
......
5、在413871处,函数主要完成输出任务,在函数体内通过判断输出格式字符,输出相应的格式串
/*413871*/ push ebp //__woutput_l 00413871 f libcmt:woutput.obj
/*413872*/ lea ebp, dword ptr [esp-3F4]
/*413879*/ sub esp, 474
/*41387F*/ mov eax, dword ptr [429DA8]
/*413884*/ xor eax, ebp
/*413886*/ mov dword ptr [ebp+3F0], eax
/*41388C*/ mov eax, dword ptr [ebp+3FC]
......
/*413DFD*/ lea eax, dword ptr [ebp-78]
/*413E00*/ push esi
/*413E01*/ push eax
/*413E02*/ push dword ptr [42A0C8]
/*413E08*/ call 00412D4C
/*413E0D*/ pop ecx
/*413E0E*/ call eax //TestFloa.0041AE1F,错误处理及提示函数
/*413E10*/ mov ebx, dword ptr [ebp-14]
/*413E13*/ add esp, 1C
/*413E16*/ and ebx, 80
/*413E1C*/ je short 00413E39
/*413E1E*/ cmp dword ptr [ebp-18], 0
/*413E22*/ jnz short 00413E39
/*413E24*/ lea eax, dword ptr [ebp-64]
/*413E27*/ push eax
/*413E28*/ push esi
/*413E29*/ push dword ptr [42A0D4]
/*413E2F*/ call 00412D4C
......
5、通过分析原因为:由于需要浮点输出,但由于前面没有定义浮点变量,导致编译器没有链接浮点库,输出时引发R6002错误。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)