'SECTION HEADER'에 해당되는 글 1건

  1. 2008.12.05 [PE 구조] SECTION HEADER

이번에는 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를 알아보았다.

Posted by skensita