명시적 링킹(Explicit)
- 프로그램이 필요한 순간에 DLL 함수 정보를 로드하고 사용 후 해제
암시적 링킹(Implicit)
- PE 파일 자체에 사용할 DLL 함수 정보를 포함 후 프로그램 실행 시 로드
1. PE 로더는 Name 에 있는 DLL 이름을 얻어온다
2. INT를 참조한다 ( 해당 INT에는 실행파일이 사용할 API들이 저장되어 있음 )
3. IAT에 실제 API의 함수 주소들을 기록한다
즉 한마디로 [DLL 이름 찾고 함수 목록찾고 이름찾고 주소 찾는다]
Import Table이 있는 주소를 알려주는데
0x12B80 은 RVA값이므로 RAW 값으로 변환을 해야 한다
0x12B80은 .text 영역이다.
0x12B80 - 0x1000(VA) + 0x400(PointerToRawData) = 0x11F80
다음과 같이 0x11F80으로 가면 Import Table이 있는데 가장 먼저 Name을 뽑는다
Name의 RVA 값은 0x12E42 인데 이걸 RAW로 바꿔보면
0x12E42 - 0x1000 + 0x400 = 0x12242
그럼 Name이 들어있는 실제 주소는 0x12242라는 것을 알 수 있다
OriginFirstThunk는 INT를 가르키고 있다
INT란?
- 해당 실행파일에서 사용하는 API들의 이름 목록
[ IMAGE_IMPORT_BY_NAME ]
해당 구조체 목록의 RVA값은 0x12C48 이걸 RAW로 바꾸면
0x12CA8 - 0x1000 + 0x400 = 0x120A8
이제 사용할 API들의 이름들을 얻었으니 실제 주소를 알아와야 한다
FristThunk는 IAT를 가르키는데 IAT는 실제 API들의 주소들이 기록되어 있다
FristThunk는 0x109C(RVA)로 기록되어 있으니 RAW로 변환해 보면
0x109C - 0x1000 + 0x400 = 0x49C
이제 0x7744E3DB 로 가보면 ShellAboutW 가 로드되어 있을 것 이다.
하지만 디버거에서 확인을 해보면
다음과 같이 주소가 0x7D642E6F로 바뀌어 있는데 이유는
PE Loader에 의해 실제 함수의 값이 덮어지기 때문