2009-06-21 9 views
1

그래서 DLL을 주입 한 다른 응용 프로그램을 시작하는 응용 프로그램이 있습니다 (Detours와 함께). 진입 점은 DllMain입니다. 나는 DllMain에서 많은 것을 할 수없고 확실히 반복 할 수 없다. 그렇다면 x 초마다 DLL 모니터 기능을 어떻게 호출합니까? DllMain에서 스레드를 생성 할 수 없다는 것을 읽었습니다 (적어도 반환 할 때까지). 그래서 첨부 스레드 이벤트에서 그것을 만들려고했는데 그것은 나를 추락시켰다. 그래서 지금 내가하려고하는 것은 모듈 핸들을 얻을 수 있도록 다시 주입하는 것입니다 (Detours가 실패 함). 그런 다음 스레드를 생성하는 초기화 함수의 주소를 얻습니다. 모듈 처리 괜찮아요,하지만 함수 주소를 얻을 수 있다고 생각하지 않습니다. 나는 그 기능을 비웠다. 그리고 그것은 아직도 나를 붕괴시켰다. 따라서 함수를 호출하는 것까지까지 도달하지 못합니다. Visual Studio에 내가 읽기 권한이 없다고했습니다.내부에 루프를 주입 한 DLL은 어디에 있습니까?

그럼 어떻게해야합니까? 첨부 된 프로그램 (exe)을 소유하지 않은 경우 DLL 기능을 루프하기 위해 무엇을합니까?

//Application.exe 
STARTUPINFO si = {sizeof(STARTUPINFO)}; 
     PROCESS_INFORMATION pi = {0}; 

     DetourCreateProcessWithDll(filename, NULL, NULL, NULL, TRUE, 
            CREATE_DEFAULT_ERROR_MODE | CREATE_SUSPENDED, NULL, path, 
            &si, &pi, detoured, hook, NULL); 

     processID = pi.dwProcessId; 

     hDll = InjectDLL(processID, hook); 


if(hDll != NULL) 
{ 
STARTER Starter = (STARTER)GetProcAddress(hDll, "Starter"); 

if(Starter != NULL) 
    Starter(); 
} 

     ResumeThread(pi.hThread); 

기능 초보자는 extern C가 내보내지고 정밀하게 검사됩니다 (서수 1 임).

나는 무엇이 잘못 될 수 있는지 전혀 몰랐으며 단지 누군가가이 주제에 대한 경험이 있고 충돌하는 것을 희망합니다. 여기

는 DLL 코드입니다 : DLL이 다른 프로세스에 주입되기 때문에

답변

1

당신은 그런 식으로 할 수없는

//Hook.h 
extern "C" 
{ 
    void __declspec(dllexport) Starter(void); 
} 

//Hook.cpp 
void Starter(void) 
{ 

} 

덕분에 당신은 주소에서 함수를 실행하기 위해 노력하고 당신의 후킹 과정의 공간.

CreateRemoteThread을 호출하면 lpStartAddress 매개 변수의 GetProcAddress에서 가져온 주소로 전달됩니다. 이렇게하면 원격 프로세스에 새 스레드가 만들어지며 새 스레드의 컨텍스트에서 해당 프로세스의 주소 공간에서 함수가 실행됩니다.

기술적으로 권장하지는 않지만 기술적으로 다른 스레드와의 동기화를 수행하지 않는 한 DllMain/DLL_PROCESS_ATTACH에 새 스레드를 생성 할 수 있어야합니다. DLL을 주입 할 때이 작업을 수행 할 때 어떤 문제가 있는지 확실하지 않습니다.

관련 문제