author: void#ph4nt0m.org
date: 2007-11-11
JIURL Notepad v1.11 一个bug补丁
--------------------------------------------------
下载地址: http://thejiurl.googlepages.com/jiurlpad20060514cn.zip
JIURL写的这个记事本很不错,我一直用来代替系统的notepad.exe :-)
但是有个Bug:
直接打开jiurlpad.exe,写点东西,弹框,要求文件名,取好文件名保存;再编辑,保存,又弹出"保存"对话框,要求输入文件名.搞得很郁闷.
前几天闲来无事,就调试了下.
(如果不想看分析.直接16进制patch下就行了)
---------------------------------------------------------
fc的结果:
正在比较文件 jiurlpad_old.exe 和 JIURLPAD_PATCH.EXE
00003CE5: 4F 48
00003CE6: 52 47
---------------------------------------------------------
思路很简单: 断弹出的"保存"对话框,然后回溯看调用.
bp GetSaveFileNameA
Alt+K,回溯到上层函数,如下:
00403740 /$ A1 48474100 MOV EAX,DWORD PTR DS:[414748] <== 一个全局变量,初始数值是1
00403745 |. 83EC 10 SUB ESP,10
00403748 |. 83F8 01 CMP EAX,1
0040374B |. 53 PUSH EBX
0040374C |. 56 PUSH ESI
0040374D |. 75 13 JNZ SHORT 00403762 <=== [414748] != 1, 就不弹框
0040374F |. 8B4424 1C MOV EAX,DWORD PTR SS:[ESP+1C]
00403753 |. 50 PUSH EAX
00403754 |. E8 27020000 CALL 00403980 <=== 里面调用了GetSaveFileNameA,从这里回溯出来
00403759 |. 83C4 04 ADD ESP,4
0040375C |. 5E POP ESI
0040375D |. 5B POP EBX
0040375E |. 83C4 10 ADD ESP,10
00403761 |. C3 RETN
00403762 |> 6A 00 PUSH 0 ; /hTemplateFile = NULL
00403764 |. 68 80000000 PUSH 80 ; |Attributes = NORMAL
00403769 |. 6A 03 PUSH 3 ; |Mode = OPEN_EXISTING
0040376B |. 6A 00 PUSH 0 ; |pSecurity = NULL
0040376D |. 6A 01 PUSH 1 ; |ShareMode = FILE_SHARE_READ
0040376F |. 68 000000C0 PUSH C0000000 ; |Access = GENERIC_READ|GENERIC_WRITE
00403774 |. 68 4C514100 PUSH 0041514C ; |FileName = ""
00403779 |. FF15 98104100 CALL DWORD PTR DS:[<&KERNEL32.CreateFile>; \CreateFileA
0040377F |. 8BF0 MOV ESI,EAX
00403781 |. 83FE FF CMP ESI,-1
所以,猜想是函数00403980里面,GetSaveFileNameA成功后没有将全局标志[414748]置0,所以导致这个bug.
为了验证这个想法,给414748下内存写入断点.发现在两次Ctrl+S(取名字,再保存)过程中,都没写这个地址,看来问题的确出在这里.
进00403980,跟了下"保存"成功后的流程,准备在某处补上一句MOV DWORD PTR DS:[414748], 0.
最后到了如下代码处:
...
00403CE2 |. 56 PUSH ESI
00403CE3 |. C605 4F524100>MOV BYTE PTR DS:[41524F],0 <===奇怪?这个全局变量只在这里用一次.既然如此,索性就把524F改成4748.
00403CEA |. E8 B1EEFFFF CALL 00402BA0
00403CEF |. 83C4 14 ADD ESP,14
00403CF2 |. B8 01000000 MOV EAX,1
00403CF7 |. 5F POP EDI
00403CF8 |. 5E POP ESI
00403CF9 |. 5D POP EBP
00403CFA |. 81C4 6C010000 ADD ESP,16C
00403D00 \. C3 RETN
保存测试,bug消失.