무민이의 반반무많이

PE 파일의 구조와 이해 ② 본문

Reversing/Basic

PE 파일의 구조와 이해 ②

M00min 2016.09.21 23:36

(공감과 댓글 하나는 글쓴이에게 큰 힘이 됩니다.)


PE 파일의 구조와 이해 ① : http://moomini.tistory.com/93

PE 파일의 구조와 이해 ② : http://moomini.tistory.com/94

PE 파일의 구조와 이해 ③ : http://moomini.tistory.com/95

PE 파일의 구조와 이해 ④ : http://moomini.tistory.com/96


■ NT Header

typedef struct _IMAGE_NT_HEADER {

    DWORD Signature;  // PE00

    IMAGE_FILE_HEADER FileHeader;

    IMAGE_OPTIONAL_HEADER32 OptionalHeader;

} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADER32;


#define IMAGE_DOS_SIGNATURE 0x4D5A // MZ (MS-DOS Header)

#define IMAGE_OS2_SIGNATURE 0x4E45 // NE (16-bit Windows)

#define IMAGE_OS2_SIGNATURE_LE 0x4C45 // LE (VxD)

#define IMAGE_NT_SIGNATURE 0x50450000 // PE00 (PE Header)

- NT Header 구조체의 크기는 F8h

- Signature, FileHeader, OptionalHeader 총 3개의 멤버로 구성

- Signature는 0x50450000의 값을 가진다. (변경 불가)



■ NT Header - IMAGE_FILE_HEADER

typedef struct _IMAGE_FILE_HEADER {

    WORD Machine;

    WORD NumberOfSections;

    DWORD TimeDateStamp;

    DWORD PointerToSymbolTable;

    DWORD NumberOfSymbols;

    WORD SizeOfOptionalHeader;

    WORD Characteristics;

} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

 Machine

- CPU마다 고유한 값을 가지며, 32bit의 경우 14Ch의 값을 가진다.


 NumberOfSections

- PE 파일의 Section 갯수 (반드시 0보다 커야됨)

- 정의된 Section 갯수보다 실제 Section이 적으면, 에러 발생

- 정의된 Section 갯수보다 실제 Section이 많으면, 정의된 갯수 만큼만 인식


 TimeDateStamp

- 1969년 12월 31일 오후 4시 이후의 Seconds


 PointerToSymbolTable

- COFF Sybol Table의 File Offset


 NumberOfSymbols

- COFF Sybol Table의 Symbol 갯수


 SizeOfOptionalHeader

- IMAGE_OPTIONAL_HEADER32 구조체의 크기


 Characteristics

- 파일의 속성값 지정 (실행 가능한 형태인지, DLL 파일인지 등의 정보가 bit OR 형식으로 조합)



■ NT Header - IMAGE_OPTIONAL_HEADER32

typedef struct _IMAGE_OPTIONAL_HEADER {

    WORD Magic;

    BYTE MajorLinkerVersion;

    BYTE MinorLinkerVersion;

    DWORD SizeOfCode;

    DWORD SizeOfInitializedData;

    DWORD SizeOfUninitializedData;

    DWORD AddressOfEntryPoint;

    DWORD BaseOfCode;

    DWORD BaseOfData;

    DWORD ImageBase;

    DWORD SectionAlignment;

    DWORD FileAlignment;

    WORD MajorOperatingSystemVersion;

    WORD MinorOperatingSystemVersion;

    WORD MajorImageVersion;

    WORD MinorImageVersion;

    WORD MajorSubSystemVersion;

    WORD MinorSubSystemVersion;

    DWORD Win32VersionValue;

    DWORD SizeOfImage;

    DWORD SizeOfHeaders;

    DWORD Checksum;

    WORD Subsystem;

    WORD DllCharacteristics;

    DWORD SizeOfStackReserve;

    DWORD SizeOfStackCommit;

    DWORD SizeOfHeapReserve;

    DWORD SizeOfHeapCommit;

    DWORD LoaderFlags;

    DWORD NumberOfRvaAndSizes;

    IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];

} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32

 Magic

- IMAGE_OPTIONAL_HEADER 구조체의 경우 10B

- IMAGE_OPTIONAL_HEADER64 구조체의 경우 20B


 MajorLinkerVersion, MinorLinkerVision

- 컴파일러 버전 정보를 의미하나, 실행에 영향을 미치지 않는다.


 SizeOfCode

- 실행 가능 코드의 Page(0x1000) 단위 크기로, 보통 .text Section의 크기를 의미


 SizeOfInitializeData

