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 구조체이다.
중요 멤버들에 대한 설명은 다음과 같다.
항목 | 의미 |
NumberOfFunctions | 실제 Export 함수 개수 |
NumberOfNames | Export 함수 중에서 이름을 가지는 함수 개수(<=NumberOfFunctions) |
AddressOfFunctions | Export 함수 주소 배열 (배열의 원소 개수 = NumberOfFunctions) |
AddressOfNames | 함수 이름 주소 배열 (배열의 원소 개수 = NumberOfNames) |
AdddressOfNameOrdinals | Ordinal 배열 (배열의 원소 개수 = NumberOfNames) |
아래 그림은 kernel32.dll 파일의 IMAGE_EXPORT_DIRECTORY 의 구조를 나타내고 있다.
라이브러리에서 함수 주소를 얻는 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 |