首页
社区
课程
招聘
[原创][分享]为记事本添加置顶/透明/打开HOSTS文件功能
发表于: 2014-7-25 16:42 7973

[原创][分享]为记事本添加置顶/透明/打开HOSTS文件功能

2014-7-25 16:42
7973

本人菜鸟,今天闲来无事,很久没发文章了,论坛的学业已经荒废,重新来练习下,不对之处请谅解,欢迎提出好的建议。
为记事本添加 /置顶/透明/Hosts/ 功能
源文件:WINXP 记事本 NotePad.exe

要实现我们的功能需要一些函数,SetWindowPos、SetLayeredWindowAttributes、GetSystemDirectoryW
经过查看模块调用发现没有这三个函数,发现有GetModuleHandle、GetProcAddress这两个函数,
有了他们事情就好办了;免得我们去增加需要的函数,其他用到的函数如下:
GetWindowLongW、SetWindowLongW、GetMenu、GetSubMenu、CheckMenuItem、CreateFileW、lstrcatw

CALL DWORD PTR DS:[0x10010CC]    ;GetModuleHandle
CALL DWORD PTR DS:[0x1001110]    ;GetProcAddress
CALL DWORD PTR DS:[0x1001264]    ;GetMenu
CALL DWORD PTR DS:[0x1001260]    ;GetSubMenu
CALL DWORD PTR DS:[0x1001248]    ;CheckMenuItem
CALL DWORD PTR DS:[0x1001270]    ;GetWindowLongW
CALL DWORD PTR DS:[0x100126C]    ;SetWindowLongW
CALL DWORD PTR DS:[0x1001104]    ;CreateFileW
CALL DWORD PTR DS:[0x1001118]    ;lstrcatw

第一步:先给程序增加菜单
用资源编辑器打开文件,增加菜单项,置顶 - 118  、透明 - 119  、Hosts - 120

