首页
社区
课程
招聘
[原创]添加记事本置顶\托盘\字体颜色功能
发表于: 2009-11-26 21:07 18961

[原创]添加记事本置顶\托盘\字体颜色功能

2009-11-26 21:07
18961

【文章标题】: 打造记事本置顶功能
【文章作者】: wxxw
【软件名称】: 系统自带
【保护方式】: 无壳
【编写语言】: Microsoft Visual C++ 7.0 Method2
【使用工具】: PEID 0.95  Olldbg1.10  resscope lordpe
【操作平台】: XP sp3
【软件介绍】: 不用介绍了吧
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
   早有前人实现了该功能,虽说是别人嚼过的馍,可我还是想自己动手试试
首先先设想下做成什么样?我们想在菜单里添加一项“置顶”,选择后完成置顶功能,取消后恢复原状,类似菜单“格式”下的“自动换行”,设想好了,开始动工

因为有系统文件还原保护,所以先将notepad.exe复制为notepad1.exe,然后在资源管理器--“工具”--“文件夹选项”--“文件类型”将txt文件更改为notepad1.exe打开,前备工作做完了,现在开始正式修改了,首先用资源工具(如rescope,exescope)修改菜单资源,比如我在“查看”下添加一菜单项“置顶”,ID自己随便写,如这里写为28,然后用LORDPE在输入表里添加user32.dll里函数SetWindowPos(完成置顶及释放置顶)还需要函数GetMenu,CheckMenuItem(完成菜单项前面的选择标记和取消),这两个函数源程序里已经有了,用OD载入程序notepad1.exe,F9运行,然后在77d1870c(这个地址由来详见http://bbs.pediy.com/showthread.php?t=98274)下条件断点[esp+c]==WM_COMMAND && [esp+14]==0 ,这里[esp+c]是消息码,[esp+10]是消息wparam,[esp+14]是消息lparam,因为菜单的lparam是0,所以加上[esp+14]==0条件,如果不加,一切换到notepad1,就会中断了,这是因为notepad的edit控件发出了WM_COMMAND,好了,选择“置顶”菜单,断下来,来到窗口回调函数01003429,F7单步,来到处理WM_COMMAND消息代码01002b87,继续单步来到如下代码

01002BBE   .  83FF 40       CMP EDI,40                               ;  Switch (cases 1..303)
01002BC1   .  8995 F0FDFFFF MOV DWORD PTR SS:[EBP-210],EDX
01002BC7   .  0F8F F9060000 JG notepad1.010032C6
01002BCD   .  0F84 DB060000 JE notepad1.010032AE
01002BD3   .  83FF 15       CMP EDI,15
01002BD6   .  0F8F CE020000 JG notepad1.01002EAA
01002BDC   .  0F84 EC030000 JE notepad1.01002FCE
01002BE2   .  83FF 05       CMP EDI,5
01002BE5   .  0F8F 74020000 JG notepad1.01002E5F
01002BEB   .  0F84 0B020000 JE notepad1.01002DFC
01002BF1   .  4F            DEC EDI
01002BF2   .  0F84 F8010000 JE notepad1.01002DF0
01002BF8   .  4F            DEC EDI
01002BF9   .  0F84 0E010000 JE notepad1.01002D0D
01002BFF   .  4F            DEC EDI
01002C00   .  74 0A         JE SHORT notepad1.01002C0C
01002C02   .  4F            DEC EDI
01002C03   .  74 32         JE SHORT notepad1.01002C37
01002C05   >  33C0          XOR EAX,EAX                              ;  Default case of switch 01003024
01002C07   .  E9 5E070000   JMP notepad1.0100336A
......
01002EAA   > \83FF 1A       CMP EDI,1A
01002EAD   .  0F8F 95580000 JG notepad1.01003019
01002EB3   .  0F84 55010000 JE notepad1.0100300E
01002EB9   .  83EF 16       SUB EDI,16
01002EBC   .  0F84 F4000000 JE notepad1.01002FB6
01002EC2   .  4F            DEC EDI
01002EC3   .  0F84 93000000 JE notepad1.01002F5C
01002EC9   .  4F            DEC EDI
01002ECA   .  74 5E         JE SHORT notepad1.01002F2A
01002ECC   .  4F            DEC EDI
01002ECD   .^ 0F85 32FDFFFF JNZ notepad1.01002C05
01008748   > \6A 1C         PUSH 1C
0100874A   .  5B            POP EBX
0100874B   .  3BFB          CMP EDI,EBX
0100874D   .^ 0F85 C6A8FFFF JNZ notepad1.01003019
01008753   .  803D 47870001>CMP BYTE PTR DS:[1008747],1              ;  Case 1C of switch 01002BBE
0100875A   .  74 35         JE SHORT notepad1.01008791
0100875C   .  C605 47870001>MOV BYTE PTR DS:[1008747],1
01008763   .  60            PUSHAD
01008764   .  6A 03         PUSH 3                                   ; /Flags = SWP_NOSIZE|SWP_NOMOVE
01008766   .  6A 00         PUSH 0                                   ; |Height = 0
01008768   .  6A 00         PUSH 0                                   ; |Width = 0
0100876A   .  6A 00         PUSH 0                                   ; |Y = 0
0100876C   .  6A 00         PUSH 0                                   ; |X = 0
0100876E   .  6A FF         PUSH -1                                  ; |InsertAfter = HWND_TOPMOST
01008770   .  52            PUSH EDX                                 ; |hWnd
01008771   .  FF15 1A300101 CALL DWORD PTR DS:[<&USER32.SetWindowPos>; \SetWindowPos
01008777   .  61            POPAD
01008778   .  60            PUSHAD
01008779   .  52            PUSH EDX                                 ; /hWnd
0100877A   .  FF15 64120001 CALL DWORD PTR DS:[<&USER32.GetMenu>]    ; \GetMenu
01008780   .  6A 08         PUSH 8                                   ; /Flags = MF_BYCOMMAND|MF_ENABLED|MF_CHECKED|MF_STRING
01008782   .  6A 1C         PUSH 1C                                  ; |ItemId = 1C (28.)
01008784   .  50            PUSH EAX                                 ; |hMenu
01008785   .  FF15 48120001 CALL DWORD PTR DS:[<&USER32.CheckMenuIte>; \CheckMenuItem
0100878B   .  61            POPAD
0100878C   .^ E9 88A8FFFF   JMP notepad1.01003019
01008791   >  C605 47870001>MOV BYTE PTR DS:[1008747],0
01008798   .  60            PUSHAD
01008799   .  6A 03         PUSH 3                                   ; /Flags = SWP_NOSIZE|SWP_NOMOVE
0100879B   .  6A 00         PUSH 0                                   ; |Height = 0
0100879D   .  6A 00         PUSH 0                                   ; |Width = 0
0100879F   .  6A 00         PUSH 0                                   ; |Y = 0
010087A1   .  6A 00         PUSH 0                                   ; |X = 0
010087A3   .  6A FE         PUSH -2                                  ; |InsertAfter = HWND_NOTOPMOST
010087A5   .  52            PUSH EDX                                 ; |hWnd
010087A6   .  FF15 1A300101 CALL DWORD PTR DS:[<&USER32.SetWindowPos>; \SetWindowPos
010087AC   .  61            POPAD
010087AD   .  60            PUSHAD
010087AE   .  52            PUSH EDX                                 ; /hWnd
010087AF   .  FF15 64120001 CALL DWORD PTR DS:[<&USER32.GetMenu>]    ; \GetMenu
010087B5   .  6A 00         PUSH 0                                   ; /Flags = MF_BYCOMMAND|MF_ENABLED|MF_STRING
010087B7   .  6A 1C         PUSH 1C                                  ; |ItemId = 1C (28.)
010087B9   .  50            PUSH EAX                                 ; |hMenu
010087BA   .  FF15 48120001 CALL DWORD PTR DS:[<&USER32.CheckMenuIte>; \CheckMenuItem
010087C0   .  61            POPAD
010087C1   .^ E9 53A8FFFF   JMP notepad1.01003019
010034C5   > \8B45 10       MOV EAX,DWORD PTR SS:[EBP+10]            ;  EAX里为WM_SIZE的wparam,最小化时为1
010034C8   .  33F6          XOR ESI,ESI
010034CA   .  2BC6          SUB EAX,ESI 
010034CC   .  74 06         JE SHORT notepad7.010034D4                                
010034CE   .  48            DEC EAX                                  ;  Switch (cases 1..2)
010034CF   .  74 49         JE SHORT notepad7.0100351A                              ;这里就是跳到处理最小化的消息 0100351A
 
010087C6   > \60            PUSHAD
010087C7   .  6A 00         PUSH 0                                   ; /ShowState = SW_HIDE
010087C9   .  FF75 08       PUSH DWORD PTR SS:[EBP+8]                ; |hWnd
010087CC   .  FF15 B0110001 CALL DWORD PTR DS:[<&USER32.ShowWindow>] ; \ShowWindow
010087D2   .  6A 02         PUSH 2                                   ; /RsrcName = 2.
010087D4   .  68 00000001   PUSH notepad7.01000000                   ; |hInst = 01000000
010087D9   .  FF15 EC110001 CALL DWORD PTR DS:[<&USER32.LoadIconW>]  ; \LoadIconW
010087DF   .- E9 1CB80000   JMP notepad7.01014000                  ;01014000是我新加的代码节
...............
01014000    A3 14410101     MOV DWORD PTR DS:[1014114],EAX       ;我将NOTIFYICONDATA结构数据预先放在01014100处,这里写入hicon     
01014005    8B45 08         MOV EAX,DWORD PTR SS:[EBP+8]
01014008    A3 04410101     MOV DWORD PTR DS:[1014104],EAX       ;这里写入hwnd
0101400D    68 00410101     PUSH notepad7.01014100
01014012    6A 00           PUSH 0
01014014    FF15 41300101   CALL DWORD PTR DS:[<&shell32.Shell_Notif>; shell32.Shell_NotifyIconA
0101401A    61              POPAD
0101401B    8BE5            MOV ESP,EBP
0101401D    5D              POP EBP
0101401E    C3              RETN
0100343B   .- 0F87 DE0B0100 JA notepad7.0101401F
......
0101401F    81FE 05040000   CMP ESI,405
01014025  - 0F85 57F6FEFF   JNZ notepad7.01003682
0101402B    837D 10 00      CMP DWORD PTR SS:[EBP+10],0
0101402F  - 0F85 4DF6FEFF   JNZ notepad7.01003682
01014035    817D 14 0102000>CMP DWORD PTR SS:[EBP+14],201
0101403C    75 6A           JNZ SHORT notepad7.010140A8
0101403E    60              PUSHAD
0101403F    6A 09           PUSH 9
01014041    FF75 08         PUSH DWORD PTR SS:[EBP+8]
01014044    FF15 B0110001   CALL DWORD PTR DS:[<&USER32.ShowWindow>] ; user32.ShowWindow
0101404A    FF75 08         PUSH DWORD PTR SS:[EBP+8]
0101404D    FF15 BC300101   CALL DWORD PTR DS:[<&USER32.SetForegroun>; user32.SetForegroundWindow
01014053    68 00410101     PUSH notepad7.01014100
01014058    6A 02           PUSH 2
0101405A    FF15 41300101   CALL DWORD PTR DS:[<&shell32.Shell_Notif>; shell32.Shell_NotifyIconA
01014060    61              POPAD
01014061    8BE5            MOV ESP,EBP
01014063    5D              POP EBP
01014064    C3              RETN
01003434   .- E9 2F0C0100   JMP notepad7.01014068
.......
01014068    83FE 01         CMP ESI,1
0101406B    0F85 81000000   JNZ notepad7.010140F2
01014071    60              PUSHAD
01014072    FF15 C0300101   CALL DWORD PTR DS:[<&USER32.CreatePopupM>; user32.CreatePopupMenu
01014078    A3 00420101     MOV DWORD PTR DS:[1014200],EAX          ;保存菜单句柄备后用     
0101407D    68 10420101     PUSH notepad7.01014210                   ; ASCII "restore"   自己先写好的菜单字符串
01014082    6A 1D           PUSH 1D
01014084    6A 00           PUSH 0
01014086    50              PUSH EAX
01014087    FF15 C8300101   CALL DWORD PTR DS:[<&USER32.AppendMenuA>>; user32.AppendMenuA
0101408D    68 20420101     PUSH notepad7.01014220                   ; ASCII "exit"     自己先写好的菜单字符串
01014092    6A 1E           PUSH 1E
01014094    6A 00           PUSH 0
01014096    FF35 00420101   PUSH DWORD PTR DS:[1014200]
0101409C    FF15 C8300101   CALL DWORD PTR DS:[<&USER32.AppendMenuA>>; user32.AppendMenuA
010140A2    61              POPAD
010140A3    EB 4D           JMP SHORT notepad7.010140F2
......
010140F2    83FE 1C         CMP ESI,1C                                          ;这里是恢复原来01003434的代码,返回执行
010140F5    57              PUSH EDI
010140F6    6A 08           PUSH 8
010140F8    5A              POP EDX
010140F9  - E9 3DF3FEFF     JMP notepad7.0100343B
010140A8    817D 14 0502000>CMP DWORD PTR SS:[EBP+14],205
010140AF  - 0F85 CDF5FEFF   JNZ notepad7.01003682
010140B5    60              PUSHAD
010140B6    68 00430101     PUSH notepad7.01014300
010140BB    FF15 38120001   CALL DWORD PTR DS:[<&USER32.GetCursorPos>; user32.GetCursorPos
010140C1    FF75 08         PUSH DWORD PTR SS:[EBP+8]
010140C4    FF15 BC300101   CALL DWORD PTR DS:[<&USER32.SetForegroun>; user32.SetForegroundWindow
010140CA    6A 00           PUSH 0
010140CC    FF75 08         PUSH DWORD PTR SS:[EBP+8]
010140CF    6A 00           PUSH 0
010140D1    FF35 04430101   PUSH DWORD PTR DS:[1014304]
010140D7    90              NOP
010140D8    FF35 00430101   PUSH DWORD PTR DS:[1014300]
010140DE    90              NOP
010140DF    6A 08           PUSH 8
010140E1    FF35 00420101   PUSH DWORD PTR DS:[1014200]
010140E7    FF15 C4300101   CALL DWORD PTR DS:[<&USER32.TrackPopupMe>; user32.TrackPopupMenu
010140ED    61              POPAD
010140EE    8BE5            MOV ESP,EBP
010140F0    5D              POP EBP
010140F1    C3              RETN

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (19)
雪    币: 95
活跃值: (419)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
2
改造后的结果如下,其实我很想把菜单弄到窗口右键菜单中,可不知道怎么弄,窗口的标题栏有点怪,我下了右键WM_RBUTTONUP消息断点,可在标题栏上点击右键,断不下来,究竟是怎么回事呢?那位兄弟能指点下,谢谢!
上传的附件:
2009-11-26 21:14
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我也去试一下
2009-11-26 21:17
0
雪    币: 95
活跃值: (419)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
4
哈哈,刚才在学习托盘,无意中在msdn里发现下面
If a user selects a notify icon's shortcut menu with the keyboard, the version 5.0 Shell sends the associated application a WM_CONTEXTMENU message. Earlier versions send WM_RBUTTONDOWN and WM_RBUTTONUP messages.
于是猜测标题栏右键是不是也是发的WM_CONTEXTMENU消息,刚刚测试断下了。。。

刚才又发现有WM_NCRBUTTONUP消息类型,这个莫不是原始第一手消息,可是用这个还是在标题栏断不了,倒是在工具栏点右键断下了。。。
2009-11-26 22:19
0
雪    币: 95
活跃值: (419)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
5
郁闷,刚才想了个主意,在77d1870c下了个条件记录,表达式为[esp+c],记录表达数值永远,然后在notepad标题栏点了下右键,然后在OD里打开记录窗口,找到7B(WM_CONTEXTMENU),然后发现前面几个消息依次为215,BB,C9,B0,A4..,其中A4就是WM_NCRBUTTONDOWN,奇怪的是从A4到7B确实没有WM_NCRBUTTONUP(A5),我都迷糊了。。。
2009-11-26 23:15
0
雪    币: 95
活跃值: (419)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
6
新加了点功能,只是我想在标题栏的弹出菜单里加一项的设想还是不知道怎么实现?如果知道弹出菜单的句柄,就可以用apendmenu,insertmenu等,但现在跟踪消息是进入系统领空,没法得到这个菜单的句柄,哪位大哥能指点下啊,谢谢!
2009-11-30 22:30
0
雪    币: 431
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
关注 学习了~~~
2009-11-30 23:08
0
雪    币: 95
活跃值: (419)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
8
好事多磨,仔细想了一下,既然标题栏右键菜单是在系统dll里实现的,也许菜单资源也在系统dll里,用resscope查看了下user32.dll资源,没想到有不小的收获,不光标题栏的右键菜单在里面,还有edit控件的右键菜单。。。等等,现在就好办了,先GetModuleHandle,再LoadMenu,然后AppendMenu,TrackPopupMenu,菜单是出来了,可是点击菜单项无效,仔细跟踪对比,发现源程序系统菜单发出的消息不是111(WM_COMMAND),而是112,查了一下原来叫WM_SYSCOMMAND,在MSDN一搜,就搜到了
GetSystemMenu,原来这个函数就是获取窗口菜单的,还有下面的东东

The menu items in a window menu can be modified by using the GetSystemMenu, AppendMenu, InsertMenu, ModifyMenu, InsertMenuItem, and SetMenuItem functions. Applications that modify the window menu must process WM_SYSCOMMAND messages.

呵呵,早知道有这个函数就好了,先实现了标题栏菜单里添加项的功能,明天再加消息处理
话说还是要对winapi非常熟悉才行,否则太浪费时间了,惭愧啊
上传的附件:
2009-12-1 23:12
0
雪    币: 95
活跃值: (419)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
9
添加了字体颜色功能,截图如下,只是整个编辑框里的都变色了,我很想知道像WORD里可以随便改变某处字体颜色是怎么实现的??有没朋友指点下,谢谢
上传的附件:
2010-1-7 19:08
0
雪    币: 236
活跃值: (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
貌似还不错的说
2010-5-16 17:03
0
雪    币: 457
活跃值: (49)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
挺好的。。有创意
2010-5-18 10:54
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
真诚的向高手学习。
2010-5-18 11:10
0
雪    币: 780
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
好好学习学习
2010-5-18 11:20
0
雪    币: 96
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
学习下,真是厉害啊~~
2010-5-22 16:21
0
雪    币: 156
活跃值: (190)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
15
这样的楼主 大家要顶死 !!
2010-7-12 18:27
0
雪    币: 233
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
很好很强大 很长知识
2010-10-2 20:39
0
雪    币: 391
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
17
学习了,不错的教程,可以参考
2010-12-2 17:39
0
雪    币: 52
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
win7下的记事本好像有点点小变化?依葫芦画个瓢去 谢谢wxxw大哥了
2011-5-24 09:17
0
雪    币: 38
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
LZ :我下了resscope ,但是就是不能修改菜单资源,求解中!
首先用资源工具(如rescope,exescope)修改菜单资源,比如我在“查看”下添加一菜单项“置顶”,ID自己随便写,如这里写为28
2011-11-7 10:44
0
雪    币: 268
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
虽说是别人嚼过的馍,可我还是想自己动手试试
2011-11-14 11:03
0
游客
登录 | 注册 方可回帖
返回
//