首页
社区
课程
招聘
[原创]为记事本添加Top功能
发表于: 2005-10-5 04:51 19807

[原创]为记事本添加Top功能

2005-10-5 04:51
19807
oHuangKeo at 2005年10月5日
说明:记事本大家的电脑上都有吧.今天来个Diy吧,为记事本添加一个Top功能.
主要过程:
1.找到NotePad过程处理子程序地址,加个跳转.
2.在代码最下面找一块够用的空白,可以添加我们的代码.
3.为了实现可以取消Top功能,代码中加了要保存当前状态,代码节属性要改为可写.
4.写上代码就OK啦.

第一步:查找过程子程序处理地址
    用OD加载记事本,在命令行输入:bp RegisterClassExW (也可能是RegisterClassExA),然后F9运行程序.此时程序会断下.看堆栈框如下:
0007FDE4   01004556  /CALL to RegisterClassExW from NOTEPAD.01004550
0007FDE8   0007FDF0  \pWndClassEx = 0007FDF0

0007FDF0就是注册类的结构定义,在堆栈中中查看,就成这样了:
0007FDF0   00000030
0007FDF4   00000000
0007FDF8   01003429  NOTEPAD.01003429
0007FDFC   00000000
0007FE00   00000000
0007FE04   01000000  NOTEPAD.01000000
0007FE08   00A10AA7
0007FE0C   00010013
0007FE10   00000006
0007FE14   00000001
0007FE18   01009020  UNICODE "Notepad"
0007FE1C   017B09D5

01003429就是程序过程处理地址了,好在CPU中查看这里.
01003429      8BFF          mov     ediedi
0100342B  /.  55            push    ebp
0100342C  |.  8BEC          mov     ebpesp
0100342E  |.  51            push    ecx
0100342F  |.  51            push    ecx
01003430  |.  56            push    esi
这里我发现了一个问题,我在CSDN上见过人提过."mov ediedi"有啥用呢?没答案.
这里我们要加入一个远距离跳转,需要5个字节,算算就把0100342B这里改了吧.改成"jmp xxxxxxxx"(这个xxxxxxxx和是第二步找到的地址.)
push    ebp
mov     ebpesp
push    ecx
push    ecx
这4条指令将会被复盖,所以要搬家.先备份下来.

第二步:找空白空间
    看看代码段的最下面,好大的一个空白.我选择了从01008750开始,这个地址代替上面的xxxxxxxx.
这里代码改写成如下:
01008750   > \60            pushad                                   ;  堆栈平横
01008751   .  E8 1A000000   call    NOTEPAD.01008770                 ;  用Call是方便后面随时改写代码方便.
01008756   .  61            popad                                    ;  堆栈平横
01008757   .  55            push    ebp                              ;  源代码搬来的
01008758   .  8BEC          mov     ebpesp                         ;  源代码搬来的
0100875A   .  51            push    ecx                              ;  源代码搬来的
0100875B   .  51            push    ecx                              ;  源代码搬来的
0100875C   .^ E9 CFACFFFF   jmp     NOTEPAD.01003430                 ;  跳回原程序啦.
01008761      90            nop
01008762   .  54 6F 70 00   ascii   "Top",0                          ;  中间要留些空白
01008766   .  4E 6F 54 6F 7>ascii   "NoTop",0                        ;  中间留一定的空白是为了要放字符串和变量的
                                                                     ;  本想加上没有Top时更改菜单为NoTop.但太麻烦了,算了.
