windows pe) EAT
windows 운영체제에서는 프로그램에서 함수를 호출할때 라이브러리를 사용함니다.
dll이나 sys파일이 대표적입니다.
EAT는 Export Adress Table의 약자이고 라이브러리에서 함수를 가져다주는 메커니즘입니다.
IMAGE_EXPORT_DIRECTORY에서 익스포트 정보를 저장하고있습니다.
IMAGE_EXPORT_DIRECTORY 은 pe 파일 안에 하나만 존제합니다.
EAT는 IMAGE_OPTIONAL_HEADER의 DATA DIRECTORY의 첫번쨰 배열에 속합니다.
EAT의 첫번쨰 4바이트는 Vitual Address를 나타내고 두번쨰 4바이트가 size 맴버입니다.
EAT의 Vitual Address의 주소는 IMAGE_EXPORT_DIRECTORY의 시작 주소를 가르킴니다.
peview 에서 아무dll파일을 열어서 EXPORT TABLE을 본것입니다.
data값을 따라가보면 export address table 을 찾으 실수 있습니다.
IMAGE_EXPORT_DIRECTORY의 DATA DIRECTORY배열의 첫번쨰를 보여주고 있습니다.
typedef struct _IMAGE_EXPORT_DIRECTORY {
DWORD Characteristics;
DWORD TimeDateStamp;
WORD MajorVersion;
WORD MinorVersion;
DWORD Name;
DWORD Base;
DWORD NumberOfFunctions;
DWORD NumberOfNames;
DWORD AddressOfFunctions; // RVA from base of image
DWORD AddressOfNames; // RVA from base of image
DWORD AddressOfNameOrdinals; // RVA from base of image
} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
위 구조체는 IMAGE_EXPORT_DIRECTORY의 구조체입니다.
여기에 정의되는 값은 모두 RVA입니다.
NumberOfFunctions 실제 export하는 함수의 개수
NumberOfNames 실제 export하는 함수중 이름을 가지는 함수의 개수
AddressOfFunctions export하는 함수의 주소 배열
AddressOfNames 함수이름의 주소배열
AddressOfNameOrdinals ordinal 주소 배열
ordinal 이란 도데쳐 무엇일까여 바로 export function의 고유 번호 입니다.
GetProcAddress로 dll에서 함수를 가져올때
dll제공자 에게서 함수의 고유번호를 받을떄가있는데 이떄 이번호로 가져옴니다.
예로 함수를 번호로 얻을떄와 함수 이름으로 얻을떄 입니다.
pfunc=GetProcAddress("TEST"); //함수명으로 가져올떄
pfunc=GetProcAddress(2); //함수 고유 번호로 얻을떄
dll 에서 함수명을 가져올려면 함수 이름 배열을 알아야하는데
address of names (name pointer table rva) 맴버의 위치로가면 4바이트씩 rva로 되어있는 값들이 있는데 그주소로 가면 함수이름이 나옴니다.
address of names 의 data 값인 000c0f64 을 raw로 변경하면 000b1364 값이나오는데 이걸 헥스 에디터로 보면
000c2f4b라는 값을 찾으실수 있습니다.
이값을 raw로 바꾸어주면 000b334b란 값이나오는데 이걸 또 헥스에디터로 가면
요렇게 이름 배열을 찾으실수 있습니다.
그러면 함수 고유 번호를 찾을수 도 알아야하느데
함수고유번호를 찾기위해서는 addressofnamesordinals(ordinals table rva) 값의 data값인 000c24a0를 raw로 바꾸면 000b28a0을 헥스에디터로 보면
2바이트씩 구성되어있는 배열을 보실수 있습니다.
이값들이 함수 고유 번호 입니다.
그런데 이값이 어떤 함수의 ordinal인지 알 수없습니다.
함수 이름배열의 원소 에서 1을 뺀 값이 ordinal값입니다.
함수의 실제 주소를 찾아갈려면 addressoffunctions의 배열에서 4바이트로되어잇는 값을 따라가시면 됨니다.
이값은rva값임니다.
그리고 디버거에서 볼수있는 주소 값들은 이값에서 imagebase값을 더하면 됨니다.
'Reversing > Windows PE' 카테고리의 다른 글
pe) reloc 섹션 제거 (0) | 2014.09.17 |
---|---|
windows pe) IAT (0) | 2014.07.25 |
windows pe) null패딩이 진짜 null패딩인지 확인하기 (0) | 2014.07.23 |
windows pe) RVA to RAW(file offset) (0) | 2014.07.15 |
windows pe)NT_HEADER 하 (0) | 2014.07.11 |