본문 바로가기
OS/Window

PE구조

by jino22 2021. 8. 23.

틀린 부분이 있다면 언제든지 댓글 남겨주세요! 


 

PE: 32bit 형태의 windows 실행파일

(PE+, PE32+: 64bit)

 

DOS Header

Image DOS header

시작부터 64bit가 Image_dos_header

 

[주요 구조체]

  • magic number = 4D 5A (MZ) (맨 처음 2byte) > PE파일
  • e_lfanew = 00000200 (맨 마지막 4byte) > NT header의 주소 (실질적인 윈도우 헤더 위치)
    * 주소는 리틀엔디언 방식으로 저장됨

 

MS-DOS Stub

: DOS 운영체제에서 윈도우용 PE파일을 실행한 경우에 보여줄 오류 메시지 저장
  윈도우에서 실행하는 경우 실행되지 않는 부분

 

 

NT Header

: 4바이트의 signature + IMAGE_FILE_HEADER, IMAGE_OPTIONAL_HEADER구조체로 구성

NT header

  • Signature: 50 45 00 00 (PE) 
  • File header
    • Machine = 014C > CPU 고유값, 현재 IA-32호환 CPU (64호환= 200h)
    • Number of Sections = 0008 > 섹션의 개수, 반드시 0보다 커야함
    • TimeDateStamp = 40B10868 > PE 파일이 만들어진 시간, 즉 이 파일이 빌드된 날짜가 타임스탬프 형식으로 기록
    • Size of optional header = 00E0 > Image Optional Header의 크기, 32bit 실행파일이면 E0 / 64bit이면 F0 / obj파일이면 00 의 값을 가짐
    • Characteristics = 010E (=0100 + 08 + 04 + 02=32bit이며 로컬 심볼과 라인 넘버가 제거되었고 실행가능한 EXE파일임) > 파일 속성값
  • Optional header
    • Magic = 010B > 시그니처, 32bit인 경우 10B / 64bit인 경우 20B값을 가짐
    • Size of Code = F000 > Code영역의 크기(.text섹션)
    • Address of Entry Point = 0000 1000 > 실행 시작 주소, RAV 값으로 저장되어 있음
    • Base of Code/Data = 00001000 / 000B0000 > 첫번째 Code/Data 섹션이 시작되는 RVA
    • Image Base = 00400000 > 파일이 메모리에 로드될 때 시작 주소
    • Section/File Alignment = 00001000 / 00000200 > 메모리/파일에서 섹션 최소 단위, 메모리/파일에서 섹션의 크기는 각 단위값의 배수가 되어야 함 (모자른 값은 0으로 패딩)
    • Size of Image = 00153000 > 메모리 로딩시 할당해야 하는 총 크기
    • Size of Header = 00000600 > PE 헤더의 총 크기, 즉 파일 시작부터 이 offset만큼 떨어진 곳에 첫번째 섹션 위치
    • Number of Data Directories(NumberOfRvaAndSize) = 0000000010 > Data Directory 배열의 개수
    • Data Directory 영역 => Image Data Directory구조체의 배열

 

더보기

RAW(File offset) : PE파일 내부에서의 오프셋, 파일이 실행되기 전 주소  file

VA(Virtual Address): 메모리 절대주소 memory

RVA(Relative Virtual Address): Imagebase에서 부터의 상대주소, 메모리에서 섹션의 주소 memory

PointerToRawData: 파일에서 섹션의 시작위치

 

VA = RVA+ImageBase

RAW = RVA-VirtualAddress+PointerToRawData

* 이 식에서의 VirtualAddress는 위 식의 VA와 다르다. 이는 Section Header의 멤버인 VirtualAddress 즉 메모리 섹션의 시작 주소 (RVA)를 의미한다.

 

 

Section Header

: 각 섹션의 속성을 정의한 것

 

[ 메모리 속성별 엑세스 권한 ]

code=실행, 읽기

data=읽기, 쓰기 (비실행)

resource=읽기 (비실행)

 

Section Header - .text

  • Name = 2E 74 65 78 (.text)
  • Virtual Size = 000AF000 > 메모리에서 섹션이 차지하는 크기
  • Virtual Address(RVA) = 00001000 > 메모리에서 섹션의 시작 주소
    * ImageBase + Virtual Address = 해당 섹션의 실제 주소(RVA)
  • Size of Raw Data = 000AE800 > 파일에서 섹션이 차지하는 크기
  • Pointer to Raw Data = 00000600 > 파일에서 섹션의 시작 주소
    * 메모리/파일의 시작 주소는 각각 Section/File Alignment값의 배수에 해당하는 값을 가짐
  • Characteristics = 60000020 (=40000000 + 20000000 + 20=읽고 실행할 수 있으며 code로 채워진 섹션) > 섹션 속성값

 

728x90
반응형

'OS > Window' 카테고리의 다른 글

MTF (Master File Table)  (0) 2022.07.28
윈도우 탐색기 프로세스 종료 오류  (4) 2020.11.18
Window 기본 명령어  (0) 2020.08.27

댓글