PE 파일 형식 정보

입문


PE를 조금 배우고 싶어서 거의 현판이지만 자신이 쓴 노트로 정리했다.
용어 및 필드에 대한 자세한 내용은 여기 을 참조하십시오.
내용은 학습의 진전에 따라 수시로 갱신되고 수정될 계획이다.
오류와 보충 등이 있으면 댓글란에 남겨주세요.

PE란 무엇입니까?


현재 주류가 된 실행 파일의 형식 중 하나입니다.
데이터 구조는 Windows SDK에 포함된 winnt.h 에 의해 정의됩니다.

MS-DOS HEADERMS-DOS REAL-MODE STUB PROGRUM


MS-DOS HEADER


_IMAGE_DOS_HEADER

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;
S-DOS와 호환됩니다.
Windows에서 이 파일을 실행할 때는 e_magice_lfanew 두 필드만 사용됩니다.
e_magic
마술 번호0x5A4D(MZ)를 저장합니다.
e_lfanewNT HEADER의 위치.

MS-DOS REAL-MODE STUB PROGRUM

MS-DOS HEADERNT HEADER 사이에 있습니다.
기본적으로 추가된 DOS 캐시에서 MS-DOS에서 이 파일을 실행할 때 "This program cannot be run in DOS mode."에서 설명한 대로 해당 매개변수의 값을 수정합니다.
치수는 가변 길이입니다.

NT HEADER


NT HEADERS


_IMAGE_NT_HEADERS

