여기서는 Optional Header에서 빼먹은 부분이 Data Directory에 대해서 알아보자.
==========================================================================================
WinNT.h에 들어가서 Optional Header 구조체를 살펴보면 아래와 같은 필드가 존재한다.
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
이 필드는 IMAGE_DATA_DIRECTORY 구조체 배열이다. 인덱스는 16으로 정의되어있다. 아래와 같이 말이다. :-)
#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
그럼 IMAGE_DATA_DIRECTORY 구조체는 어떻게 정의되어 있을까?
이 해답 역시 WinNT.h에 들어있다. 아래는 IMAGE_DATA_DIRECTROY 구조체를 가져온 것이다.
typedef struct _IMAGE_DATA_DIRECTORY {
DWORD VirtualAddress;
DWORD Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
단순하게 주소와 크기로 구성된 구조체이다. 주소는 당연히 RVA로 각 테이블(익스포트, 임포트etc..)의 시작 주소가 들어있다. 크기는 이 테이블들의 크기이다.
위에서 인덱스가 16(인덱스는 0부터 시작한다. 여기서 말하는 인덱스는 개 수이다.)이라고 하였다. 이 중에서 마지막 구조체는 0으로 설정되어 있기 때문에 실제적으로 15개의 구조체가 존재하는 것이다.
각각의 인덱스는 정의되어서 사용되고 있다. 아래는 인덱스 번호에 따른 사용용도를 정리한 것이다.
// Export Directory
#define IMAGE_DIRECTORY_ENTRY_EXPORT 0
// Import Directory
#define IMAGE_DIRECTORY_ENTRY_IMPORT 1
// Resource Directory
#define IMAGE_DIRECTORY_ENTRY_RESOURCE 2
// Exception Directory
#define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3// Security Directory
#define IMAGE_DIRECTORY_ENTRY_SECURITY 4// Base Relocation Table
#define IMAGE_DIRECTORY_ENTRY_BASERELOC 5// Debug Directory
#define IMAGE_DIRECTORY_ENTRY_DEBUG 6// Architecture Specific Data
#define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE 7// RVA of GP
#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8// TLS Directory
#define IMAGE_DIRECTORY_ENTRY_TLS 9// Load Configuration Directory
#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10// Bound Import Directory in headers
#define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11// Import Address Table
#define IMAGE_DIRECTORY_ENTRY_IAT 12// Delay Load Import Descriptors
#define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 13// COM Runtime descriptor
#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14
위와 같은 용도로 사용된다.
==========================================================================================
이 구조체의 정리는 이 것으로 마무리를 지으려 한다.