본문 바로가기

컴퓨터와 보안/리버싱

PE File Format4

EAT (Export Address Table)

Windows 운영체제에서 라이브러리(Library) 란 다른 프로그램에서 불러 쓸 수 있도록 관련 함수들을 모아놓은 파일(DLL/SYS) 이다.

Win32 API 가 대표적인 Library 이며, 그 중에서도 Kernel32.dll 파일이 가장 대표적인 Library 파일이라고 할 수 있다.

 

EAT란 라이브러리 파일에서 제공하는 함수를 다른 프로그램에 가져다 사용할 수 있도록 해주는 메커니즘 이다.

 

앞서 설명한 IAT 와 마찬가지로 PE 파일내에 특정 구조체(IMAGE_EXPORT_DIRECTORY)에 정보를 저장하고 있다.

라이브러리의 EAT 를 설명하는 IMAGE_EXPORT_DIRECTORY 구조체는 PE 파일에 하나만 존재한다.

 

(*참고로 IAT를 설명하는 IMAGE_IMPORT_DESCRIPTOR 구조체는 여러개의 멤버를 가진 배열 형태로 존재한다.

왜냐하면 PE 파일은 여러개의 라이브러리를 동시에 Import 할 수 있기 때문이다.)

 

PE 파일내에서 IMAGE_EXPORT_DIRECTORY 구조체의 위치는 PE Header 에서 찾을 수 있다.

IMAGE_OPTIONAL_HEADER32.DataDirectory[0].VirtualAddress 값이

실제 IMAGE_EXPORT_DIRECTORY 구조체 배열의 시작 주소이다. (RVA 값이다.)

 

IMAGE_EXPORT_DIRECTORY

 

IMAGE_EXPORT_DIRECTORY 구조체

위 사진은 IMAGE_EXPORT_DIRECTORY 구조체이다.

 

중요 멤버들에 대한 설명은 다음과 같다.

항목 의미
NumberOfFunctions 실제 Export 함수 개수
NumberOfNames Export 함수 중에서 이름을 가지는 함수 개수(<=NumberOfFunctions)
AddressOfFunctions Export 함수 주소 배열 (배열의 원소 개수 = NumberOfFunctions)
AddressOfNames 함수 이름 주소 배열 (배열의 원소 개수 = NumberOfNames)
AdddressOfNameOrdinals Ordinal 배열 (배열의 원소 개수 = NumberOfNames)

 

아래 그림은 kernel32.dll 파일의 IMAGE_EXPORT_DIRECTORY 의 구조를 나타내고 있다.

 

EAT 구조

라이브러리에서 함수 주소를 얻는 API 는 GetProcAddress()이다.

 

GetProcAddress() 함수가 이름을 가지고 함수 주소를 얻어내는 순서를 정리하자면

 

1. AddressOfNames 멤버를 이용해 "함수 이름 배열" 로 간다.

2. "함수 이름 배열"은 문자열 주소가 저장되어 있는데 문자열 비교(strcmp)를 통해 원하는 함수 이름을 찾는다. 이 때의      배열 인덱스를 name_index 라고 말한다.

3. AddressOfNameOrdinals 멤버를 이용해 "ordinal 배열" 로 간다.

4. "ordinal 배열" 에서 name_index 로 해당 ordinal_index 값을 찾는다.

5. AddressOfFunctions 멤버를 이용해 "함수 주소 배열 - EAT" 로 간다.

6. 함수 주소 배열 - EAT" 에서 아까 구한 ordinal_index 를 배열 인덱스로 하여 원하는 함수의 시작 주소를 얻는다.

 

위 EAT 구조 그림은 kernel32.dll 의 경우를 보여준다.

kernel32.dll 은 export 하는 모든 함수에 이름이 존재하며,

AddressOfNameOrdinals 배열의 값이 index = ordinal 형태로 되어있다.

 

하지만 모든 DLL 파일이 이와 같지는 않다.

export 하는 함수 중에 이름이 존재하지 않을 수도 있으며 (ordianl 로만 export 함)

AddressOfNameOrdinals 배열의 값이 index != ordinal 인 경우도 있다.

 

따라서 위 순서를 따라야만 정확한 함수 주소를 얻을 수 있다.

'컴퓨터와 보안 > 리버싱' 카테고리의 다른 글

어셈블리어와 레지스터  (0) 2021.04.04
PE File Format - pestudio  (0) 2021.04.02
PE File Format3  (0) 2021.04.01
PE File Format  (0) 2021.03.29
Hello World! 리버싱3  (0) 2021.03.28