Проблема с DLL injection & запуском thread
Виснет если использую:
std::thread::join()
- у меня 64 битная 7 винда. Может для многопоточности нужны дополнительные параметры компилирования? от Starkmen, 28 августа 2012 года
- проверил с другими приложениями - тоже зависают. Скажите, как приинжектив dll можно запустить параллельный поток? от Starkmen, 27 августа 2012 года
- Уже написал два разных инжектора, но не с одним толком не работает. то есть доходит до джойна потока и все от Starkmen, 27 августа 2012 года
- Сообщено об удачном подключении появляется, но после этого прога зависает от Starkmen, 27 августа 2012 года
- С ошибкой ещё не разобрался, хочу прикрутить обработку ошибок... Я слез с C# и еще совсем новичок в VC++. Там проще от Starkmen, 27 августа 2012 года
- смотрите в комменты ниже от Starkmen, 27 августа 2012 года
Как поток создаешь для join??
С какой ошибкой вылетает??
Покажи больше кода.
Вы в длл пытаетесь создать поток?
function InjectDLL(PId: CARDINAL; DllPath: WideString): BOOL; stdcall;
var
RemotePMem, StartAddress: POINTER;
LibPathLen, HProcess, RealWrite: CARDINAL;
WriteProcess: BOOL;
begin
LibPathLen := Length(DllPath)*2;
HProcess := OpenProcess(PROCESS_ALL_ACCESS, TRUE, PId);
RemotePMem := VirtualAllocEx(HProcess, NIL, LibPathLen, MEM_COMMIT, PAGE_READWRITE);
StartAddress := GetProcAddress(GetModuleHandle('kernel32.dll'), 'LoadLibraryW');
WriteProcess := WriteProcessMemory(HProcess, RemotePMem, PWideChar(DllPath), LibPathLen, RealWrite);
HThread := CreateRemoteThread(HProcess, NIL, 0, StartAddress, RemotePMem, 0, MyTId);
CloseHandle(HProcess);
Result := TRUE;
end;
Или вам так категорически не подходит?
Но когда сам инжектишь никаких проблем не видал. Так что скорее всего это какието ваши баги.
Побольше кода действительно увидеть нужно.
#include <thread>
void hello()
{
MessageBoxA(NULL,"HELLO","HELLO",64);
}
BOOL WINAPI DllMain(HINSTANCE DLL,DWORD fdwReason,LPVOID lpvReserved)
{
if(fdwReason == DLL_PROCESS_ATTACH)
{
MessageBoxA(NULL,"Connected","DLL",MB_OK);
HMODULE hmodule;
if((hmodule=GetModuleHandle(NULL))!=NULL)
{
std::thread t(hello);
t.join();
}
}
}
scanf_s("%d",&procid);
HANDLE proc= OpenProcess(CREATE_THREAD_ACCESS, FALSE, PID);
char dll[]="inject.dll";
LPVOID LoadLibAddy = (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
LPVOID RemoteString = (LPVOID)VirtualAllocEx(proc, NULL, strlen(dll), MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(proc, (LPVOID)RemoteString, DLL_NAME,strlen(dll), NULL);
CreateRemoteThread(proc, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddy, (LPVOID)RemoteString, NULL, NULL);
CloseHandle(proc);
проблема видно не в инжекторе, а в самой процедуре запуска процесса
#include <thread>
void hello()
{
MessageBoxA(NULL,"HELLO","HELLO",64);
}
BOOL WINAPI DllMain(HINSTANCE DLL,DWORD fdwReason,LPVOID lpvReserved)
{
if(fdwReason == DLL_PROCESS_ATTACH)
{
MessageBoxA(NULL,"Connected","DLL",MB_OK);
HMODULE hmodule;
if((hmodule=GetModuleHandle(NULL))!=NULL)
{
std::thread t(hello);
t.join();
}
}
}
MessageBoxA(NULL,"Connected","DLL",MB_OK);
Этот мсж выдает?
Без t.join(); зависает?
И еще попробуй свернуть все окна и развернуть зависшее - мб месжбокс тупо под окном приложения прячется. (было такое на c# в паре проектов)
Ну и в догонку: чем компилировал? зависимости собрал в одну dll или динамические?
#include <thread>
void hello()
{
MessageBoxA(NULL,"HELLO","HELLO",64);
}
BOOL WINAPI DllMain(HINSTANCE DLL,DWORD fdwReason,LPVOID lpvReserved)
{
if(fdwReason == DLL_PROCESS_ATTACH)
{
MessageBoxA(NULL,"Connected","DLL",MB_OK);
HMODULE hmodule;
if((hmodule=GetModuleHandle(NULL))!=NULL)
{
std::thread t(hello);
t.join();
}
}
}
MessageBoxA(NULL,"Connected","DLL",MB_OK);
Этот мсж выдает?
Без t.join(); зависает?
И еще попробуй свернуть все окна и развернуть зависшее - мб месжбокс тупо под окном приложения прячется. (было такое на c# в паре проектов)
Ну и в догонку: чем компилировал? зависимости собрал в одну dll или динамические?
MessageBoxA(NULL,"Connected","DLL",MB_OK); выдает сообщение об успешном Injection, собственно void hello нужно запустить в параллельном потоке. Да, виснет даже без джойна. И я это пробовал не только на одной целевой программе, но и на других. Все равно виснет.
Компилировал в VC++, зависимости в моей dll, которую инжектю