PE File Format – IAT(Import Address Table)
IAT (Import Address Table)
- PE파일이 무슨 라이브러리와 어떤 함수를 사용하고 있는지 기술한 테이블
DLL(Dynamic Linked Library) Loading
- DLL의 로딩 방식은 2가지로 나뉜다.
- Explicit Linking (명시적) – 프로그램이 실행 중일 때 API를 이용하여 DLL 파일이 있는지 검사하고 동적으로 원하는 함수만 불러와서 쓰는 방법, 프로그램이 사용되는 순간 로딩되며 사용 종료 시 메모리에서 해제 된다. (DLL이나 함수가 실행 환경에 있을지 없을지 잘 모르는 경우에 사용되며 때때로 메모리 절약을 위해 쓰이기도 한다.
- Implicit Linking (묵시적) – 실행 파일 자체에 어떤 DLL의 어떤 함수를 사용하겠다는 정보를 포함시키고 프로그램 실행 시 해당 함수들을 초기화한 후 그것을 이용하는 방법(프로그램 과 함께 라이브러리가 같이 로딩되며 프로그램 종료 시 메모리에서 해제)
- IAT는 Implicit Linking 에 대한 메커니즘을 제공하는 역할을 한다.
IMAGE_IMPORT_DESCRIPTOR
- IMAGE_IMPORT_DESCRIPTOR 구조체 (14h/20)
1
2
3
4
5
6
7
8
9
10
11
typedef struct _IMAGE_IMPORT_DESCRIPTOR {
union {
DWORD Characteristics;
DWORD OriginalFirstThunk; //INT (Import Name Table) address (RVA)
};
DWORD TimeDateStamp;
DWORD ForwarderChain;
DWORD Name; //Library name string address (RVA)
DWORD FirstThunk; //IAT(Import Address Table) address (RVA)
} IMAGE_IMPORT_DESCRIPTOR;
typedef IMAGE_IMPORT_DESCRIPTOR UNALIGNED *PIMAGE_IMPORT_DESCRIPTOR;
IMAGE_THUNK_DATA32
- IMAGE_THUNK_DATA32 구조체 (4h)
1
2
3
4
5
6
7
8
typedef struct _IMAGE_THUNK_DATA32 {
union {
DWORD ForwarderString;
DWORD Function; //바인딩 후 해당 함수 주소
DWORD Ordinal;
DWORD AddressOfData; // 바인딩 전 IMAGE_IMPORT_BY_NAME 주소(RVA)
} u1;
} IMAGE_THUNK_DATA32;
IMAGE_IMPORT_BY_NAME
- IMAGE_IMPORT_BY_NAME 구조체 (NULL까지)
1
2
3
4
typedef struct _IMAGE_IMPORT_BY_NAME {
WORD Hint; //함수의 고유번호
BYTE Name[1]; //함수의 이름
} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;
실습
실습을 통하여 직접 IAT를 확인해 보았다.
- 실습 환경 : Window 7 32bit
- 실습 파일 : 계산기
이전 포스트(RVA to RAW) 에서 IMPORT Directory 의 RAW를 계산하였다.
첫번째 IMAGE_IMPORT_DESCRIPTOR 구조체 Offset은00050EFC 이다.
Name
- Offset : 00051114
- Value : SHELL32.dll
OriginalFirsThunk (INT)
- Offset : 00051120
- Value : 00052350
IMAGE_IMPORT_BY_NAME
- Offset : 00051750
- Hint : 00E1
- NAME : SHGetSpecialFolderPathW
FirstThunk (IAT)
- Offset : 00000400
- Value : 73820468
This post is licensed under CC BY 4.0 by the author.