본문 바로가기

Reversing

02. IAT & EAT

IAT(Import Address Table)


프로그램에서 사용되는 라이브러리에서 어떠한 함수들을 사용하고 있는지 함수 명 함수시작 주소등에 관한 정보를 담고있는 테이블


1. IMAGE_IMPORT_DESCRIPTOR 구조체


typedef struct _IMAGE_IMPORT_DESCRIPTOR{

  union {

  DWORD   Characteristics;

  DWORD   OriginalFirstThunk;

  };

  DWORD   TimeDataStamp;

  DWORD   ForwarderChain;

  DWORD   Name;

  DWORD   FirstThunk;

} IMAGE_IMPORT_DESCRIPTOR;


OriginalFirstThunk : INT(Import Name Table)의 RVA 값

INT는 IMAGE_THUNK_DATA32 구조체 배열이다.

고로 OriginalFirstThunk == IMAGE_THUNK_DATA32 구조체 배열 주소(RVA)


그럼 IMAGE_THUNK_DATA32 구조체는 어떻게 이루어져있을까? 짚어보자


2. IMAGE_THUNK_DATA32 구조체


typedef struct _IMAGE_THUNK_DATA32{

  union{

  DWORD   ForwarderString;

  DWORD   Function;

  DWORD   Ordinal;

  DWORD  AddressOfData;

  } u1;

} IMAGE_THUNK_DATA32;


AddressOfData : IMAGE_IMPORT_BY_NAME 구조체 주소

Ordinal : 순서를 나타낸다.


다시 IMAGE_IMPORT_DESCRIPTOR로 돌아가서 나머지 부분을 살펴보자


FirstThunk : IAT의 RVA값을 가지는 변수


* FirstThunk와 OriginalFirstThunk의 차이? IAT와 INT는 동일하게 IMAGE_THUNK_DATA32 구조체 배열로 구성되어 있다. 하지만 바인딩 과정이라는걸 거치면서 INT에 값이 들어가면서 IAT가 된다. 즉, OriginalFirstThunk == INT, FirstThunk == IAT


Name : 해당 라이브러리의 이름 문자열이 존재하는 주소(RVA)

(임포트하려는 라이브러리의 이름이 있는 곳을 가리키는 포인터 역할)


3. IMAGE_IMPORT_BY_NAME 구조체


typedef struct _IMAGE_IMPORT_BY_NAME{

  WORD  Hint;

  CHAR  Name[1];

} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME


IMAGE_IMPORT_BY_NAME 구조체이다.


Hint : PE로더가 임포트하려는 함수를 빠르게 찾을 수 있도록 도와주기 위해 사용된다. (임포트하려는 라이브러리의 EAT의 주소 값을 가지고 있는 멤버 변수, 필수적이진 않다)


Name : 해당 라이브러리의 임포트 하고자 하는 함수의 이름


EAT(Export Address Table)


라이브러리 파일에서 제공하는 함수를 다른 프로그램에서 가져다 사용할 수 있도록 해주는 테이블


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

반응형

'Reversing' 카테고리의 다른 글

06. gdb 명령어 정리  (0) 2017.09.29
05. 스택, 스택프레임  (0) 2017.08.04
04. 함수 호출 규약  (0) 2017.08.02
03. 패킹 & 언패킹  (0) 2017.05.26
01. PE File Format  (0) 2017.05.24