注入后未执行 DLLMain()

Fah*_*eem 3 c++ windows dll-injection dllmain

我已经用 C++ 编写了一个 dll 和注入器。dll代码如下:

#include <cstdio>
#include <stdio.h>
#include <windows.h>
#include <string>
#include <fstream>
#include <winsock.h>
using namespace std;
#pragma comment(lib, "wsock32.lib")

extern "C" __declspec(dllexport) void UploadFile()
{
.....
}

INT APIENTRY DLLMain(HMODULE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
{
    switch(fdwReason)
    {
    case DLL_PROCESS_ATTACH:
        MessageBox(0,"Process Attach","Info",MB_OK);
        UploadFile();
        break;
    case DLL_THREAD_ATTACH:
        MessageBox(0,"Thread Attach","Info",MB_OK);
        UploadFile();
        break;
    case DLL_PROCESS_DETACH:
        break;
    case DLL_THREAD_DETACH:
        break;
    default:
        break;
    }
    return TRUE;
}
Run Code Online (Sandbox Code Playgroud)

dll 将特定文件上传到服务器。我能够使用 LoadLibrary() 和 CreateRemoteThread() 成功地将 dll 注入“notepad.exe”,但它没有被执行。甚至不是 dllmain() 函数。不知道出了什么问题。

hmj*_*mjd 5

正如Dirk已经说过的,DLL 入口点被命名为DllMain(),而不是DLLMain(). 签名为DllMain()

BOOL WINAPI DllMain(
    HINSTANCE hinstDLL,
    DWORD fdwReason,
    LPVOID lpvReserved
);
Run Code Online (Sandbox Code Playgroud)

根据创建 DLL 的最佳实践 ,您不应在 DllMain() 中执行以下任务:

...调用 User32.dll 或 Gdi32.dll 中的函数。某些函数会加载另一个 DLL,该 DLL 可能未初始化...

MessageBox()是在其中实现的,User32.dll因此这可能是DllMain()看起来未被调用的可能原因。

执行任何耗时的任务是不明智的,DllMain()因为它会阻止应用程序加载所需的任何其他 DLL,因为加载器锁在DllMain(). 相反,生成一个线程来执行任何耗时的任务。链接文档建议不要使用,CreateThread()但仅在涉及同步时才使用。