Я пытаюсь внедрить DLL в существующий процесс, используя CreateRemoteThread. Проблема в том, что когда приложение запускается из Visual Studio 2010, оно просто не работает.
DLL Injection работает:
При запуске вручную (из проводника)
При запуске вручную И подключении отладчика VS 2010 до внедрения.
Когда я выбираю: Начать отладку (F5) в Visual Studio 2010, CreateRemoteThread возвращает OK. Я даже установил точку останова на LoadLibraryA во внедренном процессе, и он получил удар. Так поток запускается, но не достигает DllMain функция. LoadLibraryA выполняется, но модуль не загружается.
Код впрыска:
void InjectDll(DWORD processId, string dllFile)
{
HANDLE hProcess = OpenProcess(CREATE_THREAD_ACCESS, FALSE, processId);
if ( hProcess != NULL )
{
int lenWrite = dllFile.length();
LPVOID allocMem = (LPVOID)VirtualAllocEx(hProcess, NULL, lenWrite, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(hProcess, allocMem , dllFile.c_str(), lenWrite, NULL);
LPTHREAD_START_ROUTINE injector = (LPTHREAD_START_ROUTINE) GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
if(!injector)
return;
DWORD threadId;
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, injector, allocMem, 0, &threadId);
DWORD Result = WaitForSingleObject(hThread, 10*1000); //Time out : 10 secondes
VirtualFreeEx(hProcess, allocMem, lenWrite, MEM_RELEASE);
CloseHandle(hProcess);
CloseHandle(hThread);
}
}
И код DllMain:
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
HelloWorldMessageBox();
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
Спасибо за помощь!
Редактировать:
Я использовал ollyDbg для установки точки останова на LoadLibraryA. Я заменил инструкцию по сборке «ret» на вызов GetLastError, и я получил следующее значение в регистре EAX: 126. Из MSDN Системный код ошибки 126 означает ERROR_MOD_NOT_FOUND (указанный модуль не найден.). Очень странно, что это происходит только тогда, когда Visual Studio запускает инъекционное приложение.
Наконец я нашел проблему!
Чтобы получить полный путь к модулю, который я использовал
GetFullPathName("Inj_DLL.dll", MAX_PATH, dll_path, NULL);
который использует текущий рабочий каталог для определения пути к файлу.
Когда я запускаю приложение вручную, рабочим каталогом является путь к exe-файлу, но когда он запускается из Visual Studio, он использует рабочий каталог из Свойства проекта-> Свойства конфигурации-> Отладка.
Так как он был установлен в «$ (ProjectDir)» по умолчанию, а внедренная dll находилась в dir отладки / выпуска, файл dll не найден, поэтому ошибка 126 ERROR_MOD_NOT_FOUND.
Я изменил это свойство на «$ (SolutionDir) $ (Configuration) \», и теперь все работает как шарм.
Спасибо всем, кто пытался помочь мне с этим вопросом, я обнаружил несколько новых подходов к отладке нерабочего приложения.
Других решений пока нет …