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 구조체 (14h/20)
| 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 구조체 (4h)
| 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 구조체 (NULL까지)
| 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>
– Offset : 00051114
– Value : SHELL32.dll
<IMAGE_IMPORT_DESCRIPTOR[0] – NAME>
– Offset : 00051120
– Value : 00052350
<IMAGE_THUNK_DATA32>
– Offset : 00051750
– Hint : 00E1
– NAME : SHGetSpecialFolderPathW
<IMAGE_IMPORT_BY_NAME>
– Offset : 00000400
– Value : 73820468
<FirstThunk(IAT)>