티스토리 뷰
DLL ?
Windows에서 사용하는 동적 라이브러리파일이다. ( Linux계열에서 so파일정도..? )
일단 한번 로드된 DLL의 코드 및 리소스는 Memory Mapping기술로 여러 Process에서 다같이 쓰자 !
1. 프로그램이 사용되는 순간 Loading, 사용이 끝나면 UnLoading - Explict Linking
2. 프로그램이 실행되는 순간 Loading, 프로그램이 종료되면 UnLoading - Implict Linking
( 이제 나올 IAT는 2번 항목에 해당하는 매커니즘을 제공한다. )
IAT & EAT ( Import Address Table, Export Address Table )
한다리 건너서 호출된다. 예를 들어 "Call [0x101104]"을 하게되면 0x7C0107F0이 최종적으로 호출된다.
왜 이렇게 한다리 건너서 호출하냐면 DLL 버전 혹은 환경에 따라서 또는 ImageBase가 이미 사용중이면 Relocation에 의해서 Load되는 실제 주소가 변경될 수 있어 0x7C0107F0에 해당 API가 존재하지 않을 수 있다.
때문에 0x101104이라는 고정주소를 적어두고 해당 PE파일이 로드되는 과정에서 IAT를 채우고, 0x101104라는 주소가 실제 코드에서 사용되면 IAT를 통해서 참조하게된다.
[ IMAGE_IMPORT_DESCRIPTOR ]
어떤 Library로 Import하고 있는지에 대한 정보를 담고있는 구조체이다.
하나의 PE파일은 여러개의 Library를 Import하기 때문에 배열로 처리된다.
( 마지막은 NULL을 가리킨다. )
사용되는 멤버
- Import Name Table RVA (INT) : API의 이름 배열
- Name RVA : DLL이름이 저장된 주소
- Import Address Table RVA (IAT)
PE로더가 IAT에 함수주소를 입력하는 과정.
- IMAGE_IMPORT_DESCRIPTOR를 읽어 Name을 통해 이름을 얻는다. (kernel32.dll)
- LoadLibrary("kernel32.dll")을 통해 해당 Library를 로딩한다.
- IID의 INT의 주소를 얻는다.
- INT에서 배열의 값을 하나씩 읽어서 IMAGE_IMPORT_BY_NAME주소를 얻는다.
- IMAGE_IMPORT_BY_NAME의 Hint, Name 항목을 통해 해당 함수의 주소를 얻는다.
GetProcAddress("GetCurrentThreadId");
- IID의 IAT RVA를 읽어서 얻는다.
- 해당 IAT 배열 인덱스에 구한 주소를 입력한다.
- INT가 끝날때까지 반복하여 IAT를 완성한다.
[ IMAGE_EXPORT_DIRECTORY ]
해당 PE파일의 함수를 다른 프로그램에서 가져다 사용할 수 있도록 해주는 매커니즘
IMAGE_IMPORT_DESCRIPTOR와 다르게 단 한개만 존재한다는 것을 기억하자.
사용되는 멤버
- NumberOfFunctions
- NumberOfNames
- AddressOfFunctions
- AddressOfNames
- AddressOfNameOrdinals : 고유번호라고 한다. Address에서 해당 함수의 Index를 구하고,
그 Index를 AddressOfNameOrdinals에 넣으면 고유번호가 나온다.
이 고유번호를 AddressOfFunctions에 적용시 함수의 주소가 나온다.
'Reversing > Concept' 카테고리의 다른 글
[Reversing] UPackPE ( Feat. 나뭇잎 ) (0) | 2020.01.14 |
---|---|
[Reversing] PE 파일의 재배치 ( Feat. 나뭇잎 ) (0) | 2020.01.14 |
[Reversing] RVA → RAW ( Feat. 나뭇잎 ) (0) | 2020.01.14 |
[Reversing] PE File Format 1 ( Feat. 나뭇잎 ) (0) | 2020.01.14 |
[Reversing] Visual Basic에서의 Reversing ( Feat. 나뭇잎 ) (0) | 2020.01.13 |