[WinAPI] PE 구조


OPTIONAL Header + 0x28byte = Address Of Entry Point(000C637F)
가령, 파일이 0x400000에 로드되어 있고, AOEP값이 0x1234이면 이
파일은 0x401234에 있는 코드부터 실행을 시작한다는 의미임. 보통 이 값은 VC++이 가리키고 있는 스텁코드를 지시하지만
본인이 작성한 EntryPoint로 지시되도록 하고자 한다면 /entry:"WinMainCRTStartup1"을 통해서 변경할수 있다.

OPTIONAL Header + 0x50byte = SizeOfImage(008C5000)
PE 헤더를 포함해 모든 세션을 다 나타내며, 이는 Windows 로더가 해당파일을 메모리에 로드할때 얼마만큼의 메모리를 할당할지를 결정하는 값
OPTIONAL Header + 0x74byte = Numer of Directories(00000010)
이후 (0x16 * 8)byte만큼이 Directory Entries가 이어진다.
위는 섹션헤더가 시작. 섹션헤더의 크기는 40바이트이며 Number of sections갯수만큼 존재한다.
typedef struct _IMAGE_SECTION_HEADER{

위는 섹션헤더가 시작. 섹션헤더의 크기는 40바이트이며 Number of sections갯수만큼 존재한다.
typedef struct _IMAGE_SECTION_HEADER{
BYTE Name[8]; // #pragma data_seg 혹은 #pragma code_seg로 설정가능
union{
DWORD PhysicalAddress;
DWORD VirtualSize; // 로더가 해당 세션을 위해 할당할 메모리 크기
} Misc;
DWORD VirtualAddress; // BaseAddress에 더해질 RVA값(세션이 위치할)
DWORD SizeOfRawData; // 이 세션의 파일에 저장되어 있는 크기 값
DWORD SizeOfRawData; // 이 세션의 파일에 저장되어 있는 크기 값
DWORD PointerToRawData; // 이 세션이 위치한 파일에서의 오프셋 값
DWORD PointerToRelocations;
DWORD PointerToLinenumbers;
WORD NumberOfRelocations;
WORD NumberOfLinenumbers;
DWORD Characteristics;
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
위 세션 헤더정보에 따라서 각각의 세션 정보들이 쭉 이어지게 된다.



댓글
댓글 쓰기