windows pe)NT_HEADER 하
IMAGE_FILE_HEADER 의 구조체중 마지막인 Optional Header입니다.
Optional Header는 NT_HEADER중 가장크기가크며 이값이 잘못 설정되면 실행이되지 않습니다.
typedef struct _IMAGE_DATA_DIRECTORY {
DWORD VirtualAddress;
DWORD Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
typedef struct _IMAGE_OPTIONAL_HEADER {
WORD Magic;
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
DWORD SizeOfCode;
DWORD SizeOfInitializedData;
DWORD SizeOfUninitializedData;
DWORD AddressOfEntryPoint;
DWORD BaseOfCode;
DWORD BaseOfData;
DWORD ImageBase;
DWORD SectionAlignment;
DWORD FileAlignment;
WORD MajorOperatingSystemVersion;
WORD MinorOperatingSystemVersion;
WORD MajorImageVersion;
WORD MinorImageVersion;
WORD MajorSubsystemVersion;
WORD MinorSubsystemVersion;
DWORD Win32VersionValue;
DWORD SizeOfImage;
DWORD SizeOfHeaders;
DWORD CheckSum;
WORD Subsystem;
WORD DllCharacteristics;
DWORD SizeOfStackReserve;
DWORD SizeOfStackCommit;
DWORD SizeOfHeapReserve;
DWORD SizeOfHeapCommit;
DWORD LoaderFlags;
DWORD NumberOfRvaAndSizes;
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
주석은 제거하엿습니다.
magic은 32비트이면 010B값을 가지고 64비트이면 020B값을 가짐니다.
IMAGE_OPTIONAL_HEADER32인경우 010B값을 IMAGE_OPTIONAL_HEADER64 구조체인경우 020B값을 가짐니다.
AdressOfEntryPoint
AdressOfEntryPoint는 EP(Entry Point)의 RVA값을 가짐니다.
EP는 프로그램에서 최초로 시작되는 코드의 시작주소입니다.
ImageBase
프로세스의 가상메모리는 0~FFFFFFFF까지 같습니다. (64비트에서는 0~FFFFFFFFFFFFFFFF까지 같습니다)
ImageBase는 이 엄청난 범위에서 pe파일의 시작 주소를 나타냄니다.
EXE,DLL파일은 유져 메모리영역(user memory)인 0~7FFFFFFF 범위에 로딩되고
SYS파일은 커널메모리 영역인 80000000~FFFFFFFF범위에 로딩됨니다,
일방적으로 개발도구에서는EXE파일의ImageBase의 값은 00400000입니다,(다른 값도 가능합니다,)
DLL파일의 경우 10000000입니다 이 또한 다른 값이 가능합니다.
pe로더는 pe파일을 실행시키기위해 프로세스를 생성합니다.
그리고 파일을 메모리에 로딩한후 EIP 레지스터값을 ImageBase + AddressOfEntryPoint 값으로 세팅합니다.
SectionAlignment, FileAlignment
pe파일의 body부분은 많은 section으로 나누어져있습니다.
메모리에서 섹션의 최소단위는 SectionAlignment입니다.
파일에서 섹션의 최소단위를 나타내는것이 FileAlignment 입니다.
하나의 파일안에서 SectionAlignment와 FileAlignment값은 서로 같을수도 있고 다를수도 있습니다.
파일 메모리의 섹션의 크기는 각각SectionAlignment와 FileAlibgnment의 베수가 할당됨니다.
SizeOfImage
SizeofImage는 pe파일이 메모리에 로딩되었을떄 가상메모리에서 PE Image가 차지하는 크기를 나타냄니다.
SizeOfHeader
SizeofHeader는 pe전체의 크기를 나타냄니다. 이값은 Alibgnment값의 배수여야합니다.
파일시작에서 SizeOfHeader옵셋만큼 떨어진위치에서 첫번쨰 섹션이 위치합니다.
sub system
이값을 보고 시스템 드라이버파일인지 일반실행파일인지 콘솔실행파일인지 알수있습니다.
값 |
의미 |
비교 |
1 |
Driver fIle |
시스템 드러이버(ex: ntfs sys) |
2 |
GUI File |
창기반 어플리케이션 |
3 |
CUI File |
콘솔기반어플리케이션 |
NumberOfRvaAndSizes
NumberOfRvaAndSizes는 IMAGR_OPTIONAL_HEADER32구조체의 마지막 맴버인 data Directory 배열의 개수를 나타냄니다.
IMAGE_NUMBEROF_DIRECTORY_ENTRORY는 16이라 정이되어잇지만
pe로더는 numberofrvaandsizes의 값을보고 배열을 크기를 인식합니다 16이 아닐수도 있습니다.
Data Directory
Data Directory는 IMAGE_FATA_DIRECTORY 구조체 의 배열로
각항목마다 정의된값을 가짐니다.
배열의개수는 16개이며 define으로 갯수가 정해저있습니다.
typedef struct _IMAGE_DATA_DIRECTORY {
DWORD VirtualAddress;
DWORD Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
DataDirectory
DataDirectory[0] = Export Directory
DataDirectory[1] = Import Directory
DataDirectory[2] = Resource Directory
DataDirectory[3] = Exception Directory
DataDirectory[4] = Security Directory
DataDirectory[5] = Basereloc Directory
DataDirectory[6] = debug Directory
DataDirectory[7] = COPYRIGHT Directory
DataDirectory[8] = Global Directory
DataDirectory[9] = TLS Directory
DataDirectory[A] = LOAD_CONFIG Directory
DataDirectory[B] = BOUND_IMPORT Directory
DataDirectory[C] = IAT Directory
DataDirectory[D] = DELAY_IMPORT Directory
DataDirectory[E] = COM_DESCRIPTOR Directory
DataDirectory[F] = Reserved Directory
여기서 Directory는 구조체의 배열입니다.
여기서
DataDirectory[1] = Export Directory
DataDirectory[2] = Import Directory
DataDirectory[3] = Resource Directory
DataDirectory[9] = TLS Directory
가 중요함니다.
이것들은 나중에 같이 설명할것으므로 눈으로만 보시길 바람니다.
'Reversing > Windows PE' 카테고리의 다른 글
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.10 |
windows pe)DOS_STUB (0) | 2014.07.10 |
windows pe) pe 해더 DOS_HEADER (0) | 2014.07.09 |