WindowsTip

DLL Injection은 어떻게 이루어지는가?

by 디케 posted May 25, 2013
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄

DLL Injection은 어떻게 이루어지는가?

 

첫번째 - 레지스트리를 조작하는 방법

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs Windows의 많은 어플리케이션들이 user32.dll을 호출합니다.

이 DLL에는 창관리자를 호출하는 API 함수들이 있습니다. Windows가 기본적으로 GUI 환경이고 그 때문에 어플리케이션들도 user32.dll을 호출하기 마련이죠.

 

user32.dll은 LoadLibrary() 함수를  이용하여  AppInit_DLLs  안에  지정된  DLL들을  호출합니다.

 공격자가 이 레지스트리 값을 악의적으로 변경한다면 악성코드를 프로세스에 심을 수 있죠.

이 방법은 해당 레지스트리 값만 조사하면 금방 탐지될 수 있는 단점이 있습니다.

보통 정상적인 경우라면 위에서도 언급했듯이 값이 비어있기 때문이죠.

그렇더라도 레지스트리가 무엇인지 모르는 윈도우즈 사용자가 대부분이기 때문에 이것만으로도 꽤 치명적이라 할 수 있습니다.

 

두번째 - DLL 코드 자체를 변경하는 방법

Email-Worm.Win32.Warezov.nf 이라는 웜이 AppInit_DLLs 값을 변경하여 DLL Injection을 시도하는 한 예입니다.

이것은 이메일의 첨부파일이 실행되면 악성 DLL을 C:\WINDOWS\system32에 생성합니다.

그리고 AppInit_DLLs 값을 변경하여 이후에 user32.dll을 호출하는 프로세스에 악성 DLL을 삽입하죠.

 

 

세번째 - 윈도우 후킹함수를 이용하여 Injection

주고받는 메시지를 후킹할 수 있는 함수 SetWindowsHookEx() 함수에 삽입할 DLL의 Handler, 즉 주소와 함수의 주소를 인자로 넣음으로써 메모리에 올라간 프로세스에 삽입하게 됩니다.

SetWindowsHookEx (WH_KEYBOARD, KeyHookProc, hModule, NULL);

 

네번째 - CreatRemoteThread() 함수를 이용

CreatRemoteThread() 함수는 이름 그대로 쓰레드를 만드는 API 함수입니다.