IAT(Import Address Table) : 프로그램이 어떤 라이브러리에서 어떤 함수를 사용하는지 기술한 테이블
핵심 개념 : process,memory,DLL 구조
IAT 를 이해하기 전, DLL의 대한 이해가 필요하다.
Import : library에게 서비스(함수) 제공받는 일
Export : library 입장에서 PE 파일을 제공하는 일
-DLL(Dynamic Linked Library) 동적 연결 라이브러리
과거 16비트 때는 DLL 개념 X -> 함수 사용시 컴파일러는 C 라이브러리에서 binary 코드 그대로 가져와서 삼입.
Windows OS, 멀티태스킹 지원 후 -> 위 방식 비효율적
여러프로그램 동시에 실행 -> 동일한 라이브러리 포함은 심각한 메모리 낭비
->(아이디어) 프로그램에 라이브러리 포함 X,별도의 파일(DLL) 구성, 필요할 때마다 불러서 씀.
-일단 한 번 로딩된 DLL의 코드,리소스는 Memory Mapping 기술로 여러 process에서 공유해쓴다.
-라이브러리 업데이트 -> 해당 DLL 파일만 교체하면 됨.
DLL 로딩 방식
1.Explict Linking : 프로그램에서 사용되는 순간 로딩/ 사용 끝나면 메모리에서 해제
2.Implicit Linking : 프로그램 시작할 때 로딩 / 프로그램 종료할 때 메모리에서 해제
Implicit Linking 가 IAT 매커니즘이다.
*DLL은 PE 헤더에 명시된 Imagebase에 로딩 안 될 수도 있다. 하지만 EXE는 그 위치에 로딩이 된다.
-직접적인 함수의 주소를 CALL 하지 못하는 이유
1. 어떤 Service Pack에서 실행될지 모르기 때문에 -> 모든 환경에서 함수호출을 보장하기 위해
2. DLL Relocation -> 여러개의 DLL이 같은 공간일 수 있음. /실제 하드코딩 못하는 이유, VA를 안 쓰고 RVA이 쓰는 이유
*하드코딩 : 공통 모듈로 개발해서 여러곳에서 호출해서 사용할 수 있는 부분 또는DB, 파일, 참조 정보를 얻어와서 사용해야할 부분을 사용처 부분에서 각자 프로그램으로 처리하는것을 흔히 하드 코딩,날코딩이라 합니다. 에러 확률 높음.
PE파일은 자신이 어떤 라이브러리를 임포트 하고 있는지 아래 구조체에 명시
*IMAGE_IMPORT_DESCRIPIOR 구조체
일반적으로 여러개의 라이브러리를 임포트하기 때문에 라이브러리 개수만큼 구조체 배열 형식으로 존재, 마지막은 NULL
- Original First Thunk : INT(Import Name Table)이 주소(RVA)
- Name : Library 이름 문자열의 주소(RVA)
- FirstThunk : IAT(Import Address Table)의 주소(RVA)
INT와 IAT의 크기는 같아야한다.
PE로더가 임포트 함수 주소를 IAT 에 입력하는 기본 순서
1. IID 구조체의 Name 멤버 -> 라이브러리의 이름 문자열 Get
2. 해당 라이브러리 로딩 -> LoadLibrary( ex : kernel32.dll)
3. IID의 Original First Thunk 로 INT 주소 Get
4. INT 에서 값 읽어 해당 IMAGE_IMPORT_BY_NAME 주소(RVA)를 얻음
5. IIBN의 Hint(Ordinal) 또는 Name 항목 -> 함수 시작주소 얻음 (GetProcAddress() 함수로)
6. IID의 FirstThunk(IAT) 읽어서 주소 얻음
7. IAT 배열 값이 위에서 구한 함수 주소 입력
8. INT NULL 일때까지 4~7 반복
'해킹 > 리버싱엔지니어링' 카테고리의 다른 글
함수 호출 규약 (0) | 2020.11.18 |
---|---|
Base Relocation Table (0) | 2020.05.01 |
실행 압축 (0) | 2020.04.28 |
EAT정리 (0) | 2020.04.25 |
OllyDBG 단축키 (0) | 2020.04.18 |