CreateRemoteThread를 사용하여 기존 프로세스에 DLL을 주입하려고합니다. 문제는 응용 프로그램이 Visual Studio 2010 내에서 시작될 때 단순히 작동하지 않는다는 것입니다.Dll Injection은 Visual Studio에서 시작하지 않은 경우에만 작동합니다.
DLL을 주입 작품 :
수동으로 시작 및 주입하기 전에 VS 2010 디버거를 연결하면
(탐색기에서) 수동으로 시작.
내가 선택
: 비주얼 스튜디오 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를 실행할 때만 발생한다는 것은 매우 이상합니다.
나는 DLL 주입을 할 필요가 없다. 나는 진정으로 궁금하다. 디버거로 효과적으로 연결하고,로드를 강제하고, 스레드를 시작한 다음 분리하는 API를 수행하지 않습니다. 그렇다면 다중 디버거가 동일한 프로세스에 동시에 연결할 수 없기 때문에 오류가 발생할 수 있습니까? 내가 말했듯이, 내 생각에 완전히 추측. – WhozCraig
하나의 디버거 인 VS2010 만 연결하려고합니다. 내가 수동으로 (.exe 파일을 더블 클릭) 응용 프로그램에서 연결하면 모든 것이 정상입니다. VS2010이 자식 프로세스로이 프로세스를 시작할 때 작동하지 않습니다. – Darxis
아마도 내가 명확하게 말하지 않았습니다. ** 당신의 프로그램 **이 디버거 (OpenProcess() 호출 확인)로 동작하고 따라서 VS 디버거도 결과로 첨부 할 수없는 API를 호출 할 수 있습니까? 그게 더 명확 해? (또는 그 반대의 경우, btw) – WhozCraig