DLLMain() не выполняется после внедрения
Я написал DLL и инжектор в C++. Код 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 загружает определенный файл на сервер. Я успешно могу ввести DLL в "notepad.exe" с помощью LoadLibrary() и CreateRemoteThread(), но он не выполняется. Даже не функция dllmain(). Не знаю, что не так.
1 ответ
Как уже сказал 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()
но только если задействована синхронизация.