下面开始准备工具:OllyDbg ResHacker LordPE WinXP记事本好了可以开工了 首先是介绍一下基本思路因为记事本是别人的东西我们要添加功能进去只能修改exe文件或者添加一个DLL来实现自己的功能.第一种方法 要复杂一些因为要涉及到PE文件知识和汇编知识.我们用第二种方法,添加一个DLL文件来扩展功能这样可以无限制的扩展记事本的功能 所以 下一步添加一个像QQ那样的 在屏幕边缘自动隐藏功能 感觉比透明功能好玩要给Windows可执行文件添加功能主要是添加消息处理.所以我们就从消息处理入手.这里的方法是看雪的一位牛人给出的:在记事本的消息处理函数之前添加自己的消息处理函数来处理消息.而且把这个处理函数放到一个DLL里面 这样记事本的功能就可以无限制的扩展了(夸张的说),要添加什么功能只要添加一个消息处理就够了而且只是在DLL里面添加 可以使用自己熟悉的语言来写这个DLL使得添加功能变的更简单一些.实现以上的想法开始了 首先来写这个DLL我们只要一个消息处理函数就够了 所以这个DLL只要有一个导出函数:我是用DEVC++创建的 语言使用的是C语言DevC++会自动为我们生成一个模板我们基本上不用自己怎么动手,下面是我们的消息处理函数void _cdecl Plug(const DWORD reversed,HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam){ switch(msg){ //case WM_CREATE: // MessageBox(hWnd,"敏子","oo",0x40); // break; case WM_COMMAND: cmdProc( hWnd,wParam,lParam); //处理WM_COMMAND消息 break; } } //这个函数就是消息处理函数 你可以在里面处理记事本的所有消息void cmdProc(HWND hWnd,WPARAM wParam,LPARAM lParam) { switch(wParam) { case 28: if (trapos==0) { setlayered(hWnd); trapos=1; checkMenu(hWnd,28); } else { setulayered(hWnd); trapos=0; uncheckMenu(hWnd,28); } break; //--------------------- case 29: 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; case 30: MessageBox(hWnd,"最爱敏子","嘿嘿",0x40); break; } }//这个是处理WM_COMMAND消息的函数主要用来处理我们添加的菜单项//下面的是我们用来实现功能的功能代码就是我们要总在前面和透明功能这两个功能要使用到的函数:GetModuleHandleGetProcAddressGetWindowLongSetWindowLongSetLayeredWindowAttributes //该函数属于未公开函数要自己获得CheckMenuItemSetWindowPos关于这几个函数的作用和功能请大家查看互联网或者MSDN这里就不做解释了void setlayered(HWND hwnd) //设置窗体透明 透明度为128 { HMODULE user32=GetModuleHandle("USER32.DLL"); //获得user32链接库的句柄 transparence=(lpfn)GetProcAddress(user32,"SetLayeredWindowAttributes"); //获得SetLayeredWindowAttributes的句柄 long ret=GetWindowLong(hwnd,GWL_EXSTYLE); ret=ret|WS_EX_LAYERED ; SetWindowLong(hwnd, GWL_EXSTYLE, ret); transparence(hwnd, 0,128,2); } void setulayered(HWND hwnd) //取消透明 { long ret=GetWindowLong(hwnd,GWL_EXSTYLE); ret=ret&EX_STYLE; SetWindowLong(hwnd, GWL_EXSTYLE, ret);} void checkMenu(HWND hwnd,int ID) //设置菜单的check标记 { HWND menu=GetMenu(hwnd); HWND popMenu=GetSubMenu(menu,3); CheckMenuItem(popMenu,ID, MF_CHECKED);} void uncheckMenu(HWND hwnd,int ID) //取消菜单的check标记 { HWND menu=GetMenu(hwnd); HWND popMenu=GetSubMenu(menu,3); CheckMenuItem(popMenu,ID, MF_UNCHECKED);} //在dll.h头文件里面添加一个导出函数DLLIMPORT void _cdecl Plug ( DWORD,HWND ,UINT ,WPARAM ,LPARAM );然后编译生成这个DLL就可以开始下面的工作了//首先用Load PE把这个DLL给记事本添加进去 使用load PE很方便的 用load打开记事本 然后选择导入表 然后 在出来的选项中添加DLL的名字是Plug.dll(就是你编译生成的DLL名称) 要导入的函数名字是 Plug(你在DLL里面用的消息处理函数名字)这里的就说这么多 不懂的可以问 或者查下资料添加后这个函数的地址1013010这个地址就不介绍怎么找到很简单下一步是找到windows的消息处理函数地址命令行下断bp RegisterClassExW确定 然后F9 断了下来 查看堆栈会看到call到RegisterClassExW来自 01004550向下看他的参数01003429 这个就是我们要的在这里回车 然后就来到了01003429在这里我们要用一个call语句 在01003424这里点汇编 然后输入一句call dword ptr[01013010]占用三个字节 后面自动补了一个nop这样 还没有好 我们还要找到WndClass结构然后修改那里的消息处理函数这个比较好找 call到RegisterClassExW来自 01004550这句话最后的那个地址就是线索 转到这里吧向上找参数 看到01003429 就是修改他了 这个是原来的消息处理地址 现在要换成我们的就是01003424修改好后 在OD里面点右键 选择保存到可执行文件-->选择全部-->然后右键保存 就可以了 关闭OD运行一下你的NOTEPAD吧忘记写了 菜单是用ResourceHack 添加进去的 注意ID不能和原来的重复 透明菜单用的ID是28 置顶菜单用的是29 最后的关于菜单用的是30 本想一张一张配图的 哈哈 论坛不能一个一个上传 没有办法 只能这样传了