0100876C   .  00000000      dd      00000000
01008770  /$  8BEC          mov     ebpesp
01008772  |.  83C5 20       add     ebp, 20
01008775  |.  8B75 0C       mov     esi, [arg.2]                     ;  得过程的第二个参数
01008778  |.  83FE 01       cmp     esi, 1                           ;  如果不是WM_CREATE就跳,否则就为主程序添加"Top"菜单.
0100877B  |.  75 1A         jnz     short NOTEPAD.01008797
0100877D  |.  FF75 08       push    [arg.1]                          ; /hWnd
01008780  |.  E8 068DD276   call    USER32.GetMenu                   ; \GetMenu
01008785  |.  68 62870001   push    NOTEPAD.01008762                 ; /pItem = "Top"
0100878A  |.  68 23010000   push    123                              ; |ItemID = 123 (291.)
0100878F  |.  6A 00         push    0                                ; |Flags = MF_BYCOMMAND|MF_ENABLED|MF_STRING
01008791  |.  50            push    eax                              ; |hMenu
01008792  |.  E8 4893D276   call    USER32.AppendMenuA               ; \AppendMenuA
01008797  |>  81FE 11010000 cmp     esi, 111                         ;  如果不是WM_COMMAND就跳,否则就设置是否程序Top啦.
0100879D  |.  75 3C         jnz     short NOTEPAD.010087DB
0100879F  |.  8B45 10       mov     eax, [arg.3]                     ;  获得过程的第三个参数
010087A2  |.  66:3D 2301    cmp     ax, 123                          ;  这里比较菜单ID,如果是123(123是上面自定义的,可以更改.)就执行下面的代码,不然就返回.
010087A6  |.  75 33         jnz     short NOTEPAD.010087DB
010087A8  |.  8B15 6C870001 mov     edxdword ptr ds:[100876C]      ;  把当前状态取出来
010087AE  |.  6A 13         push    13                               ;  SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE
010087B0  |.  6A 00         push    0
010087B2  |.  6A 00         push    0
010087B4  |.  6A 00         push    0
010087B6  |.  6A 00         push    0
010087B8  |.  83FA 00       cmp     edx, 0                           ;  比较当前是否已Top,0=NoTop,1=Top
010087BB  |.  75 0A         jnz     short NOTEPAD.010087C7
010087BD  |.  6A FF         push    -1                               ;  HWND_TOPMOST
010087BF  |.  6A 01         push    1                                ;  更改标志为已Top
010087C1  |.  8F05 6C870001 pop     dword ptr ds:[100876C]
010087C7  |>  74 0A         je      short NOTEPAD.010087D3
010087C9  |.  6A FE         push    -2                               ;  HWND_NOTOPMOST
010087CB  |.  6A 00         push    0                                ;  更改标志为已NoTop
010087CD  |.  8F05 6C870001 pop     dword ptr ds:[100876C]
010087D3  |>  FF75 08       push    [arg.1]                          ; |记事本句柄
010087D6  |.  E8 4038D176   call    USER32.SetWindowPos              ; \SetWindowPos
010087DB  \> \C3            retn                                     ;  返回原子程序

好了,保存到文件.

第三步:修改代码段属性
    用PE相关的功能,把.text段的属性加上能写的属性.

好了,完成,试试吧.

附件:notepad_top.rar

[课程]Android-CTF解题方法汇总!

收藏
免费 7
支持
分享
最新回复 (31)
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
2
OS:XP SP1下无法运行。。。
2005-10-5 06:40
0
雪    币: 300
活跃值: (412)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
3
学习学习。

但是 xp 不能运行。
2005-10-5 08:08
0
雪    币: 44229
活跃值: (19965)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
4
不错,平时用惯记事本了,这个置顶功能比较实用。
楼主程序不能跨平台运行是因为调用API时直接调用了,例如直接在OD里敲入:
call   USER32.GetMenu
OD里的汇编指令就是:call    77D2E33E
正确的调用方式是通过记事本的IAT调用:call    [1001264]

另外一些函数AppendMenuA、SetWindowPos记事本内没有,必须用其他方法调用。例如常用的一种方法:

