原理:通过修改注入表的方式将我们自己的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)
{
if (message==WM_COMMAND)
{
if (wParam == IDM_M1)
{
MessageBoxA(hWnd,"提示","M1点击按钮!!!!!!",MB_OK);
}
if (wParam == IDM_M2)
{
MessageBoxA(hWnd, "提示", "M2点击按钮!!!!!!", MB_OK);
}
if (wParam == IDM_M3)
{
MessageBoxA(hWnd, "提示", "M3点击按钮!!!!!!", MB_OK);
}
}
else if (message == WM_INITMENUPOPUP)
{
::EnableMenuItem(MyMenu,IDM_M1, TRUE);
::EnableMenuItem(MyMenu,IDM_M2, TRUE);
::EnableMenuItem(MyMenu,IDM_M3, TRUE);
}
return CallWindowProcA(lpPreWndProc, hWnd,message, wParam, lParam);
}
BOOL HookGameProc(HWND hGame)
{
if (!lpPreWndProc)
{
lpPreWndProc = (WNDPROC)GetWindowLong(hGame, GWL_WNDPROC);
SetWindowLongA(hGame, GWL_WNDPROC, (LONG)NewProc);
}
return TRUE;
}
2、注入目标程序处理
2.1存在问题
dll编写好之后,用Stud_PE将dll注入到目标程序中去,能显示但是菜单项是灰色的。

后来在dll中按照孙鑫老师代码,添加3处代码对菜单响应处理还是灰色的。可能是因为注入的原因,对菜单的响应目标程序不会检测到吧。
2.1处理问题正常显示
对上存在的问题找了很多,试了很多都失败,依然灰着。
对消息处理函数下条件断点, 在处理WM_INITMENUPOPUP消息之后会调用
EnableMenuItem函数,将我注入的菜单设置为灰色(不可用),这里可以进行Hook,太累了不想做,接着分析。0x403就是不可用,0x400就是可用
点击菜单MFC就会调用EnableMenuItem函数,执行下面图的操作,hMenu就是我们添加的菜单的句柄

来到上层,将标记位置进行修改,mov ecx,400,这样修改的缺点是所有的菜单都不是灰色了。



2.2 MFC菜单运行窥探
EnableMenuItem 需要传入一个hMenu的句柄,可能会调用GetMenu函数,对这个函数下断点,断下之后来到上层


2.3 存在问题
当打开多个目标程序会添加好几个我插入的菜单,不管了,太累了,这么点东西从无到有整了大半天。
2.4 添加菜单资源
dll中添加dialog,在窗口子类化程序中调用,不显示:需要在函数的头部加入下面的一行代码。
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));

运行界面如下:

本文介绍了如何通过DLL注入技术为应用程序添加菜单。首先,详细讲解了DLL中添加导出函数、创建菜单及响应的实现过程。接着,讨论了在注入过程中遇到的菜单灰色不可用的问题,分析了MFC的菜单处理机制,并提出了相应的解决策略。最后,展示了添加对话框资源的尝试及其效果。
2万+

被折叠的 条评论
为什么被折叠?



