PE Header(NT Header)


PE Header(NT Header)에 대해서 알아보겠습니다.


PE Header(NT Header)는 winnt.h에 _IMAGE_NT_HEADERS로 정의되어 있습니다.










Signature 값은 PE00입니다.
FileHeader는 winnt.h에 _IMAGE_FILE_HEADER로 정의되어 있습니다.
OptionalHeader는 winnt.h에 _IMAGE_OPTIONAL_HEADER로 정의되어 있습니다.

FileHeader를 보겠습니다.





여기서 중요한 것은 'WORD Machine'과 'WORD NumberOfSections', 'WORD SizeOfOptionalHeader', 'WORD Characteristics'입니다.

Machine 값은 CPU를 나타냅니다.
NumberOfSections 값은 전체 Section의 개수를 나타냅니다.
SizeOfOptionalHeader 값은 OptionalHedaer의 크기를 나타냅니다.
Characteristics 값은 파일 속성을 나타냅니다.


Machine은 winnt.h에 정의되어 있습니다.










SizeOfOptionalHeader 값이 'E0'면 32 bit, 'F0'면 64 bit입니다.
Characteristics 값은 winnt.h에 정의되어 있습니다.







Bit OR 형식으로 예를 들어, 0x8002면 0x8000과 0x0002가 선택된 상태입니다.


OptionalHeader를 보겠습니다.
winnt.h에 _IMAGE_OPTIONAL_HEDAER로 정의되어 있습니다.(64 비트는 _IMAGE_OPTIONAL_HEADER64를 보셔야 합니다.)






여기서 중요한 것은 'WORD Magic', 'DWORD SizeOfCode', 'DWORD SizeOfInitializedData', 'DWORD AddressOfEntryPoint', 'DWORD ImageBase', 'DWORD SectionAlignment', 'DWORD FileAlignment', 'DWORD SizeOfImage', 'DWORD SizeOfHeaders', 'DWORD Subsystem', 'IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]'입니다.


Magic 값은 실행 파일 비트를 나타냅니다.(32 bit, 64 bit, ROM)winnt.h에 정의되어 있습니다.






SizeOfCode 값은 Code Section의 크기를 나타냅니다.
SizeOfInitializedData 값은 Initialized data Section의 크기를 나타냅니다.
AddressOfEntryPoint 값은 Entry Point의 주소를 나타냅니다.
ImageBase 값은 PE 파일이 로딩되는 시작 주소를 나타냅니다.
(AddressOfEntryPoint + ImageBase 값에서 시작됨.)
SectionAlignment 값은 ROM(메모리)에서의 Section 최소단위입니다.
FileAlignment 값은 파일에서의 Section 최소단위입니다.
SizeOfImage 값은 ROM(메모리)에 PE Image가 올라갔을 때의 전체 크기를 나타냅니다. SectionAlignment의 배수입니다.
SizeOfHeader 값은 첫 Section의 Offset 값입니다. FileAlignment의 배수입니다.
(SizeOfHeader = DOS Header + DOS STUB + PE Header + SECTION Table)

Subsystem 값은 GUI 인지 CUI 인지 확인할 수 있습니다.
winnt.h에 정의되어 있습니다.












DataDirectory 배열 정의는 winnt.h에 있습니다.











여기서 중요한 배열은
DataDirectory[0] = IMAGE_DIRECTORY_ENTRY_EXPORT
DataDirectory[1] = IMAGE_DIRECTORY_ENTRY_IMPORT
DataDirectory[2] = IMAGE_DIRECTORY_ENTRY_RESOURCE
DataDirectory[9] = IMAGE_DIRECTORY_ENTRY_TLS
입니다.




끝.




카테고리: Reversing

댓글

이 블로그의 인기 게시물

Python urllib.parse.quote()

Python OpenCV 빈 화면 만들기

tensorflow tf.random.uniform()

Android Notification with Full Screen

KiCad 시작하기 2 (PCB 만들기)

Android Minimum touch target size

Python bs4.SoupStrainer()

KiCad 시작하기 4 (기존 회로도 수정 및 추가)

음악 총보(Score), 파트보(Part)

tensorflow tf.expand_dims()