-
PE 파일(정리) - 2Reversing 2019. 2. 11. 17:37
(* 본 글은 리버싱 핵심원리와 다른 블로그들의 글들을 보고 대충 정리해본 것입니다.
혹여 사실이 아닌 부분이 있다면 피드백 남겨주시면 감사하겠습니다.)
* PE 파일(정리) - 2 에서부터 이어집니다.
3. NT Header(3개의 멤버로 구성됨 : Signature, FileHeader, Optional Header)
- 다른 설명은 생략한다.
1) Signature : 50450000h("PE"00) 값을 가짐.
( * 별로 안 중요한가? )
( ** NT Header의 시작인 셈..)
2) IMAGE_FILE_HEADER
- 멤버 자체는 7개가 있지만, 그 중에서 4가지 멤버를 중요하게 여기는듯
1. Machine : CPU별로 고유한 값, 책에선 예시로 32비트 인텔 x85 호환 칩은 14C를 값으로 가진다고 한다.
다시 말하면 "이 파일이 어떤 CPU에서 돌아가고 있다"를 명시하는 부분이라고 생각하면 될듯.
winnt.h 파일에 정의된 Machine 넘버의 값? 몰라 넘어가
2. NumberOfSections : 그 섹션의 개수를 의미한다. 0보다 무조건 커야 하고, 실제 섹션이 정의된 섹션 개수와 다르면 실행 에러가 뜬다. 띠용.. 궁금할 때는 구글링이지, 섹션은 PE에 저장되는 데이터들이 다시금 분배되어 저장되는 위치라고 한다.
3. SizeOfOptionalHeader : IMAGE_NT_HEADERS 구조체의 마지막 멤버인 IMAGE_OPTIONAL_HEADER32 구조체의 크기를 나타낸다.
( * 위 상황은 32비트일 때고, PE32+ 형태 파일은 IMAGE_OPTIONAL_HEADER64 구조체를 사용한다고 한다. 크게 어려울 건 없는듯)
4. Characteristics : 이름값함. PE파일이 어떤 특성을 갖고 있는지 알려주는 구조체다. 실행 가능 여부, DLL 파일 여부 등이 bit OR 형식으로 조합된다.
3) IMAGE_FILE_HEADER
조지게 많네요. 와우!이것도 모두 중요하지만 좀 많으니 가장 중요한 몇가지만 추려냅시다.
1. Magic : 32비트, 64비트 여부에 따라 10B, 20B로 값이 바뀐다. 그것만 명시하는듯
2. AddressOfEntryPoint : EP의 RVA 값을 지닌다. 프로그램에서 최초로 실행되는 코드의 시작 주소라는 말이다.
3. ImageBase : 어 이거 정리 1에서 나왔는데 VA = RVA + ImageBase? 는 집어치우고 이는 메모리에서 PE 파일이 로딩되는 시작 주소를 나타낸다고 한다. 굉장히 중요하단다
4. SectionAlignment : 메모리에서의 섹션의 최소단위
FileAlignment : 파일에서의 섹션의 최소단위
-> 파일/메모리의 섹션 크기는 반드시 각각 FileAlignment, SectionAlignment의 배수가 되어야 한다.
5. SizeOfImage : PE 파일이 메모리에 로딩되었을 때, 가상 메모리에서 PE Image가 차지하는 크기를 나타냄.
6. SizeOfHeader : PE 헤더의 전체 크기를 나타냄. SizeOfImage랑은 조금 다르게 DOS Header, NT Header, Section Header까지의 모든 헤더의 크기를 나타낸다.
7. Subsystem : 시스템 드라이버 파일(sys 파일)인지, 일반 실행 파일(exe, dll)인지 구분 가능한 멤버
8. NumberOfRvaAndSizes : 이름 참 길다. IMAGE_OPTIONAL_HEADER32 구조체의 마지막 멤버인 DataDirectory 배열의 개수를 나타냄.
9. DataDirectory : IMAGE_DATA_DIRECTORY 구조체의 배열.
몰라요, 이 정도만 할래요. 타이핑하다보니까 시간 다 갔어..
'Reversing' 카테고리의 다른 글
이쯤에서 쓰는 codeengn basic 이후의 공부 계획 (0) 2019.05.11 PE 파일(정리) -1 (0) 2019.02.10