世界太小 2014-08-17 13:34 采纳率: 0%
浏览 3835

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 2015-01-17 15:53
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制