EAT(Export Address Table)
EAT(Export Address Table)에 대해서 알아보겠습니다.
EAT(Export Address Table)는 PE 파일의 함수를 외부에서 호출할 수 있도록 만든 테이블입니다.
EAT의 주소는 DataDirectory[0] IMAGE_DIRECTORY_ENTRY_EXPORT VA에 저장되어 있습니다.
EAT 구조는 winnt.h에 _IMAGE_EXPORT_DIRECTORY에 정의되어 있습니다.
여기서 중요한 것은 'DWORD Name', 'DWORD Base', 'DWORD NumberOfFunctions', 'DWORD NumberOfNames', 'DWORD AddressOfFunctions', 'DWORD AddressOfNames', 'DWORD AddressOfNameOrdinals'입니다.
Name 값은 dll 이름이 저장된 주소가 저장되어 있습니다.(File Offset 계산 필요 - dll 이름을 변경하여도 원래 이름을 확인 가능)
Base 값은 함수 Ordinal의 시작 번호입니다.
NumberOfFunctions 값은 모든 Export 함수의 개수입니다.
NumberOfNames 값은 이름으로 Export 되는 함수의 개수입니다. Ordinal로 Export 되는 함수는 포함되지 않습니다.(NumberOfFunctions 값보다 작거나 같습니다)
AddressOfFunctions 값은 모든 Export 함수의 실제 주소 배열의 시작 주소입니다.
AddressOfNames 값은 Export 함수의 이름이 저장되어 있는 배열의 시작 주소입니다.
AddressOfNameOrdinals 값은 이름으로 Export 되는 함수의 Ordinal 배열의 시작 주소입니다.
제가 만든 PE Viewer로 예를 들겠습니다.
User32.dll을 분석해보았습니다.
Name 값입니다.
0x9a7de
USER32.dll이 보입니다.
AddressOfFunctions 값입니다.
0x97d48
Ordinal 0 번 주소(0004F170)부터 시작하여, NumberOfFunctions 개수만큼 존재합니다.
0 번이지만, Base 0x000005DE(1,502)를 더하여, 1502부터 시작합니다.
이미지 베이스(7ff874d60000)에 위의 함수 주소(0004F170)를 더하면, 해당 함수로 찾아갈 수 있습니다.
AddressOfNames 값입니다.0x99044
0009C1E9의 File Offset을 구하면, 0009A7E9입니다.
0009A7E9 주소를 시작으로 하여, NumberOfNames 개수만큼 존재합니다.
AddressOfNameOrdinals 값입니다.
0x9a000
0001을 시작으로 합니다. Base 0x000005DE(1,502)를 더한 값인 1,503이 됩니다.
여기에 나온 숫자는 모두, Name으로 Export 되는 함수의 Ordinal입니다.
총개수는 NumberOfNames 값입니다.
이를 모두 조합하면, EAT를 다음과 같이 정리할 수 있습니다.
끝.
카테고리: Reversing
댓글
댓글 쓰기
궁금한 점은 댓글 달아주세요.
Comment if you have any questions.