Reversing/Reversing

PE의 IAT입력 과정

bbolmin 2012. 10. 31. 08:45

 

IMAGE_DIRECTORY_ENTRY_IMPORT

 

|-------------------|
|     VirtualAddress   |
|-------------------|
|           Size           | 

|-------------------|


VirtualAddress + ImageBase가 IMAGE_IMPORT_DESCRIPTOR의 가상주소를 가진다.

 

 

IMAGE_IMPORT_DESCRIPTOR (임포트 테이블)

|----------------------|
|    OriginalFirstThunk    |  -> INT(IMPORT_NAME_TABLE) 주소
|----------------------|
|     TimeDateStamp       |
|----------------------|
|     ForwarderChain     |
|----------------------|
|            Name             |  -> DLL name 주소
|----------------------|
|          FirstThunk        |  -> IAT(IMPORT_ADDRESS_TABLE) 주소
|----------------------|

 

 

* PE로더가 임포트 함수 주소를 IAT에 입력하는 과정

 

1. PE파일이 메모리에 로드된 후 데이터 디렉토리의 2번째 엔트리인 IMAGE_DIRECTORY_ENTRY_IMPORT에서 IMAGE_IMPORT_DESCRIPTOR의 위치를 구한다.

2. 순서대로 IMAGE_IMPORT_DESCRIPTOR에서 임포트 할 DLL name을 가져온 후 LoadLibrary() 한다.

3. OriginalFirstThunk에서 INT 주소를 얻어 온다.

4. INT에서 순서대로 서수(ordinal)나 함수 이름으로 함수 주소를 얻는다. [GetProcAddress() - EAT에서 가져옴]

5. FirstThunk를 읽어서 IAT 주소를 얻어와서 (4)번 과정에서 가져온 함수 주소를 IAT에 기록한다.

 

DLL개수 만큼 (1~5)를 반복한다.

각 DLL마다 임포트 함수 개수 만큼 (4~5)를 반복한다.