이번에는 PE 구조 중에서 마지막 헤더에 해당하는 SECTION HEADER에 대해서 정리해보겠다 ㅠ
===========================================================================================
우선 WinNT.h에서 SECTION HEADER 구조체를 가져와보자.
#define IMAGE_SIZEOF_SHORT_NAME 8
typedef struct _IMAGE_SECTION_HEADER {
BYTE Name[IMAGE_SIZEOF_SHORT_NAME];
union {
DWORD PhysicalAddress;
DWORD VirtualSize;
} Misc;
DWORD VirtualAddress;
DWORD SizeOfRawData;
DWORD PointerToRawData;
DWORD PointerToRelocations;
DWORD PointerToLinenumbers;
WORD NumberOfRelocations;
WORD NumberOfLinenumbers;
DWORD Characteristics;
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
WinNT.h에는 위와 같이 정의되어 있다.
각 필드를 정리해보자. ㅠ
Name : 8바이트의 문자열이다. 만일 문자열이 8바이트보자 적다면 널 문자로 채운다.
만일, 8바이트 보다 크다면 나머지는 버리고 8바이트만 받아온다.
VirtualSize : 실제 코드와 데이터의 크기를 명시한다.
PhysiclaAddress는 현재 사용되지 않는 필드이다.
VirtualAddress : 메모리에 로드되었을 때 섹션의 시작 주소를 명시한다.
당연히 RVA이다.
SizeOfRawData : Optional Header의 FileAlignment 값의 배수로 정렬된 값이다.
파일에 저장된 코드와 데이터의 크기이다.
PointerOfRawData : 파일 상에서 섹션의 시작 주소를 명시한다.
RVA 값이다.
PointerOfRelocations : IMAGE_RELOCATION 구조체의 주소를 명시한다.
이 구조체에는 파일 재배치 정보가 담겨있다.
오브젝트 파일에서만 유효하고 실행 파일에서는 0의 값을 가지고 있다.
PointerOfLinenumber : IMAAGE_LINENUMBER 구조체의 주소를 명시한다.
이 구조체에는 COFF 스타일의 라인 번호가 담겨있다.
NumberOfRelocations : IMAGE_RELOCATION 구조체의 개수를 가지고 있다.
NumberOfLinenumber : IMAGE_LINENUMBER 구조체의 개수를 가지고 있다.
Characteristics : 섹션의 특성을 설명해주는 플래그들을 가지고 있다.
많은 종류가 있어서 중요한 거 몇 개만 설명하고 넘어가겠다.
나머지는 WinNT.h에 정리되어 있다.
IMAGE_SCN_CNT_CODE(0x00000020) : 섹션에 코드가 포함되어 있다.
IMAGE_SCN_CNT_INITIALIZED_DATA(0x00000040) : 초기화된 데이터가 포함된다.
IMAGE_SCN_CNT_UNINITIALIZED_DATA(0x00000080) : 초기화되지 않은 데이터가
포함된다.
IMAGE_SCN_MEM_EXECUTE(0x20000000) : 실행가능하다.
IMAGE_SCN_MEM_READ(0x40000000) : 섹션이 있는 메모리 영역을 읽을 수 있다.
IMAGE_SCN_MEM_WRITE(0x80000000) : 섹션이 있는 메모리 영역을 쓸 수 있다.
각 필드는 위와 같은 역할을 한다.
=========================================================================================
Section Header를 알아보았다.