티스토리 뷰

반응형

PE32, PE+, PE32+ 라고 불리는 PE File Format은 실행파일형식이다.

Linux의 ELF File Format과 같다. 이 파일형식을 가지는 확장자는 EXE, DLL, OCX, SYS 등등이 있다.

 

 

        DOS Header

        DOS Stub  --- 여기까지는 DOS와의 호환성을 위해 존재하는 Header이다.

        NT Header

        Section Header (.text)

        Section Header (.data)

        Section Header (.rsrc)  --- 여기까지가 PE Header이다.

        Section (.text)

        Section (.data)

        Section (.rsrc)

 

PE File Format은 대표적으로 위와같은 구성을 가진다.

여기서 당연하게도 Section은 늘어날수도 줄어들수도 있다. (임의로 추가도 가능)

 

 

[ DOS Header ]

 DOS와의 호환성을 위해 만들어진 Header이다. 40byte로 구성되어있다.

 

 사용되는 멤버

  - e_magic : DOS Signiture ( 4D5A : MZ )

  - e_ifanew : NT Header Offset ( Default : 0x100 )

    ( NT Header이 나오는 Offset을 나타낸다. DOS Stub에 따라서 가변적이다. )

 

위 두 멤버를 제외하고 나머지 멤버는 다른 것으로 대체되어도 상관없다.

 ( 실제로 UPackPE에서는 이와 같은 방법을 교묘하게 이용했다. )

 

 

[ NT Header ]

 총 0xF8byte로 구성되어있다. PE Header중에 가장 큰 구조체이다.

 

 사용되는 멤버

  - Signiture : 5045 (PE)

  - File Header 

      Machine : CPU별 고유한 값이 존재한다.

      NumberOfSections : Section의 개수. 반드시 Section Header의 개수와 일치해야한다.

      SizeOfOptionalHeader : OptionalHeader의 크기는 구조체로 0xE0으로 고정되어있지만,

                                      Windows는 해당 값을 통해서 OptionalHeader의 크기를 인식한다.

                                      UPackPE에서는 이 값을통해 해당 크기를 속이는 방법을 이용한다.

     Characteristics : 파일의 속성을 OR bit연산을 통해서 나타낸다.

  - OptionalHeader

       Magic : 32bit일 경우 10B, 64bit일 경우 20B의 값을 가진다.

       AddressOfEntryPoint : 해당 PE 파일이 Memory에 올라갈경우 Entry Point를 나타낸다.

       ImageBase : 뭔지는 됐고, EXE는 0x40000 DLL은 0x10000000의 기본값을 가진다.

                        Windows 시스템에서 제공하는 DLL들은 고유한 ImageBase를 가진다.

                                          ( Relocation의 과정을 거치지 않기 위함이다. )

       SectionAlignment, FileAlignment : 두 가지 정렬기준이다.

       SizeOfImage : PE파일이 메모리에 로딩되었을때 가상메모리에서 PE Image크기이다.

       SizeOfHeader : PE Header의 총 크기를 나타낸다. 파일 시작인 0에서 이 크기를 더하면

                           첫 번째 Section에 대한 데이터가 나온다. - FileAlignment의 배수이다.

       Subsystem : 별건 아니지만 SYS, GUI, CUI의 구분용이다.

       NumberOfRvaAndSize : DataDirectory 배열의 길이이다.

                                      기본적으로 0x10개로 정해져 있지만 PE로더는 해당 값을 보고 인식한다.

                                                ( 마찬가지로 UPackPE는 이를 이용해 여유공간을 만들고 이용한다. )

 

 

 

[ Section Header ]

 Section을 구분짓는 이유는 상호간의 안정성을 위해서이다.

 

사용되는 멤버

  - Name (8byte)

  - Virtual Size (4byte) : Memory에서의 Size

  - RVA (4byte) : Memory에서의 Offset

  - SizeOfRawData (4byte) : File에서의 Size

  - PointerToRawData (4byte) : File에서의 Offset

  - Characteristics (4byte) : 권한 등등의 속성을 OR bit로 계산하여 나타낸다.

 

 

                                                

 

 

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함