다른 프로세스에서 프로세스를 호출하려고하는데,이 프로세스는 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;
}
도움을 준 사람에게 감사드립니다.
문제가되었습니다. 감사합니다. 이제 MainThread 함수를 내 보낸 다음 아직 그것을 얻지 못한 주소를 얻는 지 확인하기 위해 검사를 추가했습니다. 모듈 정의 파일을 사용하고 .lib를 만듭니다. 아마 이것을 포함시켜야할까요? 미안 해요 초보자, 나는 perticularily 중 하나의 기능을 초기화하는 라이브러리를 사용하고 싶지 않아요. 도움이 될 제안이나 정보가 있으면 답장을 보내주십시오. 감사하지만 더 많은 소식통을 보게 될 것입니다. – user1591117
DLL에 대해 dumpbin/exports를 실행하십시오. 이렇게하면 모든 종류의 이름 변환을 포함하여 내 보낸 모든 기능의 목록이 제공됩니다. 이 명령에서 출력되는 이름은 GetProcAddress() 호출에서 지정하려는 이름입니다. 내 보낸 함수를 "C"링키지 (예 : extern "C"void MainThread() {})로 정의하여 일부 mangling을 제거 할 수 있습니다. – Bukes
감사합니다. 잠시 시간을내어 주위를 둘러 보았습니다. 나는 당신의 안내에 감사드립니다. 시간 내 줘서 고마워! – user1591117