Post

PE File Format – IAT(Import Address Table)

IAT (Import Address Table)

  • PE파일이 무슨 라이브러리와 어떤 함수를 사용하고 있는지 기술한 테이블

DLL(Dynamic Linked Library) Loading

  • DLL의 로딩 방식은 2가지로 나뉜다.
    1. Explicit Linking (명시적) – 프로그램이 실행 중일 때 API를 이용하여 DLL 파일이 있는지 검사하고 동적으로 원하는 함수만 불러와서 쓰는 방법, 프로그램이 사용되는 순간 로딩되며 사용 종료 시 메모리에서 해제 된다. (DLL이나 함수가 실행 환경에 있을지 없을지 잘 모르는 경우에 사용되며 때때로 메모리 절약을 위해 쓰이기도 한다.
    2. 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

실습

실습을 통하여 직접 IAT를 확인해 보았다.

  • 실습 환경 : Window 7 32bit
  • 실습 파일 : 계산기

이전 포스트(RVA to RAW) 에서 IMPORT Directory 의 RAW를 계산하였다.

첫번째 IMAGE_IMPORT_DESCRIPTOR 구조체 Offset은00050EFC 이다.

IMAGE_IMPORT_DESCRIPTOR

Name

  • Offset : 00051114
  • Value : SHELL32.dll

IMAGE_IMPORT_DESCRIPTOR – NAME

OriginalFirsThunk (INT)

  • Offset : 00051120
  • Value : 00052350

IMAGE_THUNK_DATA32

IMAGE_IMPORT_BY_NAME

  • Offset : 00051750
  • Hint : 00E1
  • NAME : SHGetSpecialFolderPathW

IMAGE_IMPORT_BY_NAME

FirstThunk (IAT)

  • Offset : 00000400
  • Value : 73820468

FirstThunk(IAT)

This post is licensed under CC BY 4.0 by the author.