2 hdwbdbsm hdwbdbsm 于 2014.08.17 21:34 提问

MFC的DLL动态库,通过HOOk注入程序

写了一个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);
}

求各位给个提示,如果注入后不调出对话框,直接退出,被注入程序能运行,只要调用对话框资源后,就不行了。

3个回答

oyljerry
oyljerry   Ds   Rxr 2015.01.17 23:53

你推出的时候有没有先释放对话框。

jfk0513
jfk0513   2015.01.29 01:53

最近也在学这方面的问题,不过我是用改写dll方式注入.
直接改写程序调用的dll,然后再弹出自己的窗口对程序进行操作。加Q一起研究 24947970

luantu
luantu   2015.12.30 17:33

题主这个为题不知道后台解决了么i?

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!