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:
