Dll Injection работает только тогда, когда не запускается из Visual Studio

Я пытаюсь внедрить DLL в существующий процесс, используя CreateRemoteThread. Проблема в том, что когда приложение запускается из Visual Studio 2010, оно просто не работает.

DLL Injection работает:

  1. При запуске вручную (из проводника)

  2. При запуске вручную И подключении отладчика 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 запускает инъекционное приложение.

3

Решение

Наконец я нашел проблему!

Чтобы получить полный путь к модулю, который я использовал

GetFullPathName("Inj_DLL.dll", MAX_PATH, dll_path, NULL);

который использует текущий рабочий каталог для определения пути к файлу.

Когда я запускаю приложение вручную, рабочим каталогом является путь к exe-файлу, но когда он запускается из Visual Studio, он использует рабочий каталог из Свойства проекта-> Свойства конфигурации-> Отладка.

Так как он был установлен в «$ (ProjectDir)» по умолчанию, а внедренная dll находилась в dir отладки / выпуска, файл dll не найден, поэтому ошибка 126 ERROR_MOD_NOT_FOUND.

Я изменил это свойство на «$ (SolutionDir) $ (Configuration) \», и ​​теперь все работает как шарм.

Спасибо всем, кто пытался помочь мне с этим вопросом, я обнаружил несколько новых подходов к отладке нерабочего приложения.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]