- 실행중인 다른 프로세스에 특정 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.dll의 DLL_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 |
STARTUPINFO나 STARTUPINFOEX의 포인터 프로세스의 속성 정보 전달(STARTUPINFO구조체 초기화 후 변수 전달) |
LPPROCESS_INFORMATION lpProcessInformation | 생성하는 프로세스의 정보를 얻기 위한 매개변수(PROCESS_INFORMATION의 주소) |
(4) Appinit_dlls 실행
※Windows 7 32bit 환경에서 실행, release모드로 컴파일
'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 |