PE File Format 0x04

Kail-KM
|2015. 1. 13. 04:24

IAT (Import Address Table)


IAT란 쉽게 말하여 프로그램이 어떤 라이브러리에서 어떤함수를 사용하고 있는지를 기술한 테이블입니다.


  • DLL (Dynamic Linked Library)

동적 연결 라이브러리로 프로그램내에 라이브러리를 포함시키지 말고 별도의 파일(DLL)로 구성하여 필요할때마다 불러서 사용을 한다.

일단 한번 로딩된 DLL의 코드, 리소스는 Memory Mapping 기술로 여러 Process에서 공유를 한다.

라이브러리가 업데이트 되었을때 해당 DLL파일만 교체하면 되니 편리하다.


  • DLL 로딩방식

프로그램내에서 사용되는 순간에 로딩하고 사용이 끝나면 메모리에서 해제시키는 방법(Explicit Linking) 프로그램 시작할때 같이 로딩되어 프로그램 종료할때 메모리에서 해제되는 방법(Implicit Linking)이 있다.

//IAT는 바로 Implicit Linkiing에 대하 메커니즘을 제공하는 역할을 한다.


아래는 notepad.exe의 kernel32.dll 의 CreateFileW를 호출하는 코드이다.


CreateFileW 를 호출 할때 직접호출하지 않고 128A0E4 주소에 있는 값을 가져와서 호출 한다. 따라서 76F4732C를 값으로 가져오는 것이다.(모든 API 호출은 이런방식이다.)  덤프에 kernel32.dll CreateFileW 함수의 주소값을 씌워 놓은 것이다.

76F4732C 주소가 바로 notepad.exe 프로세스 메모리에 로딩된 kernel32.dll의 CreateFileW 함수 주소이다.

모든 환경에서 CreateFileW 함수호출을 보장하기 위해서 컴파일러는128A0E4의 실제 주소(76F4732C)가 저장될 위치를 준비하고 CALL DWORD PTR DS:[128A0E4] 형식의 명령어를 적어두기만 하면 그 후 파일이 실행되는 순간 PE loader가 128A0E4의 위치에 CreateFileW의 주소를 입력해준다.


(DLL은 PE Header에 명시된 ImageBase에 로딩된디고 보장할수 없다. 반면에 process 생성 주체가 되는 EXE 파일은 자신의 ImageBase에 정확히 로딩이 된다.)



IMAGE_IMPORT_DESCRIPTOR                    //PE Body에 위치


PE파일은 자신이 어떤 라이브러리를 Import하고 있는지 IMAGE_IMPORT_DESCRIPTOR 구조체에 명시하고 있다.


  • Import : library으로부터 서비스(함수)를 제공받는 일
  • Export : library 입장에서 다른 PE 파일에게 서비스(함수)를 제공하는 일


일반적인 프로그램에서는 여러개의 Library를 Import하기 떄문에 Library의 수 많큼 위 구조체의 배열 형식으로 존재하게 되며, 구조체 배열의 마지막은 NULL 구조체로 끝난다.


  • OriginalFirstThunk : INT (Import Name Table)의 주소 (RVA)                //여기서 Table은 배열을 의미한다.
  • Name : Library 이름 문자열의 주소(RVA)
  • FirstThunk : IAT(Import Address Table)의 주소(RVA)

//INT와 IAT는 long type(4Byte) 배열이며 NULL로 끝난다.




EAT (Export Address Table)


windows 운영체제에서 라이브러리란 다른 프로그램에서 불러 쓸수 있도록 관련 함수들을 모아놓은 파일(DLL/SYS) 입니다.

EAT는 라이브러리 파일에서 제공하는 함수를 다른 프로그램에서 가져다 사용할수 있도록 해주는 메커니즘이며 IAT와 마찬가지로 PE 파일내 특정 구조체(IMAGE_EXPORT_EIRECTORY)에 정보를 저장하고 있으며 이 구조체는 PE파일에 하나만 존재한다.

*참고로 IAT를 설명하는 IID구조체는 여러개의 멤버를 가진 배열형탤 존재한다. 왜냐하면 PE파일은 여러개의 라이브러리를 동시에 Import할수 있기때문이다.





kernel32.dll은 export하는 모든함수에 이름이 존재하며, AddressOfNameOrdinals 배열의 값이 index = ordinal 형태로 되었습니다

하지만 모든 DLL파일이 이와 같지는 않습니다.export하는 함수중에 이름이 존재하지 않을수도 있으며AddressOfNameOrdinals 배열의 값이 index != ordinal 인 경우도 있습니다.


따라사 위 순서를 따라야만 정확한 함수 주소를 얻을수 있습니다.


**본 게시물은 http://www.reversecore.com 을 참고하여 복습용으로 옮겨 적거나 한 것이지 결코 제 머리에서 나온게 아님을 알려드립니다.  자세한건 Reversecore로 가시는게 더 좋습니다.

'Reversing > Theory' 카테고리의 다른 글

범용 CPU 레지스터  (1) 2015.03.04
Assembly Basic Commands  (0) 2015.01.23
IDA PRO 단축키  (0) 2015.01.13
PE FILE Format 0x03  (0) 2015.01.10
PE FILE Format 0x02  (0) 2015.01.09