2012-11-12 2 views
3

CreateRemoteThread를 사용하여 기존 프로세스에 DLL을 주입하려고합니다. 문제는 응용 프로그램이 Visual Studio 2010 내에서 시작될 때 단순히 작동하지 않는다는 것입니다.Dll Injection은 Visual Studio에서 시작하지 않은 경우에만 작동합니다.

DLL을 주입 작품 :

  1. 수동으로 시작 및 주입하기 전에 VS 2010 디버거를 연결하면

  2. (탐색기에서) 수동으로 시작.

내가 선택

: 비주얼 스튜디오 2010 디버깅 시작 (F5)을하는 CreateRemoteThread 확인을 반환합니다. 나는 심지어 주입 된 프로세스에서 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; 
} 

감사합니다!

편집 :

나는 LoadLibraryA에 중단 점을 배치 올리 디버그를 사용했습니다. 어셈블리 명령어 "ret"를 GetLastError 호출로 바꿨고 EAX 레지스터에서 다음 값을 얻었습니다 : 126. MSDN 시스템 오류 코드 126은 ERROR_MOD_NOT_FOUND (지정된 모듈을 찾을 수 없음)를 의미합니다. Visual Studio에서 injection-app를 실행할 때만 발생한다는 것은 매우 이상합니다.

+2

나는 DLL 주입을 할 필요가 없다. 나는 진정으로 궁금하다. 디버거로 효과적으로 연결하고,로드를 강제하고, 스레드를 시작한 다음 분리하는 API를 수행하지 않습니다. 그렇다면 다중 디버거가 동일한 프로세스에 동시에 연결할 수 없기 때문에 오류가 발생할 수 있습니까? 내가 말했듯이, 내 생각에 완전히 추측. – WhozCraig

+0

하나의 디버거 인 VS2010 만 연결하려고합니다. 내가 수동으로 (.exe 파일을 더블 클릭) 응용 프로그램에서 연결하면 모든 것이 정상입니다. VS2010이 자식 프로세스로이 프로세스를 시작할 때 작동하지 않습니다. – Darxis

+1

아마도 내가 명확하게 말하지 않았습니다. ** 당신의 프로그램 **이 디버거 (OpenProcess() 호출 확인)로 동작하고 따라서 VS 디버거도 결과로 첨부 할 수없는 API를 호출 할 수 있습니까? 그게 더 명확 해? (또는 그 반대의 경우, btw) – WhozCraig

답변

2

마지막으로 문제를 발견했습니다!

전체 모듈 경로 나 파일 경로를 결정하기 위해 현재 작업 디렉토리를 사용

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

를 사용 얻으려면.

작업 디렉토리는 exe 파일의 경로이지만 Visual Studio에서 시작될 때 프로젝트 속성 -> 구성 속성 -> 디버깅의 작업 디렉토리를 사용합니다.

기본적으로 "$ (ProjectDir)"로 설정되어 있고 삽입 된 dll이 Debug/Release 디렉토리에 있었기 때문에 dll 파일을 찾을 수 없습니다. 따라서 오류 126 ERROR_MOD_NOT_FOUND.

이 속성을 "$ (SolutionDir) $ (Configuration) \"으로 변경했으며 모든 것이 이제 매력처럼 작동합니다.

이 질문에 도움을 주신 모든 분들께, 작동하지 않는 응용 프로그램을 디버깅하는 몇 가지 새로운 방법을 발견했습니다.