-
-
[原创]让记事本[状态栏]不再受[自动换行]影响
-
发表于:
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直播授课