PC리버싱/PE구조

EAT (Export Address Table / PE File 관련)

Lamed_Dhhd 2020. 5. 21. 10:16
반응형

. 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를 이용해서 찾아본 사진은 후에 첨부하겠다. 

반응형