[WinAPI] PE 구조

PE_AOEP.jpg

file:///C:/Users/x86-jeongmoon/Desktop/jeongmoonoh_html/images/2010/05/04/41223_20162.jpg_M530.jpg
OPTIONAL Header + 0x28byte = Address Of Entry Point(000C637F)

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

OPTIONAL Header + 0x50byte = SizeOfImage(008C5000)

PE 헤더를 포함해 모든 세션을 다 나타내며, 이는 Windows 로더가 해당파일을 메모리에 로드할때 얼마만큼의 메모리를 할당할지를 결정하는 값

OPTIONAL Header + 0x74byte = Numer of Directories(00000010)


이후 (0x16 * 8)byte만큼이 Directory Entries가 이어진다.PE_SECTION_HEADER.jpg

위는 섹션헤더가 시작. 섹션헤더의 크기는 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 PointerToRawData; // 이 세션이 위치한 파일에서의 오프셋 값
  DWORD PointerToRelocations;
  DWORD PointerToLinenumbers;
  WORD NumberOfRelocations;
  WORD NumberOfLinenumbers;
  DWORD Characteristics;
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

위 세션 헤더정보에 따라서 각각의 세션 정보들이 쭉 이어지게 된다.

댓글

이 블로그의 인기 게시물

[WinAPI] 모달리스 다이얼로그 설명

[WinDbg] Debugging a stack overflow

[WinDbg] first-chance, second-chance Exception