미친해커

[Reversing] EAT Hooking Step 0 본문

Reversing/Hooking

[Reversing] EAT Hooking Step 0

미친해커 2022. 7. 19. 23:44
반응형

EAT Hooking

EAT(Export Address Table) Hooking 이란 EAT의 API 주소를 조작하여 후킹하는 기법을 말한다.

 

EAT에는 라이브러리가 외부로 Export 하는 함수명 또는 변수명과 주소가 기록되어 있다.

 

응용 프로그램 또는 다른 라이브러리가 GetProcAddress를 사용하여 라이브러리가 Export 하는 함수 또는 변수의 주소를 가져온다. 이때 GetProcAddress API는 이 테이블을 참조하여 주소를 구한다. EAT Hooking은 이 원리를 이용한 후킹 기법이다.

EAT Structure

EAT 구조는 아래와 같다.

typedef struct _IMAGE_EXPORT_DIRECTORY {
    DWORD Characteristics;
    DWORD TimeDateStamp;
    WORD MajorVersion;
    WORD MinorVersion;
    DWORD Name;                  // 라이브러리의 이름
    DWORD Base;
    DWORD NumberOfFunctions;     // export 함수의 개수
    DWORD NumberOfNames;         // export 함수 중 이름을 가지는 함수의 개수
    DWORD AddressOfFunctions;    // 함수의 RVA를 가지는 배열의 시작 주소
    DWORD AddressOfNames;        // 함수 이름의 RVA를 가지는 배열의 시작 주소
    DWORD AddressOfNameOrdinals; // 이름이 있는 함수의 Oridnal 배열의 시작 주소
} IMAGE_EXPORT_DIRECTORY,*PIMAGE_EXPORT_DIRECTORY;

이 중에서 자주 사용하는 멤버 변수는 아래와 같다.

  • NumberOfFunctions
  • NumberOfNames
  • AddressOfFunctions
  • AddressOfNames
  • AddressOfNameOrdinals

How to get IMAGE_EXPORT_DIRECTORY address?

IMAGE_EXPORT_DIRECTORY의 주소는 어떻게 구할 수 있을까?

 

IMAGE_EXPORT_DIRECTORY는 NT Header(IMAGE_NT_HEADER)를 통해 구할 수 있다.

NT Header의 Optional Header를 보면 DataDirectory가 배열로 존재한다. DataDirectory의 0번째 인덱스의 VirtualAddress가 IMAGE_EXPORT_DIRECTORY의 RVA이다. 코드로 나타낸다면 아래와 같다.

IMAGE_NT_HEADERS *NT;
IMAGE_IMPORT_DESCRIPTOR *IMPORT = ImageBase + NT->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;

이번 포스팅에서 EAT를 이해하려고 하지 않아도 된다. 다음 포스팅부터 C언어로 작성된 코드를 보면 EAT에 대해 보다 빠르게 이해할 수 있을 것같다.

반응형
Comments