Proxy DLL
윈도우 실행파일 구조인 PE (Potable Executable) 에는 EXPORT 라는 외부노출함수를 지원합니다. 일반적으로 DLL (Dynamic Load Library) 에서 사용되며 외부로 노출되는 함수는 일반적으로 (ASCII 기반의 문자열로 구성된) 이름을 기반으로 작성됩니다. 더불어 이 글에서 이야기 하고자 하는 “EXPORT 함수의 위치”는 일반적으로 해당 DLL 안에 존재합니다. 이러한 값들은 IMAGE_EXPORT_DIRECTORY 구조체에 AddressOfFunctions 라는 변수에 의해 RVA (Relative Virtual Address) 함수주소가 나열된 곳의 시작점을 가리키고 있습니다.
typedef struct _IMAGE_EXPORT_DIRECTORY {
DWORD Characteristics;
DWORD TimeDateStamp;
WORD MajorVersion;
WORD MinorVersion;
DWORD Name;
DWORD Base;
DWORD NumberOfFunctions;
DWORD NumberOfNames;
DWORD AddressOfFunctions; // RVA from base of image
DWORD AddressOfNames; // RVA from base of image
DWORD AddressOfNameOrdinals; // RVA from base of image
} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
이렇게 일반적일 경우 EXPORT 정보를 확인할 경우 아래 그림과 같이 나타납니다.
[그림1] Non-Poxy DLL
지금까지는 일반적인 경우에 대한 설명이었고 지금부터는 일반적이지 않은 경우에 대한 설명입니다. 그럼 어떤 부분이 일반적이지 않느냐! 그건 바로 EXPORT 함수의 실제 코드가 해당 DLL 에 존재하지 않고 다른 DLL 을 가리킬 수 있다는 것입니다. 이때는 아래 그림과 같이 해당 EXPORT 함수가 어떤 DLL 의 EXPORT 함수와 연결되는지 나타나게 됩니다.
[그림2] Proxy DLL
이렇게 프로그램 하기 위해서는 pragma 라는 컴파일 옵션을 사용하여 구연할 수 있다. 예를 들어 gid32.dll 에 BitBlt 함수를 내가 만든 DLL 에서 그대로 사용하고 싶을 때는 다음과 같이 기술하면 된다.
#pragma comment(linker, "/export:BitBlt=gdi32.BitBlt")
이러한 기능은 하위호환을 고려한 새로운 버전의 DLL 을 만들고 싶을 경우에도 사용될 수 있지만, 악성코드에서는 악의적인 목적으로 이러한 Proxy DLL 을 사용할 수 도 있겠습니다.