0100878B      push    0100873C                         ; /pModule = "USER32.dll"
01008790      call    [<&KERNEL32.GetModuleHandleA>]   ; \GetModuleHandleA
01008796      push    01001344                         ; /ProcNameOrOrdinal = "AppendMenuA"
0100879B      push    eax                              ; |hModule
0100879C      call    [<&KERNEL32.GetProcAddress>]     ; \GetProcAddress
010087A2      call    eax

附件是己修正过的记事本。

附件:notepad_top.rar
2005-10-5 11:29
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
学习学习。
2005-10-5 11:32
0
雪    币: 142
活跃值: (278)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
6
如果在同一台电脑上,事以不用得到AppendMenuA函数地址的,如果要拿的别的电脑上用才有可能不一样.我只是偷懒.嘻嘻
2005-10-5 12:22
0
雪    币: 367
活跃值: (109)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
研究别人的思想,补充自己的见解,diy确实比pj有意思
2005-10-5 13:08
0
雪    币: 142
活跃值: (278)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
8
最近看了些马哲,发现diy和pj是辩证统一的关系,嘻嘻.
2005-10-5 13:31
0
雪    币: 313
活跃值: (250)
能力值: ( LV9,RANK:650 )
在线值:
发帖
回帖
粉丝
9
经典作品,学习
2005-10-5 13:37
0
雪    币: 200
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
经典啊!要是调用dll,就更加灵活了
2005-10-5 14:18
0
雪    币: 298
活跃值: (445)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
11
不错。。
2005-10-5 14:45
0
雪    币: 234
活跃值: (370)
能力值: ( LV9,RANK:530 )
在线值:
发帖
回帖
粉丝
12
GOOD,学习
2005-10-5 16:29
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
最初由 ohuangkeo 发布
最近看了些马哲,发现diy和pj是辩证统一的关系,嘻嘻.

呵呵,兄弟对哲学都有研究啊
2005-10-5 17:33
0
雪    币: 142
活跃值: (278)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
14
没法哇,要考这玩意得学哇.
不过我觉得马哲里面很多东西还是说得有头有理的.对我们有很大帮助的.
2005-10-5 17:41
0
雪    币: 221
活跃值: (137)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
15
哈哈,我也喜欢马哲
2005-10-5 19:58
0
雪    币: 288
活跃值: (415)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
16
win2k+Sp4运行后无反应
2005-10-5 23:09
0
雪    币: 1790
活跃值: (3535)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
17
谢谢了。先收藏
2005-10-6 23:56
0
雪    币: 142
活跃值: (278)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
18
请不要直接执行,因为我偷了懒的.如果没特殊原因,只能在SP2上运行.如果你想给自己的NotePad加上此功能,请自己动用做一次吧.这样你也可以练习一下DIY.
2005-10-7 01:23
0
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
呵呵,建议开个专版。专门讨论怎么样给现有的经典软件加上新功能!!
2005-10-7 13:50
0
雪    币: 44229
活跃值: (19965)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
20
最初由 WHO-AM-I 发布
呵呵,建议开个专版。专门讨论怎么样给现有的经典软件加上新功能!!


专版分散人气,可以开个专帖置顶。
2005-10-7 14:12
0
雪    币: 234
活跃值: (104)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
学习学习!不错!
2005-11-9 13:30
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
学习学习!可惜!我的XP无缘一试!只能拿到单位的2000机子上试一试!但还是谢谢一下!顺便请问一下:为何全国计算机NIT模拟考试系统的“题目要求”窗口,用了几乎所有的置顶工具都不见效?那些菜鸟在做练习的时候不知有多狼狈!能否帮忙添加一个置顶功能?
2006-3-26 23:05
0
雪    币: 38
活跃值: (52)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
23
都很强大滴,膜拜
2009-8-7 22:13
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
iix
24
谢谢提供,要好好学习了!
2009-8-8 11:32
0
雪    币: 132
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
呼!后面2为挖坟的厉害啊...
这咚咚看着还真不错呢
2009-8-8 12:39
0
游客
登录 | 注册 方可回帖
返回
//