PEview 修正错误提醒
前言
在《逆向工程核心原理》作者的站点上下载的PEview,在点击特定树树项时运行会报错,这里将记录如何修正该错误:
开始
采用x32dbg
载入,然后在PEview.exe
中搜索字符串引用:press ok
下断。执行并触发断点,向上找到触发位置:
由rep movsb
引发异常,跳转到报错弹窗,这里引发异常的原因在于esi
寄存器中的地址,不是正确的内存地址,那么重新加载定位40AA4C
地址的赋值操作,发现是由GetDateFormatA
完成日期赋值:
然后由GetTimeFormatA
获取时间,保存在日期字符串后面:
但恰恰是这两个函数在连续调用时,GetTimeFormatA
执行前未对GetDateFormatA
的执行结果进行判断,直接在[edi+eax-0x1]
处进行了插入,由于GetDateFormatA
执行后,eax
被赋值为0,导致40AA4C
处存放的40AA50
被复写成了3140AA50
,从而导致在内存复制时出错。
查看GetDateFormatA
的函数说明和GetTimeFormatA
的函数说明,可以得知是GetDateFormatA
函数的参数出了问题:
00404A85 | 6A 10 | push 10 | cchDate
00404A87 | 57 | push edi | lpDateStr
00404A88 | 68 D4D14000 | push peview.40D1D4 | lpFormat
00404A8D | 50 | push eax | *lpDate
00404A8E | 6A 00 | push 0 | dwFlags
00404A90 | 68 00080000 | push 800 | Locale
00404A95 | FF15 44434100 | call dword ptr ds:[<&GetDateFormatA>] |
在当前系统环境下,将cchDate
设置为0x20
可以满足当前需求:
00404A85 | 6A 10 | push 20 | cchDate
修改后实际测试如下:
修改方法
下载原版PEview.exe,然后打开hexed.it,上传文件,前往0x3E86
地址,将10
修改为20
: