IAT
프로그램이 어떤라이브러리에서 어떤 함수를 사용하고 있는지를 기술한 테이블입니다.
IMAGE_IMPORT_DESCRIPTOR
PE 파일은 자신이 어떤 라이브러리를 임포트(Import) 하고 있는지 IMAGE_IMPORT_DESCRIPTOR 구조체에 명시하고 있습니다.
typedef struct _IMAGE_IMPORT_DESCRIPTOR{
union {
DWORD Characteristics;
DWORD OriginalFirstThunk;
};
DWORD TimeDateStamp;
DWORD ForwarderChain;
DWORD Name;
DWORD FirstThunk;
} IMAGE_IMPORT_DESRIPTOR;
typedef struct _IMAGE_IMPORT_BY_NAME {
WORD Hint;
BYTE Name[1];
} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;
일반적인 프로그램에서는 보통 여러개의 라이브러리를 임포트하기 때문에 라이브러리의 개수만큼 위 구조체의 배열 형식으로 존재하며, 구조체 배열의 마지막은 NULL 구조체로 끝나게 됩니ㅏㄷ. IMAGE_IMPORT_DESCRIPTOR 구조체에서 다음과 같습니다(전부 RVA 값을 가집니다.)
* RVA : RelativeVirtualAddress = ImageBase 부터의 상대 주소
항목 | 의미 |
OrignalFirstThunk | INT(Import Name Table)의 주소 (RVA) |
Name | Library 이름 문자열의 주소 (RVA) |
FirstThunk | IAT(Import Address Table)의 주소 (RVA) |
EAT
Windows 운영 체제에서 라이브러리(Library)란 다른 프로그램에서 불러 쓸 수 있도록 관련 함수들을 모아놓은 파일(dll, sys) 입니다. Win32 API가 대표적인 라이브러리이며, 그 중에서도 kernel32.dll 파일이 가장 핵심적인 라이브러리 파일이라고 할 수 있습니다.
EAT(Export Address Table)는 라이브러리 파일에서 제공하는 함수를 다른 프로그램에서 가져다 사용할 수 있도록 해주는 핵심 메커니즘입니다. 즉 EAT를 통해서만 해당 라이브러리에서 익스포트하는 함수의 시작 주소를 정확히 구할 수 있습니다. 앞서 설명한 IAT와 마찬가지로 PE파일 내의 특정 구조체(IMAGE_EXPORT_DIRECTORY)에 익스포트 정보를 저장하고 있습니다. 라이브러리의 EAT를 설명하는 IMAGE_EXPORT_DIRECTORY 구조체는 PE 파일에 하나만 존재합니다.
PE 파일에서 IMAGE_EXPORT_DIRECTORY 구조체의 위치는 PE헤더에서 찾을 수 있습니다. IMAGE_OPTIOANL_HEADER32.DataDirectory[0].VirtualAddress 값이 실제 IMAGE_EXPORT_DIRECTORY 구조체 배열의 시작 주소 입니다.(RVA)
typedef struct _IMAGE_EXPORT_DIRECTORY {
DWORD Characteristics;
DWORD TimeDateStamp;
WORD MajorVersion;
WORD MinorVersion;
DWORD Name;
DWORD Base;
DWORD NumberOfFunctions;
DWORD NumberOfNames;
DWORD AddressOfFunctions;
DWORD AddressOfNames;
DWORD AddressOfNameOrdinals
} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
항목 | 의미 |
NumberOfFunctions | 실제 Export 함수 개수 |
NumberOfNames | Export 함수 중에서 이름을 가지는 함수 개수 (<=NumberOfFunctions) |
AddressOfFunctions | Export 함수 주소 배열 (배열의 원소 개수 = NumberOfFunctions) |
AddressOfNames | 함수 이름 주소 배열 (배열의 원소 개수 = NumberOfNames) |
AddressOfNameOrdinals | Ordinal 배열 (배열의 원소 개수 = NumberOfNames) |
'reversing' 카테고리의 다른 글
DLL 인젝션 (0) | 2023.01.02 |
---|---|
Base Relocation Table (0) | 2022.12.14 |
PE File Format 중요 멤버 간단정리 (0) | 2022.12.05 |
IMAGE_FILE_HEADER - OPTINAL_HEADER (0) | 2022.11.29 |
PE File Format 구조 (0) | 2022.11.25 |
댓글