我用 C++ 编写了一个 dll 和注入(inject)器。 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 注入(inject)“notepad.exe”,但它没有被执行。甚至没有 dllmain() 函数。不知道出了什么问题。
最佳答案
作为Dirk已经说过,DLL 入口点被命名为 DllMain()
,而不是 DLLMain()
。 DllMain()
的签名是:
BOOL WINAPI DllMain(
HINSTANCE hinstDLL,
DWORD fdwReason,
LPVOID lpvReserved
);
来自 Best Practices for Creating DLLs , 你永远不应该从 DllMain() 中执行以下任务:
...Call functions in User32.dll or Gdi32.dll. Some functions load another DLL, which may not be initialized...
MessageBox()
在 User32.dll
中实现,因此这可能是 DllMain()
似乎未被调用的可能原因。
使用 DllMain()
执行任何耗时的任务是不明智的,因为它会阻止应用程序加载任何其他需要的 DLL,因为在 DllMain( )
。相反,生成一个线程来执行任何耗时的任务。链接文档建议不要使用 CreateThread()
,但前提是涉及同步。
关于c++ - 注入(inject)后未执行 DLLMain(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16646487/