首页
社区
课程
招聘
[原创]让记事本[状态栏]不再受[自动换行]影响
发表于: 2010-6-29 18:34 14329

[原创]让记事本[状态栏]不再受[自动换行]影响

2010-6-29 18:34
14329

【软件名称】: NOTEPAD.EXE(来自WinServer2003)
【下载地址】: 附件中
【操作环境】: Windows 7,OD
【作者声明】: 只是学习,没有其他目的。失误之处恳请各位指出!

Windows自带的记事本轻巧方便,但使用中我们发现一个问题,就是不能同时选取【自动换行】和【状态栏】两个菜单项。
开发人员这么做必然有他自己的理由,但我们今天就试着来改变一下。
很自然的,我们想到修改记事本的窗口处理过程。那么我们开始吧!

OD载入notepade.exe,命令行下 bp SendMessageW。
F9运行,断在USER32.SendMessageW。
Alt+M 打开内存映射,在 NOTEPAD 的代码段(.text)F2下访问断点。
F9运行,断在下面:

01003449      8BFF          MOV EDI,EDI
0100344B  /.  55            PUSH EBP
0100344C  |.  8BEC          MOV EBP,ESP
0100344E  |.  51            PUSH ECX
0100344F  |.  51            PUSH ECX
01003450  |.  56            PUSH ESI
01003451  |.  8B75 0C       MOV ESI,DWORD PTR SS:[EBP+C]
01003454  |.  83FE 1C       CMP ESI,1C                               ;  Switch (cases 2..8001)
0100315E  |> \A1 30980001   MOV EAX,DWORD PTR DS:[1009830]           ;  Case 20 of switch 01002BDE
01003163  |.  F7D8          NEG EAX                                  ;  这个分支对应【自动换行】菜单项。
01003165  |.  1BC0          SBB EAX,EAX
01003167  |.  25 00001000   AND EAX,100000
0100316C  |.  05 04012050   ADD EAX,50200104
01003171  |.  50            PUSH EAX                                 ; /Arg1
01003172  |.  E8 EA290000   CALL NOTEPAD.01005B61                    ; \NOTEPAD.01005B61
01003177  |.  85C0          TEST EAX,EAX
01003179  |.  74 12         JE SHORT NOTEPAD.0100318D
0100317B  |.  33C0          XOR EAX,EAX
0100317D  |.  3935 30980001 CMP DWORD PTR DS:[1009830],ESI           ;  DS:[1009830]-->【自动换行】先前状态:0-未选中;1-选中。
01003183  |.  0F94C0        SETE AL
01003186  |.  A3 30980001   MOV DWORD PTR DS:[1009830],EAX
0100318B  |.  EB 1A         JMP SHORT NOTEPAD.010031A7
0100318D  |>  6A 30         PUSH 30                                  ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
0100318F  |.  FF35 3C900001 PUSH DWORD PTR DS:[100903C]              ; |Title = "记事本"
01003195  |.  FF35 54900001 PUSH DWORD PTR DS:[1009054]              ; |Text = "不能进行自动换行,因为该文件的正文太长。"
0100319B  |.  FF35 10980001 PUSH DWORD PTR DS:[1009810]              ; |hOwner = 00011564 ('无标题 - 记事本',class='Notepad')
010031A1  |.  FF15 64120001 CALL DWORD PTR DS:[<&USER32.MessageBoxW>>; \MessageBoxW
010031A7  |>  3935 30980001 CMP DWORD PTR DS:[1009830],ESI
010031AD      74 50         JE SHORT NOTEPAD.010031FF                ;  跳走即说明将要取消自动换行。
010031AF  |.  A1 20980001   MOV EAX,DWORD PTR DS:[1009820]           ;  【状态栏】先前状态:0-未选中;1-选中。
010031B4  |.  3BC6          CMP EAX,ESI
010031B6  |.  A3 24980001   MOV DWORD PTR DS:[1009824],EAX
010031BB      74 13         JE SHORT NOTEPAD.010031D0                ;  若已被选中,则取消选中并使之变灰。
010031BD  |.  56            PUSH ESI                                 ; /lParam
010031BE  |.  53            PUSH EBX                                 ; |wParam
010031BF  |.  68 11010000   PUSH 111                                 ; |Message = WM_COMMAND
010031C4  |.  FFB5 F0FDFFFF PUSH DWORD PTR SS:[EBP-210]              ; |hWnd
010031CA  |.  FF15 3C120001 CALL DWORD PTR DS:[<&USER32.SendMessageW>; \SendMessageW
010031D0  |>  FF35 10980001 PUSH DWORD PTR DS:[1009810]              ; /hWnd = 00011564 ('无标题 - 记事本',class='Notepad')
010031D6  |.  FF15 60120001 CALL DWORD PTR DS:[<&USER32.GetMenu>]    ; \GetMenu
010031DC  |.  56            PUSH ESI                                 ; /Flags
010031DD  |.  8B35 5C120001 MOV ESI,DWORD PTR DS:[<&USER32.GetSubMen>; |USER32.GetSubMenu
010031E3  |.  53            PUSH EBX                                 ; |ItemId
010031E4  |.  8BF8          MOV EDI,EAX                              ; |
010031E6  |.  6A 03         PUSH 3                                   ; |/Pos = 3
010031E8  |.  57            PUSH EDI                                 ; ||hMenu
010031E9  |.  FFD6          CALL ESI                                 ; |\GetSubMenu
010031EB  |.  50            PUSH EAX                                 ; |hMenu
010031EC  |.  FF15 44120001 CALL DWORD PTR DS:[<&USER32.CheckMenuIte>; \CheckMenuItem(注:MF_CHECKED=0x8)
010031F2  |.  6A 01         PUSH 1                                   ;  注:MF_GRAYED=0x1,使【状态栏】变灰。
010031F4  |.  53            PUSH EBX
010031F5  |.  6A 03         PUSH 3                                   ; /Pos = 3
010031F7  |.  57            PUSH EDI                                 ; |hMenu
010031F8  |.  FFD6          CALL ESI                                 ; \GetSubMenu
010031FA  |.^ E9 3FFDFFFF   JMP NOTEPAD.01002F3E
01002F3E  |> /50            PUSH EAX                                 ; |hMenu
01002F3F  |. |FF15 58120001 CALL DWORD PTR DS:[<&USER32.EnableMenuIt>; \EnableMenuItem
01002F45  |. |E9 3D040000   JMP NOTEPAD.01003387

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (15)
雪    币: 41
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
厉害!开眼界了!
2010-6-29 19:04
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
3
我的记事本没[状态栏]
2010-6-29 19:20
0
雪    币: 1981
活跃值: (771)
能力值: ( LV13,RANK:420 )
在线值:
发帖
回帖
粉丝
4
[QUOTE=sessiondiy;830071]我的记事本没[状态栏] [/QUOTE]

我的也没
2010-6-29 20:06
0
雪    币: 500
活跃值: (11)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
5
不同时开是为了不混淆你。

你写一个很长的一个字符串。如果自动换行了,他就是多行。。。但是状态栏难道不该显示实际行数和列数麽?

11111
11111

你显示第二第2列?还是第1行第5列……

不过DIY的不错。
2010-7-4 17:06
0
雪    币: 1045
活跃值: (25)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
说的对,应该按实际保存的数据来显示。我貌似只看到了表象。。。
2010-7-4 19:40
0
雪    币: 78
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
很好呀!楼主继续呀!
2010-7-4 20:59
0
雪    币: 500
活跃值: (11)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
8
呵呵,发现系统的记事本没有对注册表上这2个设置做互斥……

你改的设置好后,系统的打开也都显示了,虽然按钮显示灰色=。=

就是改下注册表2个状态都设置,系统的记事本就和你改的一样了,缺点是不能在菜单上改动了,改了就还原回去了。
2010-7-4 21:18
0
雪    币: 285
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
这个也很有用
2010-7-5 07:42
0
雪    币: 61
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
都是厉害的人啊
2010-7-5 10:03
0
雪    币: 563
活跃值: (101)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
继续DIY
2010-8-8 14:33
0
雪    币: 578
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
刚才才发现记事本在自动换行时状态栏不可用
正好有前辈解决了
2011-2-10 18:29
0
雪    币: 3361
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
好帖,貌似自动换行很有用
2011-5-16 16:10
0
雪    币: 16451
活跃值: (1715)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
最喜欢这样去BUG类文章了,真是好人啊~~~~~
2013-3-5 15:36
0
雪    币: 16451
活跃值: (1715)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
高人东西 就是不一样啊,基本就明白了。折腾一次学到东西了,感谢。
2013-3-5 20:48
0
雪    币: 150
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
MS可能考虑,启用自动换行后,下面显示的是第5行。  但实际的是一行。
2013-6-21 15:16
0
游客
登录 | 注册 方可回帖
返回
//