原理:通过修改注入表的方式将我们自己的dll中的菜单及响应添加到应用中去,实现我们想要的功能。
1、注入dll编写
这里是通过 Stud_PE工具将dll注入到目标程序中去的
1.1 dll中添加导出函数
Stud_PE添加到目标程序是需要添加导出函数,因此这里添加一个导出函数,没有实际功能。
jtfz.cpp
void test()
{
AfxMessageBox(“加载成功!”);
}
在def中添加导出项
1.2 dll中添加菜单
参照孙鑫老师的《VC++深入详讲》实现
尝试过在dll中新建一个菜单资源,然后NewMenu.LoadMenuA(IDR_MENU1)这样的方式去实现但是失败了,所以参照孙鑫老师的方式来做。
在Resource.h文件中添加 资源代码的定义
#define IDM_M1 10001
#define IDM_M2 10002
#define IDM_M3 10003
cpp文件中添加
CMenu NewMenu;
NewMenu.CreateMenu();
HMENU hMenu=GetMenu(hWnd);//hWnd就是目标程序窗口的hwnd句柄
::AppendMenuA(hMenu, MF_POPUP, (UINT)NewMenu.m_hMenu, “九天辅助”);
NewMenu.AppendMenuA(MF_STRING, IDM_M1, “Hello1”);
NewMenu.AppendMenuA(MF_STRING, IDM_M2, “Hello2”);
NewMenu.AppendMenuA(MF_STRING, IDM_M3, “Hello3”);
MyMenu = NewMenu.m_hMenu;
NewMenu.Detach();
SetMenu(hWnd, hMenu);//打开程序会立即显示菜单,不加SetMenu会在鼠标移动到菜单之后显示
1.3 dll中菜单响应的实现
对菜单按钮的响应通过目标窗口的子类化实现,就是通过GetWindowLong 传入 GWL_WNDPROC 参数获取目标函数的消息处理函数的地址,然后通过SetWndowLong 传入我们自己的消息处理函数的地址,我们的函数中对WM_COMMAND消息进行处理,如果wParam是我们的菜单项的ID就做响应。
//新回调函数
LRESULT CALLBACK NewProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)