이번에는 DLL Injection 의 또 다른 구현 방법들에 대해서 알아보도록 하겠습니다.
AppInit_DLLs
Windows 운영체제에서 기본으로 제공하는 레지스트리 키 중에서 AppInit_DLLs 란 것이 있습니다.
AppInit_DLLs
<Fig. 1>
AppInit_DLLs 값에 인젝션을 원하는 DLL 경로를 써준 후 재부팅하면, 이후 Windows 운영체제는 재부팅하면서 실행되는 모든 프로세스에 해당 DLL 을 인젝션 시켜줍니다. 너무 간단하면서도 너무 강력한 기능이지요.
간단한 실습을 해보겠습니다. 일단 아래 myhack2.cpp 소스를 보시죠.
#include "windows.h"
#define DEF_CMD "c:\\Program Files\\Internet Explorer\\iexplore.exe"
#define DEF_ADDR "www.naver.com"
#define DEF_DST_PROC "notepad.exe"
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
char szCmd[MAX_PATH] = {0,};
char szPath[MAX_PATH] = {0,};
char *szProcess = 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 ) )
break;
if( !(szProcess = strrchr(szPath, '\\')) )
break;
szProcess++;
if( stricmp(szProcess, DEF_DST_PROC) )
break;
wsprintf(szCmd, "%s %s", DEF_CMD, DEF_ADDR);
if( !CreateProcess(NULL, (LPTSTR)(LPCTSTR)szCmd,
NULL, NULL, FALSE,
NORMAL_PRIORITY_CLASS,
NULL, NULL, &si, &pi) )
break;
if( pi.hProcess != NULL )
CloseHandle(pi.hProcess);
break;
}
return TRUE;
}
소스 코드 내용은 간단합니다.
현재 자신을 로딩한 프로세스 이름이 "notepad" 라면 IE(Internet Explorer) 를 숨김모드로 실행시켜 Naver 사이트에 접속하게 됩니다. 목적에 따라서 다양한 업무를 수행할 수 있겠죠?
차례대로 따라해보겠습니다.
#1. 파일 복사
첨부된 파일을 적절한 위치에 복사합니다. (제 경우엔 C:\work\myhack2.dll)
#2. 레지스트리 값(AppInit_DLLs) 입력
regedit.exe 를 실행하여 아래와 같이 입력합니다. (myhack2.dll 의 전체경로를 입력해주세요.)
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows
<Fig. 2>
#3. 재부팅
재부팅이 완료되었으면 Process Explorer 를 이용해서 과연 myhack.dll 이 모든 프로세스에 인젝션 되었는지 확인해 보겠습니다.
<Fig. 3>
myhack2.dll 이 모든 프로세스에 성공적으로 인젝션 되었습니다.
인젝션된 myhack2.dll 은 아무 동작을 하고 있지 않습니다. (notepad 프로세스만 대상으로 한다는 걸 기억하세요.)
notepad 를 실행하면 아래 그림과 같이 IE 가 (숨김 속성으로) 실행되는걸 확인할 수 있습니다.
<Fig. 4>
* 주의!
AppInit_DLLs 레지스트리 키는 너무나 강력해서 모든 프로세스에 DLL 을 인젝션 시켜버립니다.
만약 인젝션되는 DLL 에 문제(버그)가 있다면 자칫 Windows 부팅이 안되는 상황이 발생할 수 있습니다.
이 경우 Window Preinstalled Environment 부팅 CD (예:BartPE)가 없다면 복구할 수 없습니다.
따라서 AppInit_Dlls 를 사용할 때는 사전에 철저한 테스트가 필요합니다.
SetWindowsHookEx() - message hook
SetWindowsHookEx() API 를 이용하여 메시지 훅을 설치하면 OS 에서 hook procedure 를 담고 있는 DLL 을 (윈도우를 가진) 프로세스에 강제로 인젝션 시켜줍니다.
이 또한 DLL Injection 의 한 기법입니다.
자세한 설명은 제 글을 참고하시기 바랍니다.
- Windows Message Hooking (윈도우 메시지 후킹)
다음번에는 실행파일의 PE Header 정보를 조작하여 원하는 DLL 파일을 로딩시키는 방법에 대해서 알아보겠습니다. (엄밀히 말하면 DLL Injection 이라고 할 수 는 없습니다만, 리버싱에서 즐겨 사용되는 방법이기에 같이 소개합니다.)
Dll Injection - 다른 프로세스에 침투하기 (4)
ReverseCore
'study' 카테고리의 다른 글
API Hooking - '스텔스' 프로세스 (2) (32) | 2009.12.16 |
---|---|
API Hooking – '스텔스' 프로세스 (1) (23) | 2009.12.13 |
API Hooking - Tech Map (14) | 2009.09.29 |
API Hooking - 리버싱의 '꽃' (25) | 2009.09.22 |
DLL Injection - 다른 프로세스에 침투하기 (4) (33) | 2009.07.30 |
DLL Injection - 다른 프로세스에 침투하기 (3) (10) | 2009.07.17 |
DLL Injection - 다른 프로세스에 침투하기 (2) (117) | 2009.07.17 |
DLL Injection - 다른 프로세스에 침투하기 (1) (17) | 2009.07.06 |
PE(Portable Executable) File Format (8) - PE Header (16) | 2009.04.22 |
PE(Portable Executable) File Format (7) - PE Header (42) | 2009.04.18 |
PE(Portable Executable) File Format (6) - PE Header (62) | 2009.04.06 |
-
dsds1994@naver.com 2010.06.10 21:48
죄송한데 AppInit_DLLs 의 레지를 수정하면 모든 프로세서에 dll 이 인젝션된다는거잖아요
일정 프로세서를 지정해서 인젝션되게는 할수없나요?-
reversecore 2010.06.14 23:56
안녕하세요.
AppInit_Dlls 는 원래부터 global injection 을 목표로 만들어진 것입니다.
특정 프로세스만을 원하신다면 CreateRemoteThread()/ZwCreateThreadEx() 등을 이용하시면 됩니다.
감사합니다.
-
-
ky 2010.07.02 18:56
저기 .. DLL작동하나요?,, 안하는거같은데?,
저 위에 인터넷실행 부분 지우고 메시지박스로 대체했는데 안되는군요.-
reversecore 2010.07.03 14:55
안녕하세요.
위 myhack2.dll 말씀이시죠?
직접 코드를 수정한 후 테스트했는데 안되셨다는 말씀같네요.
혹시 myhack2.dll 은 잘 실행되는지요?
ky 님께서 만든 DLL 이 안되었다면 그 DLL 을 저에게 보내주세요.
제가 한번 봐드리겠습니다.
reversecore@gmail.com 주소로 해당 dll 파일의 확장자를 dllx 로 바꾸신후 첨부해서 보내주세요~
그리고 위 내용에 소개되어 있듯이, APPInit_Dlls 키는 너무나 강력해서 만약 테스트하는 DLL 에 버그가 있거나 논리적인 오류가 있다면 OS 부팅이 안되는 경우가 발생합니다. 매우 주의하시기 바랍니다.
감사합니다.
-
-
-
reversecore 2011.05.03 00:58 신고
안녕하세요.
Anti-DLL Injection 말씀이신가요?
간단한 API Hooking 만으로도 인젝션 기법은 무력화 된답니다.
감사합니다.
-
-
cyocyo 2014.10.08 00:49
이젝션 예제를 실행할 때 자꾸
The token does not have the specified privilege.이 뜹니다 ㅜㅜ 왜 그런지 설명좀 부탁드려도 될까요?ㅜㅜ -
AppInit_DLLs 방법을 사용하면 MessageBox같은 함수를 호출하지 못하던데요
http://www.digipine.com/index.php?mid=programming&search_target=tag&search_keyword=C&page=2&listStyle=webzine&document_srl=615
여기를 좀 읽어보니까 대충 kernel32.dll만 올라온 다음 즉시 인젝션이 되는 듯한 느낌이던데
그래서 user32.dll의 함수인 MessageBox같은 API를 불러오지 못하는 것 같고..
제 생각이 맞는 해석인지 아시는 분이 계신다면 확답을 부탁 드립니다..