我用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()函数。不知道出了什么问题。
答案 0 :(得分:4)
如Dirk所述,DLL入口点名为DllMain()
,而不是DLLMain()
。 DllMain()
的签名是:
BOOL WINAPI DllMain(
HINSTANCE hinstDLL,
DWORD fdwReason,
LPVOID lpvReserved
);
从Best Practices for Creating DLLs 开始,你绝不应该在DllMain()中执行以下任务:
{p>...调用User32.dll或Gdi32.dll中的函数。一些函数加载另一个DLL,可能无法初始化...
MessageBox()
已在User32.dll
中实施,因此这可能是导致DllMain()
无法被调用的原因。
使用DllMain()
执行任何耗时的任务是不明智的,因为它会阻止应用程序加载任何其他需要的DLL,因为加载程序锁定在DllMain()
内时。相反,产生一个线程来执行任何耗时的任务。链接文档建议不要使用CreateThread()
,但仅限于涉及同步。