注入后没有执行DLLMain()

时间:2013-05-20 09:31:55

标签: 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;
}

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

1 个答案:

答案 0 :(得分:4)

Dirk所述,DLL入口点名为DllMain(),而不是DLLMain()DllMain()的签名是:

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

Best Practices for Creating DLLs 开始,你绝不应该在DllMain()中执行以下任务:

  

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

{p> MessageBox()已在User32.dll中实施,因此这可能是导致DllMain()无法被调用的原因。

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