0

フォームを含む 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;
}

@レミー・ルボー:

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

    return 0;
}
4

1 に答える 1

4

への呼び出しCreateThread()は間違っています。のアドレスを渡すのではなくMessageLoop()、実際に呼び出していMessageLoop()ます。これを試して:

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

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

ところで、CreateThread()を呼び出すのは安全ではありませんDllMain()。これは、さまざまな MSDN ドキュメントで明確に述べられています。内部でDllMain()呼び出す別の関数を DLL にエクスポートさせ、DLL がメモリにロードされた後に、インジェクション コードでエクスポートされた関数を呼び出すなどして、それを から移動する必要があります。CreateThread()

于 2012-12-29T19:29:15.527 に答える