欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

DIY WindowsXP记事本  

程序员文章站 2022-05-07 10:31:41
...

下面开始
准备工具:OllyDbgResHackerLordPEWinXP记事本
好了可以开工了
首先是介绍一下基本思路
因为记事本是别人的东西我们要添加功能进去只能修改exe文件或者添加一个DLL来实现自己的功能.第一种方法要复杂一些因为要涉及到PE文件知识和汇编知识.我们用第二种方法,添加一个DLL文件来扩展功能这样可以无限制的扩展记事本的功能所以下一步添加一个像QQ那样的在屏幕边缘自动隐藏功能感觉比透明功能好玩
要给Windows可执行文件添加功能主要是添加消息处理.所以我们就从消息处理入手.这里的方法是看雪的一位牛人给出的:
在记事本的消息处理函数之前添加自己的消息处理函数来处理消息.而且把这个处理函数放到一个DLL里面这样记事本的功能就可以无限制的扩展了(夸张的说),要添加什么功能只要添加一个消息处理就够了而且只是在DLL里面添加可以使用自己熟悉的语言来写这个DLL使得添加功能变的更简单一些.实现以上的想法开始了首先来写这个DLL我们只要一个消息处理函数就够了所以这个DLL只要有一个导出函数:
我是用DEVC++创建的语言使用的是C语言
DevC++会自动为我们生成一个模板我们基本上不用自己怎么动手,下面是我们的消息处理函数

void_cdeclPlug(constDWORDreversed,HWNDhWnd,UINTmsg,WPARAMwParam,LPARAMlParam)
{
switch(msg){
//caseWM_CREATE:
//MessageBox(hWnd,"敏子","oo",0x40);
//break;
caseWM_COMMAND:
cmdProc(hWnd,wParam,lParam);//处理WM_COMMAND消息
break;
}

}//这个函数就是消息处理函数你可以在里面处理记事本的所有消息

voidcmdProc(HWNDhWnd,WPARAMwParam,LPARAMlParam)
{
switch(wParam)
{
case28:
if(trapos==0)
{
setlayered(hWnd);
trapos=1;
checkMenu(hWnd,28);
}
else
{
setulayered(hWnd);
trapos=0;
uncheckMenu(hWnd,28);
}
break;
//---------------------
case29:
if(toppos==0)
{
SetWindowPos(hWnd,HWND_TOPMOST,0,0,0,0,FLAGS);
toppos=1;
checkMenu(hWnd,29);
}
else
{
SetWindowPos(hWnd,HWND_NOTOPMOST,0,0,0,0,FLAGS);
toppos=0;
uncheckMenu(hWnd,29);
}
break;
case30:

MessageBox(hWnd,"最爱敏子","嘿嘿",0x40);
break;
}

}
//这个是处理WM_COMMAND消息的函数主要用来处理我们添加的菜单项


//下面的是我们用来实现功能的功能代码就是我们要总在前面和透明功能
这两个功能要使用到的函数:
GetModuleHandle
GetProcAddress
GetWindowLong
SetWindowLong
SetLayeredWindowAttributes//该函数属于未公开函数要自己获得
CheckMenuItem
SetWindowPos
关于这几个函数的作用和功能请大家查看互联网或者MSDN这里就不做解释了
voidsetlayered(HWNDhwnd)//设置窗体透明透明度为128
{

HMODULEuser32=GetModuleHandle("USER32.DLL");//获得user32链接库的句柄

transparence=(lpfn)GetProcAddress(user32,"SetLayeredWindowAttributes");//获得SetLayeredWindowAttributes的句柄

longret=GetWindowLong(hwnd,GWL_EXSTYLE);

ret=ret|WS_EX_LAYERED;

SetWindowLong(hwnd,GWL_EXSTYLE,ret);

transparence(hwnd,0,128,2);

}
voidsetulayered(HWNDhwnd)//取消透明
{
longret=GetWindowLong(hwnd,GWL_EXSTYLE);
ret=ret&EX_STYLE;
SetWindowLong(hwnd,GWL_EXSTYLE,ret);
}
voidcheckMenu(HWNDhwnd,intID)//设置菜单的check标记
{
HWNDmenu=GetMenu(hwnd);
HWNDpopMenu=GetSubMenu(menu,3);
CheckMenuItem(popMenu,ID,MF_CHECKED);
}
voiduncheckMenu(HWNDhwnd,intID)//取消菜单的check标记
{
HWNDmenu=GetMenu(hwnd);
HWNDpopMenu=GetSubMenu(menu,3);
CheckMenuItem(popMenu,ID,MF_UNCHECKED);
}


//在dll.h头文件里面添加一个导出函数
DLLIMPORTvoid_cdeclPlug(DWORD,HWND,UINT,WPARAM,LPARAM);

然后编译生成这个DLL就可以开始下面的工作了

//首先用LoadPE把这个DLL给记事本添加进去使用loadPE很方便的用load打开记事本然后选择导入表然后在出来的选项中添加DLL的名字是Plug.dll(就是你编译生成的DLL名称)要导入的函数名字是Plug(你在DLL里面用的消息处理函数名字)

这里的就说这么多不懂的可以问或者查下资料
添加后这个函数的地址1013010
这个地址就不介绍怎么找到很简单
下一步是找到windows的消息处理函数地址
命令行下断
bpRegisterClassExW
确定然后F9断了下来查看堆栈会看到
call到RegisterClassExW来自01004550
向下看他的参数
01003429
这个就是我们要的
在这里回车然后就来到了01003429
在这里我们要用一个call语句
在01003424这里点汇编然后输入一句
calldwordptr[01013010]
占用三个字节后面自动补了一个nop
这样还没有好我们还要找到WndClass结构然后修改那里的消息处理函数这个比较好找
call到RegisterClassExW来自01004550
这句话最后的那个地址就是线索转到这里吧
向上找参数看到01003429就是修改他了这个是原来的消息处理地址现在要换成我们的就是01003424
修改好后在OD里面点右键选择保存到可执行文件-->选择全部-->然后右键保存就可以了关闭OD运行一下你的NOTEPAD吧
忘记写了菜单是用ResourceHack添加进去的注意ID不能和原来的重复透明菜单用的ID是28置顶菜单用的是29最后的关于菜单用的是30
本想一张一张配图的哈哈论坛不能一个一个上传没有办法只能这样传了