본문 바로가기
Reversing

Dll Injection 01

by wlgpdnjs 2020. 5. 18.
  • 실행중인 다른 프로세스에 특정 DLL 파일을 강제로 삽입
  • (LoadLibrary() -> DllMain실행)
  • CreateRemoteThread(), AppInit_Dlls(레지스트리), SetWindowsHookEx()의 세 가지 방법 존재.

 

 

1. Appinit_dlls

 

    (1)   HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows\Appinit_dlls

    (2)   LoadAppinit_dlls의 값을 1로 바꿔줘야함

         ( 0 -> Appinit_dlls 사용X,   1 -> Appinit_dlls 사용)

 

    (3)   User32.dllDLL_PROCESS_ATTACH과정에서 LoadLibrary()를 사용하여 로드된다.

 

Appinit_dlls_01.cpp

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

#define DEF_CMD L"C:\\Windows\\System32\\calc.exe"
#define DEF_DST_PROC L"NOTEPAD.EXE"

BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved) {
	TCHAR szCmd[MAX_PATH] = { 0, };
	TCHAR szPath[MAX_PATH] = { 0, };
	TCHAR *p = NULL;
	STARTUPINFO si = { 0, };
	PROCESS_INFORMATION pi = { 0, };//새로 생성되는 프로세스 정보 얻기 위해 사용

	si.cb = sizeof(STARTUPINFO);//구조체 변수 크기
	si.dwFlags = STARTF_USESHOWWINDOW;//실행될 프로세스 플래그
	si.wShowWindow = SW_HIDE;//생성되는 윈도우 상태

	switch (fdwReason) {
	case DLL_PROCESS_ATTACH:
		if (!GetModuleFileName(NULL, szPath, MAX_PATH))
			//HMODULE자리에 NULL --> 자신의 실행 경로 반환
			break;
		if (!(p = _tcsrchr(szPath, '\\')))
			break;
		if (_tcsicmp(p + 1, DEF_DST_PROC))//실행 프로그램이 notepad.exe 인지 비교
			break;
		//실행된 프로그램이 notepad.exe일 때 calc.exe실행
		if (!CreateProcess(DEF_CMD, //생성한 프로세스 절대 경로
			NULL,
			NULL, NULL, FALSE,//부모 프로세스 상속  X
			NORMAL_PRIORITY_CLASS,//프로세스 속성
			NULL, NULL, &si,//STARTUPINFO
			&pi))//생성하는프로세스 정보(PROCESS_INFORMATION)
			break;
		if (pi.hProcess != NULL)
			CloseHandle(pi.hProcess);
		break;
	}
	return TRUE;
}

 

  • CreateProcess
LPCTSTR     lpApplicationName 생성할 프로세스 절대 경로, NULL을 넣고 lpCommandLine에서 상대경로로 넣어줄 수도 있다.
LPTSTR    lpCommandLine 생성할 프로세스에 인자 전달할 때 사용
LPSECURITY_ATTRIBUTES    lpProcessAttributes 보안 속성, NULL을 넣으면 디폴트 값으로 설정
LPSECURITY_ATTRIBUTEST    lpThreadAttributes 쓰레드의 보안 속성, NULL입력 시 디폴트 값으로 지정
BOOL    bInheritHandles TRUE로 지정할 시 부모 프로세스의 핸들을 상속받는다, FALSE로 지정하면 상속 X
DWORD    dwCreationFlags 우선 순위 등급, 프로세스의 생성 제어, 일반적인 프로세스 0
LPVOID    lpEnvironment 프로세스 환경블록, NULL이면 부모 환경블록 사용
LPCTSTR    lpCurrentDirectory 생성하는 프로세스의 현재 경로,NULL 입력 시 부모 위치
LPSTARTUPINFO     lpStartupInfo

STARTUPINFOSTARTUPINFOEX의 포인터

프로세스의 속성 정보 전달(STARTUPINFO구조체 초기화 후 변수 전달)
LPPROCESS_INFORMATION    lpProcessInformation 생성하는 프로세스의 정보를 얻기 위한 매개변수(PROCESS_INFORMATION의 주소)

    

    (4)   Appinit_dlls 실행

         ※Windows 7 32bit 환경에서 실행, release모드로 컴파일

 

Appinit_dlls 레지스트리

 

Appinit_dlls_01.dll 로딩

 

notepad.exe 실행 시 calc.exe 실행 1

 

notepad.exe 실행시 calc.exe 실행 2

 

 

 

'Reversing' 카테고리의 다른 글

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