第二步:查找消息处理地址
用OD加载记事本,查询所有模块间的调用,找到RegisterClassExW F2下断,F9运行程序程序会断下.
01004550  |.  FF15 D0110001 CALL DWORD PTR DS:[<&USER32.RegisterClas>; \RegisterClassExW

看堆栈框如下:
0007FDE8   0006FDF0  \pWndClassEx = 0007FDF0    ;注册窗口类的结构定义,在堆栈中中查看
0007FDEC   77D19D69  user32.LoadCursorW
0007FDF0   00000030
0007FDF4   00000000
0007FDF8   01003429  NotePad_.01003429      ;窗口过程地址  //右键 反汇编窗口跟随 来到过程入口
0007FDFC   00000000
0007FE00   00000000
0007FE04   01000000  NotePad_.01000000      ;所属实例
0007FE08   052807AB
0007FE0C   00010013
0007FE10   00000006
0007FE14   00000001
0007FE18   01009020  UNICODE "Notepad"

来到过程入口,我们下翻来到WM_COMMAND消息分支:
010038C7  |> \3B3D 38980001 CMP EDI,DWORD PTR DS:[0x1009838]         ;  Case 111 (WM_COMMAND) of switch 01003434
010038CD  |.  75 4C         JNZ SHORT NotePad.0100391B
…………………………………………省略……………………………………………………
01003916  |.^ E9 A2FBFFFF   JMP NotePad.010034BD
0100391B  |>  57            PUSH EDI
0100391C  |.  FF75 10       PUSH [ARG.3]
0100391F  |.  FF75 08       PUSH [ARG.1]
01003922  |.  E8 60F2FFFF   CALL NotePad.01002B87    ;// 进入此过程 - 判断菜单消息

进入过程后,来到10032C6这里是菜单 关于 的判断地方。0x41 = 65  菜单关于的ID=65,我们加入远程跳转跳至自己的代码处,
需要5个字节,修改010032C6这里,修改会覆盖5字节记下源代码以备还原;
010032C6  |> \83FF 41       CMP EDI,0x41      ;// 改为 JMP 01013053
010032C9  |.  74 76         JE SHORT NotePad.01003341

第三步:找空白空间存放自己的常量字符串代码,代码段的后边有空白地址,我们把代码放到01008748处,修改如下:
01008748   .  53 65 74 57 6>ASCII "SetWindowPos",0
01008755      00            DB 00
01008756   .  53 65 74 4C 6>ASCII "SetLayeredWindow"
01008766   .  41 74 74 72 6>ASCII "Attributes",0
01008771      00            DB 00
01008772   .  47 65 74 53 7>ASCII "GetSystemDirecto"
01008782   .  72 79 57 00   ASCII "ryW",0
01008786      00            DB 00
01008787   .  5C00 6400 720>UNICODE "\drivers"
01008797   .  5C00 6500 740>UNICODE "\etc\hos"
010087A7   .  7400 7300 000>UNICODE "ts",0
改完后保存下。

第四步:增加资源段大小,我们的代码需要1C0H的空间,我们增加200H就够了,用16进制工具在文件尾
增加200H的空间;然后修改.rsrc段的虚拟和物理大小,各增加200H,最后修改段属性为可执行。

第五步:增加我们的代码;
CTRL+G来到1013000处,即我们自己加的空间。写上如下代码:
01013000    55              PUSH EBP
01013001    8BEC            MOV EBP,ESP
01013003    FF75 0C         PUSH DWORD PTR SS:[EBP+0xC]
01013006    FF15 CC100001   CALL DWORD PTR DS:[<&KERNEL32.GetModuleH>; kernel32.GetModuleHandleA
0101300C    FF75 08         PUSH DWORD PTR SS:[EBP+0x8]
0101300F    50              PUSH EAX
01013010    FF15 10110001   CALL DWORD PTR DS:[<&KERNEL32.GetProcAdd>; kernel32.GetProcAddress
01013016    C9              LEAVE
01013017    C2 0800         RETN 0x8
0101301A    90              NOP
0101301B    90              NOP
0101301C    90              NOP
0101301D    90              NOP
0101301E    90              NOP
0101301F    55              PUSH EBP
01013020    8BEC            MOV EBP,ESP
01013022    FF35 30980001   PUSH DWORD PTR DS:[0x1009830]
01013028    FF15 64120001   CALL DWORD PTR DS:[<&USER32.GetMenu>]    ; user32.GetMenu
0101302E    6A 04           PUSH 0x4
01013030    50              PUSH EAX
01013031    FF15 60120001   CALL DWORD PTR DS:[<&USER32.GetSubMenu>] ; user32.GetSubMenu
01013037    3E:837D 0C 00   CMP DWORD PTR DS:[EBP+0xC],0x0
0101303C    74 04           JE SHORT 1116.01013042
0101303E    6A 08           PUSH 0x8
01013040    EB 02           JMP SHORT 1116.01013044
01013042    6A 00           PUSH 0x0
01013044    FF75 08         PUSH DWORD PTR SS:[EBP+0x8]
01013047    50              PUSH EAX
01013048    FF15 48120001   CALL DWORD PTR DS:[<&USER32.CheckMenuIte>; user32.CheckMenuItem
0101304E    C9              LEAVE
0101304F    C2 0800         RETN 0x8
01013052    90              NOP
01013053    60              PUSHAD
01013054    E8 0F000000     CALL 1116.01013068
01013059    61              POPAD
0101305A    83FF 41         CMP EDI,0x41
0101305D  - 0F84 DE02FFFF   JE 1116.01003341
01013063  - E9 6302FFFF     JMP 1116.010032CB
01013068    83FF 76         CMP EDI,0x76
0101306B    74 11           JE SHORT 1116.0101307E
0101306D    83FF 77         CMP EDI,0x77
01013070    74 5F           JE SHORT 1116.010130D1
01013072    83FF 78         CMP EDI,0x78
01013075    0F84 D4000000   JE 1116.0101314F
0101307B    C3              RETN
0101307C    90              NOP
0101307D    90              NOP
0101307E    68 3C870001     PUSH 1116.0100873C                       ; ASCII "USER32.dll"
01013083    68 48870001     PUSH 1116.01008748                       ; ASCII "SetWindowPos"
01013088    E8 73FFFFFF     CALL 1116.01013000
0101308D    6A 13           PUSH 0x13
0101308F    6A 00           PUSH 0x0
01013091    6A 00           PUSH 0x0
01013093    6A 00           PUSH 0x0
01013095    6A 00           PUSH 0x0
01013097    833D 2C980001 0>CMP DWORD PTR DS:[0x100982C],0x0
0101309E    74 0E           JE SHORT 1116.010130AE
010130A0    C705 2C980001 0>MOV DWORD PTR DS:[0x100982C],0x0
010130AA    6A FE           PUSH -0x2
010130AC    EB 0C           JMP SHORT 1116.010130BA
010130AE    C705 2C980001 0>MOV DWORD PTR DS:[0x100982C],0x1
010130B8    6A FF           PUSH -0x1
010130BA    FF35 30980001   PUSH DWORD PTR DS:[0x1009830]
010130C0    FFD0            CALL EAX
010130C2    FF35 2C980001   PUSH DWORD PTR DS:[0x100982C]
010130C8    6A 76           PUSH 0x76
010130CA    E8 50FFFFFF     CALL 1116.0101301F
010130CF    C3              RETN
010130D0    90              NOP
010130D1    6A EC           PUSH -0x14
010130D3    FF35 30980001   PUSH DWORD PTR DS:[0x1009830]
010130D9    FF15 70120001   CALL DWORD PTR DS:[<&USER32.GetWindowLon>; user32.GetWindowLongW
010130DF    833D 28980001 0>CMP DWORD PTR DS:[0x1009828],0x0
010130E6    74 11           JE SHORT 1116.010130F9
010130E8    C705 28980001 0>MOV DWORD PTR DS:[0x1009828],0x0
010130F2    25 FFFFF7FF     AND EAX,0xFFF7FFFF
010130F7    EB 0F           JMP SHORT 1116.01013108
010130F9    C705 28980001 0>MOV DWORD PTR DS:[0x1009828],0x1
01013103    0D 00000800     OR EAX,0x80000
01013108    50              PUSH EAX
01013109    6A EC           PUSH -0x14
0101310B    FF35 30980001   PUSH DWORD PTR DS:[0x1009830]
01013111    FF15 6C120001   CALL DWORD PTR DS:[<&USER32.SetWindowLon>; user32.SetWindowLongW
01013117    833D 28980001 0>CMP DWORD PTR DS:[0x1009828],0x0
0101311E    74 20           JE SHORT 1116.01013140
01013120    68 3C870001     PUSH 1116.0100873C                       ; ASCII "USER32.dll"
01013125    68 56870001     PUSH 1116.01008756                       ; ASCII "SetLayeredWindowAttributes"
0101312A    E8 D1FEFFFF     CALL 1116.01013000
0101312F    6A 02           PUSH 0x2
01013131    68 96000000     PUSH 0x96
01013136    6A 00           PUSH 0x0
01013138    FF35 30980001   PUSH DWORD PTR DS:[0x1009830]
0101313E    FFD0            CALL EAX
01013140    FF35 28980001   PUSH DWORD PTR DS:[0x1009828]
01013146    6A 77           PUSH 0x77
01013148    E8 D2FEFFFF     CALL 1116.0101301F
0101314D    C3              RETN
0101314E    90              NOP
0101314F    68 EC800001     PUSH 1116.010080EC                       ; ASCII "KERNEL32.dll"
01013154    68 72870001     PUSH 1116.01008772                       ; ASCII "GetSystemDirectoryW"
01013159    E8 A2FEFFFF     CALL 1116.01013000
0101315E    68 00010000     PUSH 0x100
01013163    68 00950001     PUSH 1116.01009500
01013168    FFD0            CALL EAX
0101316A    68 87870001     PUSH 1116.01008787                       ; UNICODE "\drivers\etc\hosts"
0101316F    68 00950001     PUSH 1116.01009500
01013174    FF15 18110001   CALL DWORD PTR DS:[<&KERNEL32.lstrcatW>] ; kernel32.lstrcatW
0101317A    6A 00           PUSH 0x0
0101317C    68 80000000     PUSH 0x80
01013181    6A 03           PUSH 0x3
01013183    6A 00           PUSH 0x0
01013185    6A 03           PUSH 0x3
01013187    68 00000080     PUSH 0x80000000
0101318C    68 00950001     PUSH 1116.01009500
01013191    FF15 04110001   CALL DWORD PTR DS:[<&KERNEL32.CreateFile>; kernel32.CreateFileW
01013197    FF35 30900001   PUSH DWORD PTR DS:[0x1009030]
0101319D    A3 80A40001     MOV DWORD PTR DS:[0x100A480],EAX
010131A2    68 00950001     PUSH 1116.01009500
010131A7    E8 CD1FFFFF     CALL 1116.01005179
010131AC  - E9 16FCFEFF     JMP 1116.01002DC7
010131B1    90              NOP

改完后保存,就可以测试程序了。
文件下载 NotePad_diy.rar


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

上传的附件:
收藏
免费 3
支持
分享
最新回复 (10)
雪    币: 6510
活跃值: (4389)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
不带上原版记事本吗
2014-7-25 17:34
0
雪    币: 90
活跃值: (91)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
本帖的亮点是那张图片
2014-7-25 17:38
0
雪    币: 2980
活跃值: (2754)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不知道加图片的思路是不是这样的呢?
2014-7-25 17:52
0
雪    币: 114
活跃值: (72)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
5
立马想起cvcxk那个帖子。
2014-7-25 18:09
0
雪    币: 12023
活跃值: (4964)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
楼主威武,太棒了,学习了,图片可以分享一下吗?呵呵呵
2014-7-25 18:37
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
学习了,谢谢楼主分享。
2014-7-31 17:40
0
雪    币: 5936
活跃值: (5234)
能力值: ( LV8,RANK:138 )
在线值:
发帖
回帖
粉丝
8
学习……………………
2014-7-31 18:21
0
雪    币: 245
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
厉害啊!!!!学习了
2014-8-1 15:10
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
有没有试过在win8使用这个呢?
2014-8-8 22:22
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
学习了,感觉很cool
2014-9-24 10:38
0
游客
登录 | 注册 方可回帖
返回