用于dll注入的Win32表单

时间:2012-12-29 19:20:09

标签: c++ winapi dll inject dll-injection

我创建了一个带有表单的dll,当我们注入dll时,表单打开了。 但问题是,当我这样做时,我注入的过程,卡住了,我不能和他注意到。

这就是我所做的。

DWORD WINAPI MessageLoop(HINSTANCE hInstance)
{
    hWindow = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DLGPROC(WindowProc));

    MSG Msg;
    while(GetMessage(&Msg, 0, 0, 0))
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }

    return 0;
}

和注射:

DWORD WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPSTR lpszReserved)
{
    if(dwReason == DLL_PROCESS_ATTACH)
    {
        CreateThread(0, 0, (LPTHREAD_START_ROUTINE)MessageLoop(hInstance), 0, 0, 0);
    }

    return 0;
}

@Remy Lebeau:

DWORD WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPSTR lpszReserved)
{
    if(dwReason == DLL_PROCESS_ATTACH)
    {
        CreateThread(0, 0, &MessageLoop, hInstance, 0, 0);
    }

    return 0;
}

1 个答案:

答案 0 :(得分:3)

您对CreateThread()的来电是错误的。您没有将MessageLoop()的地址传递给它,实际上您正在调用MessageLoop()。试试这个:

DWORD WINAPI MessageLoop(LPVOID lpParameter)
{
    HINSTANCE hInstance = (HINSTANCE) lpParameter;
    ...
}

CreateThread(0, 0, &MessageLoop, hInstance, 0, 0);

BTW,CreateThread()无法安全地拨打DllMain()。各种MSDN文档中都明确说明了这一点。您必须将其移出DllMain(),例如让DLL导出一个内部调用CreateThread()的单独函数,然后让您的注入代码在DLL加载后调用导出的函数存储器中。