找回密码
 注册
快捷导航
查看: 1320|回复: 0

在记事本启动前弹出欢迎对话框

[复制链接] |自动提醒
阅读字号:

5万

回帖

309

积分

8495

资产值

至尊会员III Rank: 4Rank: 4Rank: 4Rank: 4

注册时间
2006-5-28
发表于 2007-7-29 14:10:00| 字数 2,910| - 中国–广西–北海 电信 | 显示全部楼层 |阅读模式
今天要遭毒手的是我们所最熟悉最经常使用的记事本,我们的目标是没有蛀牙(晕倒,爬起来继续),大家看看下面的一张截图,会不会怀疑自己的眼睛呢,没错,它就是我们最和蔼可亲朴实无华的记事本,那么它是怎么变的这么漂亮的呢?呵呵,大家不要急,我会在后面的一系列文章中带领大家一步步实现。


万丈高楼平地起,今天我们要做的就是为记事本添加一个欢迎的对话框,过程非常简单,高手就可以略过了。还是拿出我们的屠龙刀-OllyDbg,用它打开记事本notepad.exe,可以发现OllyDbg停在了
0100739D > $  6A 70         PUSH 70
0100739F   .  68 98180001   PUSH notepad.01001898
010073A4   .  E8 BF010000   CALL notepad.01007568
010073A9   .  33DB          XOR EBX,EBX
010073AB   .  53            PUSH EBX                                 ; /pModule => NULL
010073AC   .  8B3D CC100001 MOV EDI,DWORD PTR DS:[<&KERNEL32.GetModu>; |kernel32.GetModuleHandleA
010073B2   .  FFD7          CALL EDI                                 ; \GetModuleHandleA


0100739D > $  6A 70         PUSH 70    这里就是程序的入口点,也就是所谓的EP(Entry Point)了,记事本运行的时候就是从这句代码开始一步步往下运行的,我们的目的是要在记事本运行之前就弹出一个欢迎对话框,那么我们的代码肯定要在记事本的代码开始运行之前就要开始运行,运行完毕再跳转到记事本的代码继续运行。那么我们的代码写在什么地方呢?拖动OllyDbg的滑动条向下看,我们会看到在记事本代码的最下面有一大片00 00 00 00,这就是代码的空白区,

至于为什么会有这些空白区以及怎么压缩这些空白区以得到更小的PE文件,我会在以后的系列中都会涉及到。本人就曾见到过240字节且可以在Windows下正常运行的PE文件,不可谓不强,呵呵。下面转入正题。
0100872C   .  47 65 74 57 6>ASCII "GetWindowTextW",0
0100873B   .  00            DB 00
0100873C   .  55 53 45 52 3>ASCII "USER32.dll",0
01008747      00            DB 00
01008748      00            DB 00
01008749      00            DB 00
0100874A      00            DB 00
0100874B      00            DB 00
0100874C      00            DB 00
0100874D      00            DB 00
0100874E      00            DB 00
0100874F      00            DB 00
01008750      00            DB 00
01008751      00            DB 00
01008752      00            DB 00
01008753      00            DB 00
01008754      00            DB 00
01008755      00            DB 00
01008756      00            DB 00
我们看到这些空白区从01008747开始,那么
0100872C   .  47 65 74 57 6>ASCII "GetWindowTextW",0
0100873B   .  00            DB 00
0100873C   .  55 53 45 52 3>ASCII "USER32.dll",0
是什么呢?这些就是在记事本的代码中的一些字符串的定义,我们也可以在这里定义自己的字符串,如下图,选中一片空白区域,右键->二进制->编辑,弹出编辑二进制对话框,如下图,



在最上面的ASCII码框里写上自己想要的字符串,然后点确定,回到OllyDbg中,我们可以看到在刚才编辑字
符串的区域出现了好像是乱码的东西,没关系,这是因为OllyDbg把字符串当成代码来解释了,我们可以用下面的方法把它还原回来,选中变成乱码的区域,右键->分析->分析代码,完毕后我们可以看到是不是已经变成我们刚刚写的字符串了。

好,照着上面,我们再定义一个字符串,结果如下:

我们要弹出一个对话框,需要用到一个函数,即MessageBox,函数原型为
int MessageBox(HWND hwnd,LPCTSTR lptext,LPCTSTR lpcaption,UINT utype);
函数中有两处要用到的字符串,我们已经在上面的步骤中定义完毕,下面是在汇编中怎么使用这个函数,如下
01008747   .  57 65 6C 63 6>ASCII "Welcome,xuqing!",0
01008757   .  48 65 6C 6C 6>ASCII "Hello,World!",0
01008764      6A 00         PUSH 0                           
01008766      68 47870001   PUSH notepad.01008747                    ;  ASCII "Welcome,xuqing!"
0100876B      68 57870001   PUSH notepad.01008757                    ;  ASCII "Hello,World!"
01008770      6A 00         PUSH 0
01008772      E8 737DD476   CALL USER32.MessageBoxA
按照上面的代码在OllyDbg中汇编,至此我们已经实现了弹出对话框的功能,但是怎样让这段代码在程序一开始就运行起来呢?很简单,我们只要把入口处的的一句代码jmp无条件跳转到我们自己的代码处就可以了,下面是具体的实施过程。右键->转到->EIP,OllyDbg来到程序的入口点,我们先把来开始的几句代码复制一下粘贴在记事本里,因为修改代码会对临近的代码造成影响,我们把第一句代码改为jmp 01008764,这时可以看到
0100739D > $  6A 70         PUSH 70
0100739F   .  68 98180001   PUSH notepad.01001898
这两句代码被覆盖了,没关系,我们可以在自己的代码后把这两句代码补上,并且在这两句代码后jmp到程序的原来地方继续运行,一些具体的步骤都是介绍过的了,下面是修改后的样子
01008747   .  57 65 6C 63 6>ASCII "Welcome,xuqing!",0
01008757   .  48 65 6C 6C 6>ASCII "Hello,World!",0
01008764      6A 00         PUSH 0
01008766      68 47870001   PUSH notepad.01008747                    ;  ASCII "Welcome,xuqing!"
0100876B      68 57870001   PUSH notepad.01008757                    ;  ASCII "Hello,World!"
01008770      6A 00         PUSH 0
01008772      E8 737DD476   CALL USER32.MessageBoxA
01008777      6A 70         PUSH 70
01008779      68 98180001   PUSH notepad.01001898
0100877E    ^ E9 21ECFFFF   JMP notepad.010073A4
保存所有修改,然后运行修改后的文件,是不是有个对话框先弹出来了呢?
~我系水王~水王系我~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Powered by Discuz! X3.5 © 2001-2023 Comsenz Inc

GMT+8, 2025-2-1 15:36 , Processed in 0.103118 second(s), 24 queries , Gzip On, OPcache On.

手机版|小黑屋|安卓客户端|iOS客户端|Archiver|备用网址1|备用网址2|在线留言|专门网

返回顶部