홈 > IT > IT정보 > 시스템
IT정보

PE파일 구조 정리 2

PE파일 구조 정리 1 에 이어서 작성하는 글입니다.

(링크 : http://www.hacure.com/bbs/board.php?bo_table=tip&wr_id=20&page=2 )


PE파일 구조 및 특성 정리입니다. http://dragon82.tistory.com/7 를 참조하면서 정리했습니다.

아마 링크에 정리된 게시물이 첨부 사진도 있어 보기 편할 듯 합니다.


​1) IMAGE_DOS_HEADER

2) DOS stub code

3) IMAGE_NT_HEADERS

    3-1) PE sinature

    3-2) IMAGE_FILE_HEADERS

    3-3) IMAGE_OPTIONAL_HEADER

    3-4) IMAGE_DATA_DIRECTORY

4)IMAGE_SECTION_HEADER       

    4-1) IMAGE_SECTION_HEADER

    4-2) IMAGE_SECTION_HEADER

    4-3) IMAGE_SECTION_HEADER

                . . .

5) SECTION_DATA



4. IMAGE_SECTION_HEADER

    - IMAGE_SECTION_HEADER 구조체

        ​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;

    ​- 섹션 헤드는 각 섹션의 구체적인 정보들이 담긴 영역이다.

    ​- 섹션의 개수는 앞에서도 언급한, IMAGE_NT_HEADER의 IMAGE_FILE_HEADER 안의 NumberOfSection 의 값으로 알 수 있다.

    4-1. Name

        ​- 해당 필드는 섹션 이름을 아스키 값으로 표현하는 부분이다.

        ​- 이름을 나타내는 아스키값은 8자로 제한이 된다.

        ​- 8자가 넘어가면 잘려서 표시가 된다.

    4-2. PhysicalAddress, VirtualSize

       ​- union(공용체)는 실행또는 라이브러리파일(EXE, DLL)인지 OBJ파일인지 두 가지 경우에 따라 값이 틀려진다.

       ​- OBJ의 경우는 값이 0으로 고정되고, 실행파일인 경우 코드와 데이터의 실제 값을 가지고 있다.

       ​- EXE 파일인 경우 섹션 크기를 가지기 때문에 VirtualSize와 관련이 있고 DLL 파일인 경우 물리적주소와 관련이 있어 PhysicalAddress와 관련이 있다.

       ​- VirtualSize와 이제 뒤에서 설명할 SizeOfRawData 의 차이점을 잘 알아야 한다.

       ​- VirtualSize와 PointerToRawData의 값이 서로 다를 수도 있고 같을수도 있는데 이 이유는 아래 설명.

    4-3. SizeOfRawData

       ​- ​이 필드는 파일 상의 섹션의 크기에 대한 정보를 가지고 있다.

       ​​- VirtualSize 의 크기를 IMAGE_OPTIONAL_HEADER 에 있는 FileAlignment 크기의 배수로 올림한 크기를 나타낸다.

       ​- OBJ파일인 경우에는 값이 0으로 고정된다.

    4-4. VirtualAddress

       ​- 이 필드는 메모리상에 파일이 로드되었을때 섹션이 시작되는 주소를 RVA 값으로 담고 있다.

    4-5. PointerToRawData

       ​- 이 필드는 파일상에서 해당 섹션이 시작하는 실제 오프셋(offset)값을 가지고 있다.

       ​- VirtualAddress 가 가리키는 주소값과 같을 수도 있고, 다를 수도 있다.

※VirtualAddress와 PointerToRawData 의 값이 다를 수도 있는 이유※

결론을 먼저 말하면, 실행파일의 크기를 줄이기 위해서이다. 예를 들어 로드 된 섹션이 0x1000 정도의 크기를 가진다고 하자. 이 섹션은 메모리 값이 초기화 될 필요도 없고, 값도 들어있지 않고, 실행시 영역만 할당해주는 역할을 한다고 하자. 그럼 이 섹션데이터가 실행파일에서 영역을 가지고 있을 필요가 없다. 그래서 VirtualAddress 는 0이 아닌 값을 갖지만, 파일 내에 위치를 의미하는 PointerToRawData 의 값은 0이 된다.

    4-6.Characteristics

       ​- 이 필드는 해당 섹션의 특성들을 나타낸다.

       ​- 예를 들면 다음과 같다.

           ​0x00000020 - IMAGE_SCN_CNT_CODE : 섹션에 코드가 포함되어 있는 것을 의미한다.

           ​0x20000000 - IMAGE_SCN_MEM_EXECUTE : 섹션이 실행 가능하다는 것을 의미한다.

           ​0x40000000 - IMAGE_SCN_MEM_READ : 섹션이 읽기가 가능하다는 것을 의미한다.

           ​이외에도 여러가지가 있으며 아래 링크에서 마지막 Characteristics 항목에서 확인하면 된다.

           ​(참고 :  http://msdn.microsoft.com/en-us/library/windows/desktop/ms680341(v=vs.85).aspx  )

1 Comments
1 bigkingnoodles 01.25 09:42  
Category
State
  • 현재 접속자 30 명
  • 오늘 방문자 719 명
  • 어제 방문자 845 명
  • 최대 방문자 948 명
  • 전체 방문자 126,484 명
  • 전체 게시물 1,612 개
  • 전체 댓글수 243 개
  • 전체 회원수 102 명
Facebook Twitter GooglePlus KakaoStory NaverBand