틀린 부분이 있다면 언제든지 댓글 남겨주세요!
PE: 32bit 형태의 windows 실행파일
(PE+, PE32+: 64bit)
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구조체로 구성
- 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=읽기 (비실행)
- 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 |
댓글