PEview

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