PE File Format(2)

컴컴한해커·2025년 1월 4일

리버스 엔지니어링

목록 보기
4/18
post-thumbnail

📌 IAT이란?

Import Address Table의 약자로 Windows 운영체제의 핵심 개념인 DLL, memory, process 구조 등에 대한 내용이 함축 --> 어떤 라이브러리에서 어떤 함수를 사용하고 있는지 기술한 테이블

📢 DLL이란?

  • 프로그램에 라이브러리를 포함시키지 말고 별도의 파일로 구성하여 필요할 때마다 불러 쓰자.
  • 한 번 로딩된 DLL 코드, 리소스는 Memory Mapping 기술로 여러 Process에서 공유해 쓰자.
  • 라이브러리가 업데이트 되었을 때 해당 DLL 파일만 교체하면 되니 쉽고 편해서 좋다.

--> 해당 개념들을 이용해서 만들어진 파일 확장자라고 생각하면 편하다.

📢 DLL 로딩 방식

  1. Explicit Linking : 라이브러리가 프로그램에서 사용되는 순간 로딩하고, 끝나면 해제되는 방법
  2. Implicit Linking : 라이브러리가 프로그램 시작과 동시에 로딩되고 프로그램이 종료되면 해제되는 방법--> IAT는 이 메커니즘을 제공하는 역할

📢 예시

CALL 7C8107F0으로 하지 않을까?

  • 운영체제 버전, 언어, Service Pack에 따라서 kernel32.dll의 버전이 달라지고, 함수의 위치가 달라질 수도 있다 --> 모든 환경에서 함수 호출을 보장하기 위해서
  • DLL Relocation -->PE Loader는 비어있는 메모리 공간에 DLL을 로딩시킨다. 그러므로 모든 DLL의 주소는 절대적일 수가 없다 --> 실제 주소를 하드 코딩할 수 없다 --> PE 헤더에서 VA가 아닌 RVA를 써야 하는 이유

📢 IMAGE_IMPORT_DESCRIPTOR

항목의미
OriginalFirstThunkINT(Import Name Table)의 주소(RVA)
NameLibrary 이름 문자열의 주소(RVA)
FirstThunkIAT(Import Address Table)의 주소(RVA)

INT(Import Name Table) : DLL에서 가져와야 할 함수들의 이름을 저장하는 테이블(배열)
IAT(Import Address Table) : DLL 함수의 실제 메모리 주소를 저장하는 테이블(배열)

INT와 IAT의 관계

  1. INT는 함수 이름을 기반으로, IAT를 생성하기 위한 원본 데이터를 제공한다.
  2. 로더는 INT를 읽어 DLL에서 함수의 실제 주소를 가져온 후, IAT에 기록한다.
  3. 프로그램 실행 중에는 IAT만 사용되어 DLL 함수가 호출된다.


📌 EAT이란?

Export Address Table의 약자로 라이브러리 파일에서 제공하는 함수를 다른 프로그램에서 가져다 쓸 수 있도록 해주는 핵심 메커니즘

📢 IMAGE_EXPORT_DIRECTORY

항목의미
NumberOfFunctions실제 Export 함수 개수
NumberOfNamesExport 함수 중에서 이름을 가지는 함수 개수 (<= NumberOfFunctions)
AddressOfFunctionsExport 함수 주소 배열 (배열의 원소 개수 = NumberOfFunctions)
AddressOfNames함수 이름 주소 배열 (배열의 원소 개수 = NumberOfNames)
AddressOfNameOrdinalsOrdinal 주소 배열 (배열의 원소 개수 = NumberOfNames)

라이브러리에서 함수 주소를 얻는 API는 GetProcAddress()이다. 이 API를 통해서 EAT를 참조하여 API의 주소를 구하는 것이다.

(1) 함수 이름 배열에서 함수 이름 찾기
(2) Ordinal 배열에서 name_index로 ordinal 값을 찾기
(3) EAT로 가서 ordinal을 배열 인덱스로 하는 함수의 시작 주소 값 구하기


📌 IAT랑 EAT 비교

📢 주소

IAT : IMAGE_OPTIONAL_HEADER32.DataDirectory[1].VirtualAddress ~ DataDirectory[n].VirtualAddress
EAT : IMAGE_OPTIONAL_HEADER32.Datadirectory[0].VirtualAddress

📢 이름

IMAGE_IMPORT_DIRECTORY >> IMAGE_IMPORT_DESCRIPTOR == IMPORT Directory Table --> IMPORT는 여러 함수를 할 수 있으므로 여러 개 존재 가능
IMAGE_EXPORT_DIRECTORY --> EXPORT는 함수의 시작 주소를 참조하게끔만 하면 되므로 하나만 존재

0개의 댓글