Я создал dll с формой в нем, и когда мы вводим dll, форма открывается.
Но проблема в том, что когда я это делаю, процесс, которому я впрыснул, застрял, и я не могу с ним заметить.
вот что я сделал.
DWORD WINAPI MessageLoop(HINSTANCE hInstance)
{
hWindow = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DLGPROC(WindowProc));
MSG Msg;
while(GetMessage(&Msg, 0, 0, 0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return 0;
}
и инъекция:
DWORD WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPSTR lpszReserved)
{
if(dwReason == DLL_PROCESS_ATTACH)
{
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)MessageLoop(hInstance), 0, 0, 0);
}
return 0;
}
@ Реми Лебо:
DWORD WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPSTR lpszReserved)
{
if(dwReason == DLL_PROCESS_ATTACH)
{
CreateThread(0, 0, &MessageLoop, hInstance, 0, 0);
}
return 0;
}
Ваш звонок в CreateThread()
неправильно. Вы не передаете адрес MessageLoop()
к этому, вы на самом деле звоните MessageLoop()
вместо. Попробуй это:
DWORD WINAPI MessageLoop(LPVOID lpParameter)
{
HINSTANCE hInstance = (HINSTANCE) lpParameter;
...
}
CreateThread(0, 0, &MessageLoop, hInstance, 0, 0);
КСТАТИ, CreateThread()
не безопасно звонить DllMain()
, Это четко указано в различной документации MSDN. Вы должны будете переместить это из DllMain()
Например, если DLL экспортирует отдельную функцию, которая вызывает CreateThread()
внутренне, и затем ваш инъекционный код вызывает экспортированную функцию после загрузки DLL в память.
Других решений пока нет …