본문 바로가기
Reversing

Dll Injection 02

by wlgpdnjs 2020. 5. 18.

2. CreateRemoteThread

  Main()에서 인젝션 할 dll과 프로세스를 입력받은 후 InjectDll함수를 실행

  OpenProcess()를 이용해 notepad.exe프로세스 핸들 구한 후

  Dll을 삽입할 프로세스의 메모리에 삽입할 공간, dll파일의 경로를 VirtualAllocEx(), WriteProcessMemory를 이용해 할당, 메모리에 입력

  dll인젝션은 LoadLibrary()를 대상 프로세스가 실행하게 해 dll을 로딩하는 것이므로 프로그램에 로딩되어 있는 kernel32.dll에서의 loadlibrary() 주소를 얻어와 CreateRemoteThread()를 이용해 원격으로 실행

  GetModuleHandle(), GetProcAddress()를 이용해 kernel32.dll의 핸들을 받아 LoadLibrary()의 주소를 얻음

 

InjectDll.cpp

#include<Windows.h>
#include<tchar.h>

BOOL InjectDll(DWORD dwPID, LPCTSTR szDllPath) {
	HANDLE hProcess = NULL, hThread = NULL;
	HMODULE hMod = NULL;
	LPVOID pRemoteBuf = NULL;
	DWORD dwBufSize = (DWORD)(_tcslen(szDllPath) + 1)*sizeof(TCHAR);
	LPTHREAD_START_ROUTINE pThreadProc;

	if (!(hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID))) {
		_tprintf(L"OpenProcess(%d) failed!!! [%d]\n", dwPID, GetLastError());
		return FALSE;
	}

	pRemoteBuf = VirtualAllocEx(hProcess, NULL, dwBufSize, MEM_COMMIT, PAGE_READWRITE);


	WriteProcessMemory(hProcess, pRemoteBuf, (LPVOID)szDllPath, dwBufSize, NULL);

	hMod = GetModuleHandle(L"kernel32.dll");
	pThreadProc = (LPTHREAD_START_ROUTINE)GetProcAddress(hMod, "LoadLibraryW");

	hThread = CreateRemoteThread(hProcess, NULL, 0, pThreadProc, pRemoteBuf, 0, NULL);
	WaitForSingleObject(hThread, INFINITE);

	CloseHandle(hThread);
	CloseHandle(hProcess);

	return TRUE;
}

int _tmain(int argc, TCHAR *argv[]) {
	if (argc != 3) {
		_tprintf(L"USAGE : %s pid dll_path\n", argv[0]);
		return 1;
	}

	if (InjectDll((DWORD)_tstol(argv[1]), argv[2]))
		_tprintf(L"InjectDll(\"%s\") success!!!\n", argv[2]);
	else
		_tprintf(L"InjectDll(\"%s\") failed!!!\n", argv[2]);

	return 0;
}

 

My_dll.cpp

#include<tchar.h>
#include<Windows.h>

#pragma comment(lib,"urlmon.lib")

#define DEF_URL L"http://www.naver.com/index.html"
#define DEF_FILE_NAME L"C:\\index.html"

HMODULE g_hMod = NULL;

DWORD WINAPI ThreadProc(LPVOID lParam) {
	TCHAR szPath[_MAX_PATH] = { 0, };

	if (!GetModuleFileName(g_hMod, szPath, MAX_PATH))
		return FALSE;

	TCHAR *p = _tcsrchr(szPath, '\\');
	if (!p)
		return FALSE;

	_tcscpy_s(p + 1, _MAX_PATH, DEF_FILE_NAME);

	URLDownloadToFile(NULL, DEF_URL, DEF_FILE_NAME, 0, NULL);//urlmon.dll의URLDownloadToFile()을 실행, 네이버 초기화면(index.html)다운
	return 0;
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
	HANDLE hThread = NULL;

	switch (fdwReason) {
	case DLL_PROCESS_ATTACH: //dll이 로딩되었을 때 ThreadProc()실행
		hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);
		CloseHandle(hThread);
		break;
	}
	return TRUE;
}

 

    (1)   VirtualAllocEx : 프로세스의 가상메모리에 메모리 공간을 확보해서 할당받는다.

VirtualAllocEx

 

    (2)   CreateRemoteThread : 다른 프로세스의 주소 영역 내에 쓰레드를 생성, 쓰레드를 가진 프로세스에 대해 가상 메모리에 대한 쓰기, 읽기 권한을 갖는다.

 

    (3)   InjectDll.exe 실행

 

notepad.exe의 PID를 processexplorer로 구한다.

 

notepad.exe PID를 알아내 my_dll_01.dll 삽입

 

notepad.exe에 my_dll_01.dll 삽입 확인

 

'Reversing' 카테고리의 다른 글

Dll Injection 03  (0) 2020.05.20
Dll Injection 01  (0) 2020.05.18
[python] base64 모듈을 이용한 custom base64  (0) 2018.11.23
닷지 게임 패치  (0) 2018.01.21
피카츄배구  (0) 2018.01.21