PE 헤더 PE헤더에는 DOS 헤더, NT 헤더, Section 헤더 크게 세가지로 구분이 되어 있습니다.
<DOS 헤더>
DOS signature("MZ") 와 NT Header의 옵셋이 들어있습니다. DOS 헤더 아래에는 DOS Stub을 통해서 도스에서 실행될때 처리를 넣을 수 있습니다. (컴파일러가 기본으로 "This program cannot be run is DOS mode" 라고 콘솔에 뿌려주는 처리루틴을 DOS Stub에 넣게 됩니다.)
<NT 헤더>
PE signature("PE")와 File Header, Optional Header 를 포함하고 있습니다. File Header에는 이 PE 파일이 지원하는 CPU와 section 수, Optional Header 사이즈 등을 포함하고 있습니다. Optional Header에는 실제 메모리로 올라갔을때 필요한 정보들이 포함이 되어 있습니다.
- ImageBase : 메모리에서 PE파일이 로딩되는 시작주소
- SectionAlignment, FileAlignment : 섹션의 최소단위를 나타내면 메모리에서의 섹션과 파일에서의 섹션의 최소단위의 사이즈가 다르다. 각 섹션의 크기는 반드시 Alignment의 배수여야함.
- SizeOfImage : 메모리에서 PE Image가 차지하는 사이즈
- SizeOfHeader : 메모리에서 PE Header가 차지하는 사이즈
- subsystem : 드라이버(1), GUI(2), 콘솔기반(3) 인지 구분
<Section Header>
각 세셕의 메모리에서의 시작주소와 사이즈, 파일에서의 시작주소와 사이즈 정보가 포함되어 있다.
-VirtualAddress : 메모리에서의 section의 시작주소의 RVA
-PointerToRawData : 파일에서의 section의 시작주소의 RAW
-RVA : 메모리에서의 주소 옵셋으로 ImageBase를 기준으로 계산된다.
-RAW : 파일에서의 주소 옵셋
따라서 RVA와 RAW의 관계는 아래와 같다.
RVA - VA(section의 시작주소) = RAW - PointToRawData
다음에 IAT , EAT등 좀 더 깊게 들어가보겠습니다.
댓글 없음:
댓글 쓰기