-
윈도우 실행파일 구조인 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 을 사용할 수 도 있겠습니다.
'kb' 카테고리의 다른 글
인케이스(EnCase) 에서 파일명이 한 자리인 파일들 확인하기 (0) 2012.05.01 PDF 취약점 분석 (0) 2011.12.27 Diffie-Hellman Key Exchange Protocol (0) 2011.04.04 Birthday Attack (0) 2011.04.04 HASH 의 세가지 성질 (0) 2011.04.03