能力值:
(RANK:280 )
|
-
-
2 楼
第三题的问题出在420D81的函数__snwprintf上,虽然参数传递没有问题,但是因为编译器优化的原因,该函数对浮点数转换的处理没有被编译进该exe,如果单独patch补足所有的浮点数处理代码太繁琐,因此写了一个动态库pediydll.dll,输出一个naked函数"my_snwprintf",该函数只有一条指令
jmp _snwprintf
直接跳转到完整的_snwprintf处理函数
然后修改420D81处的代码跳转至421D00
.text:00420D81 E9 7A 0F 00 00 jmp loc_421D00
并在421D00处实现如下代码加载pediydll.dll并且调用完整版本的_snwprintf函数,随后跳回到
420D86返回原始流程
.text:00421D00 68 20 1D 42 00 push offset aPediydll_dll ; "pediydll.dll" .text:00421D05 FF 15 C4 21 42 00 call ds:LoadLibraryA .text:00421D0B 68 30 1D 42 00 push offset aMy_snwprintf ; "my_snwprintf" .text:00421D10 50 push eax ; hModule .text:00421D11 FF 15 50 22 42 00 call ds:GetProcAddress .text:00421D17 FF D0 call eax ; .text:00421D19 E9 68 F0 FF FF jmp loc_420D86 .text:00421D19 ; END OF FUNCTION CHUNK FOR sub_420D20 .text:00421D19 ; --------------------------------------------------------------------------- .text:00421D1E 00 00 align 10h .text:00421D20 70 65 64 69 79 64+aPediydll_dll db 'pediydll.dll',0 .text:00421D2D 00 00 00 align 10h .text:00421D30 6D 79 5F 73 6E 77+aMy_snwprintf db 'my_snwprintf',0
|
能力值:
(RANK:170 )
|
-
-
3 楼
出错地点已经找到,但是原因不正确:)
|
能力值:
(RANK:280 )
|
-
-
4 楼
重新上传,之前误解msdn了
不是编译器优化没有编译进去,而是缺省没有调用而已
|
能力值:
(RANK:280 )
|
-
-
5 楼
程序启动阶段___tmainCRTStartup函数中调用了__cinit函数,在这个函数的第一个判断是校验浮点运算初始化函数指针所处的section是否为可写,如果可写的话就跳过浮点运算初始化函数,因此缺省情况下函数_snwprintf会直接显示出错信息并退出,如果该section,也就是.rdata不可写,代码会调用浮点运算初始化函数,缺省的指向出错函数的指针会被替换成正常处理函数,因此可以正常运算并显示PI * 2 = 6.283180
可惜之前误解msdn还以为是编译器没有编译进去这部分代码,原来只不过是没调用而已,汗一个
|
能力值:
(RANK:280 )
|
-
-
6 楼
忘记说解决办法了,就是修改文件地址0x22F处的.rdata section的特征符,将该数值从0xC0改成0x40即可
|
能力值:
( LV12,RANK:250 )
|
-
-
7 楼
结果提交时间 4 小时 30 分钟
结果提交时间长度 = 270 分钟
结果提交次数 = 2
结果提交为根本原因
得分 = [(2880 - 270)/2880]^1/5 x 1.0 x 100 - (2 -1 ) x 5 = 93.05
|
|
|