typedef struct _IMAGE_NT_HEADERS {
    DWORD Signature;
    IMAGE_FILE_HEADER FileHeader;
    IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
#ifdef _WIN64
typedef IMAGE_NT_HEADERS64                  IMAGE_NT_HEADERS;
typedef PIMAGE_NT_HEADERS64                 PIMAGE_NT_HEADERS;
#else
typedef IMAGE_NT_HEADERS32                  IMAGE_NT_HEADERS;
typedef PIMAGE_NT_HEADERS32                 PIMAGE_NT_HEADERS;
#endif
마술 번호와 머리의 조합입니다.Signature, FileHeader, OptionalHeader 세 가지.
Signature
마술 번호 저장0x50450000(PE\0\0).
0x50450000가 아닌 경우에는 다른 형식입니다.
FileHeaderFileHeader(구조).
OptionalHeaderOptionalHeader(구조).

FILE 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;
#define IMAGE_SIZEOF_FILE_HEADER             20
Machine
이 파일이 어떤 기계에 대한 값인지 표시합니다.
NumberOfSections
절수를 나타내는 값.
TimeDateStamp
파일의 시간 스탬프.
PointerToSymbolTableNumberOfSymbols
PE 파일에는 기호 테이블이 포함되지 않으므로 설정0됩니다.
SizeOfOptionalHeaderOptionalHeader 사이즈입니다.
Characteristics
파일 특성을 나타내는 플래그의 논리적 및.

OPTIONAL HEADER


_IMAGE_OPTIONAL_HEADER

typedef struct _IMAGE_OPTIONAL_HEADER {
    //
    // Standard fields.
    //
    WORD    Magic;
    BYTE    MajorLinkerVersion;
    BYTE    MinorLinkerVersion;
    DWORD   SizeOfCode;
    DWORD   SizeOfInitializedData;
    DWORD   SizeOfUninitializedData;
    DWORD   AddressOfEntryPoint;
    DWORD   BaseOfCode;
    DWORD   BaseOfData;
    //
    // NT additional fields.
    //
    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;
COFF가 필요 없어서 OPTIONAL이라는 이름을 지었습니다.
하지만 PE는 필수입니다.
치수는 가변 길이입니다.
Magic
마술 번호0x10b(PE32),0x20b(PE+),0x107(ROM) 중 하나를 선택합니다.
일반적으로 32bit0x10b에 사용됩니다.0x20b의 경우 64bit용 파일로 구조와 필드의 크기가 다르다.
MajorLinkerVersionMinorLinkerVersion
린카의 버전 정보.
SizeOfCode
코드 영역의 크기입니다.
SizeOfInitializedData
문자열 문자열과 같은 값이 확정된 데이터 영역의 크기입니다.
SizeOfUninitializedData
값 (예: 글로벌 변수) 이 결정되지 않은 데이터 영역의 크기입니다.
AddressOfEntryPoint
입구 지점의 RVA입니다.
실제 입구점의 주소는 후술한 ImageBaseAddressOfEntryPoint를 더해서 얻을 수 있다.
BaseOfCode
코드 영역의 기본 주소입니다.
RVA로 기술합니다.
BaseOfData
전역 주소와 같은 값이 정해지지 않은 데이터 영역의 기본 주소입니다.
RVA로 기술합니다.
ImageBase
파일을 로드할 주소입니다.
icrosoft에서 만든 개발 환경에서 기본 EXE 파일은 0x00400000, DLL 파일은 0x10000000 로 설정됩니다.
링크 옵션 등을 통해 변경할 수 있습니다.
로드에 실패하면 위치를 다시 지정합니다.
SectionAlignment
각 절의 정렬을 로드합니다.
각 섹션의 시작 주소는 SectionAlignment 의 배수입니다.
다음 섹션의 시작 주소까지의 나머지 영역은 NULL 으로 채워집니다.
FileAlignment
파일의 각 부분을 배치할 때의 정렬입니다.
각 섹션의 시작 주소는 FileAlignment 의 배수입니다.
다음 섹션의 시작 주소까지의 나머지 영역은 NULL 으로 채워집니다.
MajorOperatingSystemVersionMinorOperatingSystemVersion
대상 운영 체제의 버전 정보입니다.
MajorImageVersionMinorImageVersion
이 파일의 버전 정보입니다.
MajorSubsystemVersionMinorSubsystemVersion
서브시스템 버전 정보.
Recerved1
사용하지 않습니다.
SizeOfImage
프로그램을 불러오는 데 필요한 크기입니다.
페이지 경계, SectionAlignment 경계에 정렬된 총계를 기준으로 바이트 수를 계산합니다.
이것은 불러오기 전 실행 파일의 크기와 다르다는 것을 주의하십시오.
SizeOfHeaderFILE HEADER, MS-DOS HEADER, NT HEADER, SECTION TABLES의 헤더 크기를 포함한다.
파일 정렬의 배수여야 합니다.
CheckSum
로드할 때 파일의 체크섬 확인에 사용됩니다.
값은 링크에서 설정 확인을 했습니다.
알고리즘은 IMAGEHELP.DLL 에서 확인할 수 있다.
Subsystem
파일의 대상 서브시스템입니다.IMAGE_SUBSYSTEM_NATIVE(1) 장치 드라이버IMAGE_SUBSYSTEM_WINDOWS_GUI(2)GUI, IMAGE_SUBSYSTEM_WINDOWS_CUI(3)CUI로 판단한다.
DllCharacteristics
DLL 특성을 나타내는 플래그의 논리적 및.
SizeOfStackReserve
스택 영역으로 보존된 크기입니다.
SizeOfStackCommit
스택 영역으로 제출한 크기입니다.
SizeOfHeapReserve
더미 영역으로 보존된 크기입니다.
SizeOfHeapCommit
퇴적 구역으로 제출된 크기입니다.
LoaderFlag
폐지하다.
NumberOfRvaAndSizeIMAGE_DATA_DIRECTRY의 수량.
보통IMAGE_NUMBEROF_DIRECTRY_ENTRIES(16)입니다.
DataDirectoryIMAGE_DATA_DIRECTORY 구조의 배열.
구조체는 각 입구가 있는 위치의 RVA 및 치수로 구성됩니다.
수조의 길이는 16, DataDirectory[0]는 도출표, DataDirectory[1]는 도입표 등으로 색인이 유지하는 항목의 의미에 따라 결정된다.
_IMAGE_DATA_DIRECTORY

typedef struct _IMAGE_DATA_DIRECTORY {
    DWORD   VirtualAddress;
    DWORD   Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

SECTION TABLESECTION DATA


SECTION TABLESECTION DATA


_IMAGE_SECTION_HEADER

#define IMAGE_SIZEOF_SHORT_NAME              8
typedef struct _IMAGE_SECTION_HEADER {
    BYTE    Name[IMAGE_SIZEOF_SHORT_NAME];
    union {
            DWORD   PhysicalAddress;
            DWORD   VirtualSize;
    } Misc;
    DWORD   VirtualAddress;
    DWORD   SizeOfRawData;
    DWORD   PointerToRawData;
    DWORD   PointerToRelocations;
    DWORD   PointerToLinenumbers;
    WORD    NumberOfRelocations;
    WORD    NumberOfLinenumbers;
    DWORD   Characteristics;
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
#define IMAGE_SIZEOF_SECTION_HEADER          40
항목표는 항목 제목의 배열이다.
섹션 제목에는 섹션 특성과 데이터 편이성 등의 정보가 포함되어 있습니다.
또한 PE는 동일한 이름과 특성의 일부를 한데 묶습니다.
섹션 제목PointerToRawDataSizeOfRawData에 값이 있을 때만 섹션 데이터가 존재합니다.
Name
절 이름.
VirtualSize
절의 크기.
VirtualAddress
부분적인 RVA.
PointerToRawData
영역이 초기 값이면 파일 내 오프셋이 저장됩니다.
초기화 변수 등 데이터가 없는 부분에 저장0.
PointerToRelocations
PE 파일에서 사용되지 않습니다.
PointerToLinenumbers
행 번호로 오프셋합니다.
구식 디버깅 정보이기 때문에 통상적으로 저장한다0.
cl에/Z7 옵션을 추가하여 생성합니다.
NumberOfRelocations
정보의 수를 재배치합니다.
PE 파일에 저장됩니다0.
NumberOfLinenumbers
줄 번호 정보의 수입니다.
Characteristics
절의 특성을 나타내는 표지의 논리와.

참고 자료

  • PE Format | Microsoft Docs
  • Microsoft Portable Executable and Common Object File Format Specification
  • PE File Format · deptofdefense/SalSA Wiki
  • OpenRCE
  • 뭐 공부 해요?
  • 좋은 웹페이지 즐겨찾기