X2r0Ar

리버싱 - PE File Format 본문

Reversing./Study

리버싱 - PE File Format

D2v 2017. 5. 10. 13:28

리버싱 - PE File Format


◆ PE File Format  이란?


Windows 운영체제에서 사용되는 실행 파일 형식입니다.


- 32bit : PE32

- 64bit : PE+, PE32+


PE File의 종류


- 실행 계열 : EXE, SCR

- 라이브러리 계열 : DLL, OCX, CPL, DRV

- 드라이버 계열 : SYS, VXD

- 오브젝트 파일 계열 : OBJ



VA & RVA


- VA : 프로세스 가상 메모리의 절대주소

- RVA : ImageBase 기준에서 부터의 상대주소


※ ImageBase + RVA = VA


◆ PE 헤더


DOS Header


PE 헤더의 제일 앞부분에 존재 (IMAGE_DOS_HEADER 구조체 / 64byte)


typedef struct _IMAGE_DOS_HEADER {      // DOS .EXE header
    WORD   e_magic;                     // Magic number
    WORD   e_cblp;                      // Bytes on last page of file
    WORD   e_cp;                        // Pages in file
    WORD   e_crlc;                      // Relocations
    WORD   e_cparhdr;                   // Size of header in paragraphs
    WORD   e_minalloc;                  // Minimum extra paragraphs needed
    WORD   e_maxalloc;                  // Maximum extra paragraphs needed
    WORD   e_ss;                        // Initial (relative) SS value
    WORD   e_sp;                        // Initial SP value
    WORD   e_csum;                      // Checksum
    WORD   e_ip;                        // Initial IP value
    WORD   e_cs;                        // Initial (relative) CS value
    WORD   e_lfarlc;                    // File address of relocation table
    WORD   e_ovno;                      // Overlay number
    WORD   e_res[4];                    // Reserved words
    WORD   e_oemid;                     // OEM identifier (for e_oeminfo)
    WORD   e_oeminfo;                   // OEM information; e_oemid specific
    WORD   e_res2[10];                  // Reserved words
    LONG   e_lfanew;                    // File address of new exe header
  } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

- e_magic : DOS signature (4D5A=>ASCII "MZ")

- e_lfanew : NT header의 옵셋 (파일에 따라 가변적)


DOS Stub


16비트 어셈블리어 명령어로 32비트에서는 전혀 실행되지 않습니다. (해당 코드가 없어도 실행에 지장없습니다.)


NT Header


typedef struct _IMAGE_NT_HEADERS {
    DWORD Signature;
    IMAGE_FILE_HEADER FileHeader;
    IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

- DWORD Signature : PE Signature (50450000=>ASCII "PE00")


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;

- WORD Machine : CPU별로 고유한 값 (Intel x86 : 0x014c / Intel x64 : 0x0200)

- WORD NumberOfSections : 섹션의 개수

- WORD SizeOfOptionalHeader : NT Header - IMAGE_OPTIONAL_HEADER32의 크기

- WORD Characteristics : 파일의 속성을 나타내는 값으로, 실행가능한 형태인지 혹은 DLL파일인지 등의 정보들이 bit OR 형식으로 조합

'Reversing. > Study' 카테고리의 다른 글

리버싱 - 기초 리버싱2  (0) 2017.05.04
리버싱 - 기초 리버싱  (0) 2017.05.01
Comments