본문 바로가기
reversing

IAT & EAT

by 코끼리_땃쥐 2022. 12. 12.
반응형

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

댓글