0

다른 프로세스에서 프로세스를 호출하려고하는데,이 프로세스는 DLL을 통해 주입되었습니다. 우리가 라이브러리 "Client.dll"을로드하는 첫 번째 부분은 완벽하게 작동합니다. 이는 DllMain (DLL_PROCESS_ATTACH)의 MessageBox Debug에 의해 파기됩니다.원격 프로세스가 시작되지 않습니다.

일단 DLL이 프로그램에로드되면 Client.dll에서 MainThread 함수를 호출하려고 시도하지만 동일한 방법 (복사, 붙여 넣기, 편집 됨)을 사용하면 작동하지 않습니다. 둘 다 아래에 게시됩니다, 아무도 말해 줄 수 왜? MainThread에서 모든 코드를 제거했지만 디버그 이유가 있습니다. 여기

메인 스레드입니다 :

void MainThread(void * Arguments) 
{ 
    MessageBoxA(NULL, "MainThread Started!", "bla", MB_OK); //Not Shown 
    for (;;) 
    { 
     //This loop is here for the main program loop. 
    } 
    _endthread(); 
} 
여기

내가 메인 스레드의 시작을 Client.dll를로드하고 주 스레드를 호출하려고 염두에 실제 분사 작업을 계속하지만 방법이다.

bool InjectDLL(DWORD ProcessID, const char* Path) 
{ 
    HANDLE Handle = OpenProcess(PROCESS_ALL_ACCESS, false, ProcessID); 
    if (!Handle) 
    { 
     std::cout << "Could not access process! Inject Failed!"; 
     return false; 
    } 

    LPVOID LoadLibraryAddress = (LPVOID)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA"); 
    LPVOID Allocate = VirtualAllocEx(Handle, NULL, strlen(Path), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); 
    WriteProcessMemory(Handle, Allocate, Path, strlen(Path), NULL); 

    HANDLE Thread = CreateRemoteThread(Handle, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibraryAddress, Allocate, 0, NULL); 
    WaitForSingleObject(Thread, INFINITE); // WAIT FOREVER! 
    VirtualFreeEx(Handle, Thread, strlen(Path), MEM_RELEASE); 

    //Start DLL Main Thread 
    LPVOID MainThreadAddress = (LPVOID)GetProcAddress(GetModuleHandleA("Client.dll"), "MainThread"); 
    Allocate = VirtualAllocEx(Handle, NULL, 0, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); 
    WriteProcessMemory(Handle, Allocate, Path, strlen(Path), NULL); 

    HANDLE MainThread = CreateRemoteThread(Handle, NULL, NULL, (LPTHREAD_START_ROUTINE)MainThreadAddress, Allocate, 0, NULL); 
    WaitForSingleObject(MainThread, INFINITE); // Wait for Main Thread to start 
    VirtualFreeEx(Handle, MainThread, strlen(Path), MEM_RELEASE); 

    CloseHandle(MainThread); 
    CloseHandle(Thread); 
    CloseHandle(Handle); 
    return true; 
} 

도움을 준 사람에게 감사드립니다.

답변

1

"MainThread"주소를 가져 오는 경우와 같은 오류 검사는 표시되지 않습니다. 이게 성공한거야?

이 기능을 사용하려면 DLL에서 .DEF 파일을 사용하거나 __declspec(dllexport)을 사용하여 "MainThread"를 명시 적으로 내 보내야합니다. 자세한 내용은 this SO lin k를 참조하십시오.

+0

문제가되었습니다. 감사합니다. 이제 MainThread 함수를 내 보낸 다음 아직 그것을 얻지 못한 주소를 얻는 지 확인하기 위해 검사를 추가했습니다. 모듈 정의 파일을 사용하고 .lib를 만듭니다. 아마 이것을 포함시켜야할까요? 미안 해요 초보자, 나는 perticularily 중 하나의 기능을 초기화하는 라이브러리를 사용하고 싶지 않아요. 도움이 될 제안이나 정보가 있으면 답장을 보내주십시오. 감사하지만 더 많은 소식통을 보게 될 것입니다. – user1591117

+1

DLL에 대해 dumpbin/exports를 실행하십시오. 이렇게하면 모든 종류의 이름 변환을 포함하여 내 보낸 모든 기능의 목록이 제공됩니다. 이 명령에서 출력되는 이름은 GetProcAddress() 호출에서 지정하려는 이름입니다. 내 보낸 함수를 "C"링키지 (예 : extern "C"void MainThread() {})로 정의하여 일부 mangling을 제거 할 수 있습니다. – Bukes

+0

감사합니다. 잠시 시간을내어 주위를 둘러 보았습니다. 나는 당신의 안내에 감사드립니다. 시간 내 줘서 고마워! – user1591117

관련 문제