👉 실행중인 다른 프로세스의 공간에 강제로 DLL을 Injection하는 방법 을 의미
과정을 5단계로 나누면 아래와 같다.
- OpenProcess를 이용하여 대상 프로세스 핸들 구하기
- VirtualAllocEx로 대상 프로세스의 메모리 공간 확보하기
- WriteProcessMemory로 대상 프로세스이 메모리에 Inejction 할 DLL 경로 입력
- LoadLibary API 주소 구하기(GetModuleHandle, GetProcAddress)
- CreateRemoteThread로 대상 프로세스의 Injection 된 데이터 실행
메모장을 실행하면 "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"이 표함된것을 확인 할 수 있다.
참고