출처 : http://blog.eairship.kr/270




INT : IMAGE_THUNK_DATA 구조체 배열의 시작 주소값으로 이루어짐

->  typedef struct  _IMAGE_THUNK_DATA{

union{

DWORD ForwarderString;

DWORD Function;

DWORD Ordinal;

DWORD AddressOfData;

}u1;

} IMAGE_THUNK_DATA32;

typedef IMAGE_THUNK_DATA32 * PIMAGE_THUNK_DATA32;


(IMAGE_THUNK_DATA의 필드는 총 4개로 모두 공용체의 멤버이며, 

공용체의 멤버인 만큼 DWORD가 차지하는 크기인 4바이트의 공간을 4개의 필드가 공유하며, 

이 구조체는 AddressOfData 필드만 쓰이기도 하며, 

Ordinal 필드만 쓰이기도 하고, Function 필드만 쓰이기도 합니다.)




OriginalFirstThunk: Import Name Table(INT)의 RVA를 지닙니다. 

혹은 Import Lookup Table(ILT)의 RVA를 지닌다고 합니다. 

여기서 INT는 구조체 IMAGE_THUNK_DATA의 배열로 구성이 되며, 

구조체 IMAGE_THUNK_DATA의 AddressOfData 필드는 

실제 Import되는 함수의 이름이 포함된 구조체 IMAGE_IMPORT_BY_NAME에 대한 RVA를 지닙니다.




FirstThunk: OriginalFirstThunk와 마찬가지로 FirstThunk 필드도 

구조체 IMAGE_THUNK_DATA의 RVA 값을 지닙니다. 

PE 파일이 메모리에 로딩되고 나서는 

구조체 IMAGE_THUNK_DATA는 Import한 DLL 내의 함수의 실제 주소값을 지니며, 

이렇게 함수의 주소값을 담고있는 구조체 IMAGE_THUNK_DATA 배열을 Import Address Table(IAT)라고 합니다.









+ Recent posts