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 함수입니다.