4

我用 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;
}

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

4

1 回答 1

6

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

BOOL WINAPI DllMain(
    HINSTANCE hinstDLL,
    DWORD fdwReason,
    LPVOID lpvReserved
);

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

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

MessageBox()已实现,User32.dll因此这可能是DllMain()似乎没有被调用的可能原因。

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

于 2013-05-20T09:37:44.447 回答