출처 : 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)라고 합니다.









http://dstein.egloos.com/1907162


HMODULE 과 HINSTANCE는 16비트 윈도우에서온 잔재이다.
우선 16비트 윈도우 환경에서  HMODULE 과 HINSTANCE 를 간략히 정의하면 다음과 같다.

1. HMODULE
   코드 영역에 대한 핸들

2. HINSTANCE
    데이터 영역에 대한 핸들

16비트 윈도우는 시스템 전체가 단일 메모리 공간을 사용하였다. 이때는 동일 프로세스가 여러번 실행될 경우 메모리 절약을 위해 코드영역은 한번만 로드하고 데이터영역은 각 프로세스별로 할당하였다. 각 프로세스별로 할당한 영역을 가리키는 핸들이 인스턴스핸들이다. 그래서 16비트 윈도우 환경에서는 인스턴스 핸들에 의해서 프로그램이 식별된다.

32비트 윈도우는 프로세스별로 메모리 공간이 독립적이기때문에 코드영역과 데이터영역 모두가 독립된 프로세스 메모리에 할당되므로 인스턴스 핸들과 모듈 핸들의 구분이 의미가 없어졌다. 그래서 32비트 윈도우에서는 모듈 핸들과 인스턴스 핸들이 같은 의미로 사용된다.
32비트 윈도우에서 인스턴스 핸들은 메모리 공간에 할당된 실행 모듈의 베이스주소(0x00400000)를 가리킨다.

http://yonghello.tistory.com/entry/Dll%EC%9D%B4%EB%9E%80

+ Recent posts