DLL Injection 은 어떻게 이루어지는가? - DLL? 그게 뭐야?
2009/07/25 11:27
루트킷을 비롯하여 바이러스, 악성코드 등 여러 분야에 두루 쓰이는 기법이 DLL Injection입니다. 윈도우즈 OS에 한정되어 적용되는 것이지만, 윈도우즈 자체의 점유율이 높은 이유로 아주 효과적으로 공격자가 원하는 작업을 수행할 수 있는 방법이죠. 최근 루트킷에 대해 공부하면서 이 DLL Injection이 어떻게 이루어지는 알게 된 것을 정리해봅니다.
DLL? 그게 뭐야?
DLL은 윈도우즈 OS에서 사용되는 동적 연결 라이브러리 실행 파일입니다. 말이 어렵죠? 간단하게 말해서, 실행할 수 있는 아주 작은 프로그램의 단위라고 이해하시면 되겠습니다.
라이브러리라는 말은 아시나요? 영어로 Library, 도서관이라는 뜻이죠? 프로그램이 작업을 수행할 때 이 라이브러리를 참조하게 됩니다. 라이브러리에 포함된 함수, 구조체, (추천하는 방법은 아니지만) 변수 등등을 이용하는 것이죠. 우리가 프로그래밍을 할 때 (C 언어 기준으로) 헤더 파일을 집어넣습니다. stdio.h, string.h 같은 표준 헤더부터, cimg.h, curl.h 같은 사용자 정의 헤더까지 다양하죠. 이런 것을 정적 라이브러리라고 합니다. 프로그램 자체에 포함되는 라이브러리죠.

이에 반해 동적 연결 라이브러리는 [그림 1]에서처럼 프로그램과는 별도로 존재합니다. 가장 많이 볼 수 있는 kernel32.dll, user32.dll, gdi32.dll 등이 동적 연결 라이브러리 파일입니다. 프로그램은 필요할 때 이 DLL을 호출해서 그 안에 있는 함수를 이용하지요.
왜 이렇게 따로 하냐구요? 이렇게 함으로써 두 가지 이익을 얻을 수 있기 때문입니다.
첫 째는 프로그램이 메모리에 적재되는 용량을 줄일 수 있다는 점입니다. 프로그램 자체에 처음부터 들어 있는 게 아니라, 필요할 때 호출하는 방식이기 때문에 메모리에 항상 적재되어 있을 필요가 없지요.
두 번째는 DLL의 코드가 변경되어도 원래의 함수 이름이나 인자가 그대로라면, 프로그램을 다시 컴파일하거나 링킹을 할 필요가 없다는 점입니다. 정적 라이브러리는 변경될 때마다 매번 컴파일하고 링킹을 새로 해야하니 DLL은 정말 편리한 녀석이죠. [그림 1]에서 StackDocklet.dll을 이용하는 것을 볼 수 있죠? 플러그인을 이렇게 DLL 파일로 지원할 수도 있습니다. StackDocklet.dll의 내부 코드가 변경되어도 함수의 형태만 유지된다면 RocketDock 자체를 새로 컴파일할 필요는 없겠죠?
간단하게 DLL이 무엇인지 알아보았는데요. 다음에는 DLL이 어떻게 호출되는지, DLL Injection이 어떻게 이루어지는지를 정리해보겠습니다.
참고 문헌
Visual C++ DLL :: http://msdn.microsoft.com/ko-kr/library/1ez7dh12(VS.80).aspxDynamic-link library :: http://en.wikipedia.org/wiki/Dynamic-link_library
"0x02 Windows RCE" 분류의 다른 글
| DumpFromOEP.py for Immunity Debugger | 2011/10/22 |
| From AppInit_DLLs To Injection | 2011/09/28 |
| Windows Debugging Intrenals: A to Z | 2011/08/28 |
| IsDebuggerPresent 그리고 패치 | 2011/07/04 |
| API Redirect on Themida | 2011/02/27 |
Trackback Address:http://hisjournal.net/blog/trackback/249