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 |