여기서는 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  

  위와 같은 용도로 사용된다.

 

==========================================================================================

 

이 구조체의 정리는 이 것으로 마무리를 지으려 한다.

Posted by skensita