- 초기화된 데이터의 Page(0x1000) 단위 크기로, 보통 .text Section을 제외한 모든 Section의 크기를 의미


 SizeOfUninitializeData

- 초기화되지 않은 데이터의 Page(0x1000) 단위 크기로, 보통 .bss Section의 크기를 의미


 AddressOfEntryPoint

- 프로그램에서 최초로 실행되는 코드(Entry Point)의 시작주소 RVA 값


 BaseOfCode

- .text Section의 시작 RVA


 BaseOfData

- .data Section의 시작 RVA


 ImageBase

- 프로세스의 가상 메모리공간(0~FFFFFFFF)에 PE 파일이 로딩되는 시작 주소를 의미

- EXE, DLL 파일은 User Memory 영역인 0~7FFFFFFFh 범위에 위치하고, SYS 파일은 Kernel Memory 영역인 80000000h ~ FFFFFFFFh 범위에 위치

- EXE 파일의 기본 ImageBase는 0x00400000, DLL 파일의 기본 ImageBase는 0x10000000

- PE Loader는 PE 파일을 실행시키기 위해 프로세스를 생성하고, 파일을 메모리에 로딩 시킨 후 EIP 레지스터 값을 ImageBase + AddressOfEntryPoint 값으로 세팅


 SectionAlignment

- 메모리에서 Section의 최소단위. Section의 크기는 SectionAlignment의 배수가 되어야 한다.


 FileAlignment

- 파일에서 Section의 최소단위. Section의 크기는 FileAlignment의 배수가 되어야 한다.


 MajorOperatingSystemVersion, MinorOperatingSystemVersion

- 파일 실행을 위한 OS 시스템 버전


 MajorImageVersion, MinorImageVersion

- 실행 파일 버전


 MajorSubsystemVersion, MinorSubsystemVersion


 Win32VersionValue

- Reserved : 항상 1


 SizeOfImage

- PE 파일이 메모리에 로딩되었을 때 가상 메모리에서 PE Image가 차지하는 크기

- ImageBase에서 마지막 Section의 Alignment 구분까지의 총 크기

- 일반적으로 파일의 크기와 메모리에 로딩된 크기는 다르다.


 SizeOfHeader

- PE Header의 전체 크기

- FileAlignment의 배수

- 파일 시작부분에서 SizeOfHeader Offset 만큼 떨어진 위치에서 첫 번째 섹션 시작


 Checksum

- File CRC로, SYS 파일의 경우 해당 CheckSum이 틀리면 로드되지 않는다.


 Subsystem

- 1 : Driver File (*.sys)

- 2 : GUI(Graphic User Interface) 파일 → notepad.exe와 같은 윈도우 기반 어플리케이션

- 3 : CUI(Console User Interface) 파일 → cmd.exe와 같은 콘솔 기반 어플리케이션


 DllCharacteristics


 SizeOfStackReserve

- Thread Stack의 초기 예약된 크기

- Default : 0x100000 (1MB)


 SizeOfStackCommit

- Thread Stack의 초기 Commit 된 Memory 크기


 SizeOfHeapReserve

- Process Heap의 초기 예약된 크기


 SizeOfHeapCommit

- Process Heap의 초기 Commit 된 크기

- Default : 0x1000


 LoaderFlags


 NumberOfRvaAndSizes

- 뒤에 따라오는 DataDirectory 배열의 갯수

- 구조체 정의에 배열의 갯수는 16이라고 명시되어 있지만, PE Loader는 NumberOfRvaAndSizes의 값을 보고 배열의 크기를 인식



 DataDirectory

- IMAGE_DATA_DIRECTORY 구조체의 배열로써, 배열의 각 항목마다 정의된 값을 가진다.

- DataDirectory[0] = EXPORT Directory, DataDirectory[1] = IMPORT Directory, DataDirectory[2] = RESOURCE Directory, DataDirectory[9] = TLS Directory만 중요


'Reversing > Basic' 카테고리의 다른 글

PE 파일의 구조와 이해 ④  (0) 2016.09.23
PE 파일의 구조와 이해 ③  (0) 2016.09.22
PE 파일의 구조와 이해 ②  (0) 2016.09.21
PE 파일의 구조와 이해 ①  (0) 2016.09.20
PE(Portable Executable) 파일  (0) 2016.09.19
실행파일(PE) 분석 과정  (0) 2016.07.06
0 Comments
댓글쓰기 폼