写了一个MFC DLL动态库。
在mfc dll里面添加了对话框资源,并且添加一个对话框类CDlg。
可以通过SetWindowsHookEx注入到程序。
但是退出的时候,被注入程序总是崩溃。
dll注入程序
int DllLoad( HWND hWnd )
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
int nRet = -1;
dllHwnd = hWnd;
HWND hwnd = FindWindowA(NULL, "Lingoes 灵格斯");
if ( NULL == hwnd )
{
MessageBoxA(NULL, "获取程序句柄失败", "xx", MB_OK);
TRACE("获取程序句柄失败!");
return -1;
}
DWORD pid = GetWindowThreadProcessId( hwnd, NULL );
if ( NULL == inHook )
{
inHook = SetWindowsHookEx( WH_GETMESSAGE, GameProc, hInstDll, pid );
}
nRet = 0;
return nRet;
}
dll卸载程序
void DllUnLoad()
{
if ( NULL != inHook )
{
UnhookWindowsHookEx( inHook );
inHook = NULL;
}
}
注入处理函数
LRESULT CALLBACK GameProc(int nCode,WPARAM wParam, LPARAM lParam)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
PMSG pMsg = (PMSG)lParam;
if ( pMsg->message == WM_KEYUP )
{
if ( pMsg->wParam == VK_HOME )
{
if ( NULL == pDlg )
{
CWnd *pCwnd = CWnd::GetForegroundWindow();
pDlg = new CDlg();
pDlg->Create( IDD_DLG, pCwnd);
pDlg->ShowWindow(SW_SHOW);
}
else
{
if ( pDlg->IsWindowVisible() )
pDlg->ShowWindow(FALSE);
else
pDlg->ShowWindow(TRUE);
}
}
}
return CallNextHookEx(0,nCode,wParam,lParam);
}
int CDlgDllApp::ExitInstance()
{
if ( NULL != pDlg )
{
//pDlg->DestroyWindow();
delete pDlg;
pDlg = NULL;
}
return CWinApp::ExitInstance();
在网上找了好多例子,都只是简单的调了个.doModel();
具体在钩子函数里面生成并显示一个对话框的例子太少,能找到的也试了下,都是能注入,但注入程序一关闭,被注入的程序也跟着关闭了。还有一个大大的提示求解答。
Debug Assertion Failed!
File:f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp line:1019
跟进去后发现:
if (m_hWnd != NULL)
{
pMap = afxMapHWND();
ENSURE(pMap != NULL);
pWnd = (CWnd*)pMap->LookupPermanent(m_hWnd);
}
求各位给个提示,如果注入后不调出对话框,直接退出,被注入程序能运行,只要调用对话框资源后,就不行了。
你推出的时候有没有先释放对话框。
最近也在学这方面的问题,不过我是用改写dll方式注入.
直接改写程序调用的dll,然后再弹出自己的窗口对程序进行操作。加Q一起研究 24947970
题主这个为题不知道后台解决了么i?