. EAT(Export Address Table)
- EAT
· Library FIle에서 제공하는 함수를 다른 Program에서 가져다 사용할 수 있도록 해주는 Table
· EAT를 통해서만 해당 Library에서 Export하는 함수의 시작 주소를 정확히 구할 수 있다.
· IAT와 동일하게 PE File 내의 특정 구조체인 'IMAGE_EXPORT_DIRECTORY'에 Export에 관한 정보를 저장한다.
· 각 Section마다 존재하는 IAT와는 달리 EAT는 PE File내에 하나만 존재한다.
· IMAGE_EXPORT_DIRECTORY의 위치
◦ PEView를 이용해 살펴보면 IMAGE_EXPORT_DIRECTORY 구조체가 존재하지 않는다는 것을 알 수 있으며 IMAGE_OPTIONAL_HEADER 부분에 'Loader Flags' 부분부터 구조체 배열의 시작 주소가 된다.
◦ 구조체 배열이 시작되는 부분은 'IMAGE_OPRIONAL_HEADER32.DataDirectory[0]'이라고 한다.
◦ IMAGE_OPRIONAL_HEADER32.DataDirectory 구조체 배열의 Member
▹ Loader Flags
▹ Number of Data Diectories
▹ RVA of Export Directory
▹ Size of Export Directory
▹ RVA of Import Directory
▹ Size of Import Directory
· 실제 IMAGE_EXPORT_DIRECTORY 구조체
◦ IMAGE_EXPORT_DIRECTORY의 주요 Member
▹ NumberOfFunction
▸ 실제 Export 함수의 개수
▹ NumberOfNames
▸ Export 함수 중 이름을 가지는 함수의 개수
▸ 'NumberOfFunction'와 값보다 작거나 같다.
▹ AddressOfFunction
▸ Export 함수 주소 배열
▸ 배열의 Index(배열의 원소 개수)와 'NumberOfFunctions' 값이 같다.
▹ AddressOfNames
▸ 함수 이름 주소 배열
▸ 배열의 Index(배열의 원소 개수)와 'NumberOfNames' 값이 같다.
▹ AddressOfNameOrdinals
▸ 함수 이름의 Ordinal(서수) 주소 배열
▸ 배열의 Index(배열의 원소 개수)와 'NumberOfNames' 값이 같다.
· GetPorcAddress() API와 EAT를 이용해 원하는 API의 주소를 얻어내는 과정
◦ 'GetProcAddress()'라는 함수는 Library에서 함수 주소를 얻는 API로 EAT를 참조해 원하는 API의 주소를 구한다.
◦ GetProcAddress() 함수의 동작 과정
▹ ① : AddressOfNames Member를 이용해 함수 이름 배열(Function Name Table)을 찾아간다.
▹ ② : 함수 이름 배열에는 문자열 주소가 저장되어 있으며 strcmp 함수를 이용해 원하는 함수의 이름을 찾아 해당 함수가 위치한 배열의 Index(Index Of Name)를 찾는다.
▹ ③ : AddressOfNameOrdinals Member를 이용해 'Ordinal 배열'을 찾는다.
▹ ④ : Ordinal 배열에서 ②단계에서 찾아낸 Index Of Name을 이용해 Ordinal 값을 찾는다.
▹ ⑤ : AddressOfFunctions Member를 이용해 EAT(Export Address Table)로 간다.
▹ ⑥ : EAT에서 ④단계에서 찾은 Ordinal을 배열 Index로 하여 원하는 함수의 시작주소를 얻는다.
라이브러리 파일에서 제공하는 함수를 다른 프로그램에서 가져다 사용할 수 있도록 해주는 테이블
1. IMAGE_EXPORT_DIRECTORY 구조체
typedef struct _IMAGE_EXPORT_DIRECTORY{
DWORD Characteristics;
DWORD TimeDateStamp;
WORD MajorVersion;
DWORD Name;
DWORD Base;
DWORD NumberOfFunctions;
DWORD NumberOfNames;
DWORD AddressOfFunctions;
DWORD AddressOfNames;
DWORD AddressOfNameOrdinals;
} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
IMAGE_EXPORT_DIRECTORY 구조체이다.
중요한 값들을 살펴보자
NumberOfFunctions : 실제 Export 함수 개수
NumberOfNames : Export 함수 중 이름을 가지는 함수 개수
AddressOfFunctions : Export 함수 주소 배열
AddressOfNames : 함수 이름 주소 배열
AddressOfNameOrdinals : Ordinal 주소 배열
실제 HxD와 PEView를 이용해서 찾아본 사진은 후에 첨부하겠다.
'PC리버싱 > PE구조' 카테고리의 다른 글
패킹예제 UPX by UPX (0) | 2020.05.21 |
---|---|
데이터 압축 (비손실 압축, 손실 압축) (0) | 2020.05.21 |
IAT (Import Address Table / PE File 관련) (0) | 2020.05.21 |
함수 호출 규약 (Calling Convention) (0) | 2020.05.21 |
(번외)pe구조 잘정리된 사이트추천 (0) | 2020.05.20 |