百度首页 | 百度空间
 
查看文章
 
[Tips] JIURL Notepad v1.11 一个bug补丁
2007年11月11日 星期日 上午 01:52

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消失.


类别:Tips | 浏览() | 评论 (2)
 
最近读者:
 
网友评论:
1
2007年11月11日 星期日 上午 03:15
顶void牛
 
2
2007年11月23日 星期五 上午 11:33
哈哈
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码:
 

     

©2008 Baidu