PE 파일 형식 정보
10288 단어 PortableExecutablePEWindows
입문
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_magic
및 e_lfanew
두 필드만 사용됩니다.e_magic
마술 번호
0x5A4D
(MZ)를 저장합니다.e_lfanew
NT HEADER
의 위치.MS-DOS REAL-MODE STUB PROGRUM
MS-DOS HEADER
과NT 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
가 아닌 경우에는 다른 형식입니다.FileHeader
FileHeader
(구조).OptionalHeader
OptionalHeader
(구조).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
됩니다.SizeOfOptionalHeader
OptionalHeader
사이즈입니다.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) 중 하나를 선택합니다.일반적으로 32bit
0x10b
에 사용됩니다.0x20b
의 경우 64bit용 파일로 구조와 필드의 크기가 다르다.MajorLinkerVersionMinorLinkerVersion
린카의 버전 정보.
SizeOfCode
코드 영역의 크기입니다.
SizeOfInitializedData
문자열 문자열과 같은 값이 확정된 데이터 영역의 크기입니다.
SizeOfUninitializedData
값 (예: 글로벌 변수) 이 결정되지 않은 데이터 영역의 크기입니다.
AddressOfEntryPoint
입구 지점의 RVA입니다.
실제 입구점의 주소는 후술한
ImageBase
에 AddressOfEntryPoint
를 더해서 얻을 수 있다.BaseOfCode
코드 영역의 기본 주소입니다.
RVA로 기술합니다.
BaseOfData
전역 주소와 같은 값이 정해지지 않은 데이터 영역의 기본 주소입니다.
RVA로 기술합니다.
ImageBase
파일을 로드할 주소입니다.
icrosoft에서 만든 개발 환경에서 기본 EXE 파일은
0x00400000
, DLL 파일은 0x10000000
로 설정됩니다.링크 옵션 등을 통해 변경할 수 있습니다.
로드에 실패하면 위치를 다시 지정합니다.
SectionAlignment
각 절의 정렬을 로드합니다.
각 섹션의 시작 주소는
SectionAlignment
의 배수입니다.다음 섹션의 시작 주소까지의 나머지 영역은
NULL
으로 채워집니다.FileAlignment
파일의 각 부분을 배치할 때의 정렬입니다.
각 섹션의 시작 주소는
FileAlignment
의 배수입니다.다음 섹션의 시작 주소까지의 나머지 영역은
NULL
으로 채워집니다.MajorOperatingSystemVersionMinorOperatingSystemVersion
대상 운영 체제의 버전 정보입니다.
MajorImageVersionMinorImageVersion
이 파일의 버전 정보입니다.
MajorSubsystemVersionMinorSubsystemVersion
서브시스템 버전 정보.
Recerved1
사용하지 않습니다.
SizeOfImage
프로그램을 불러오는 데 필요한 크기입니다.
페이지 경계,
SectionAlignment
경계에 정렬된 총계를 기준으로 바이트 수를 계산합니다.이것은 불러오기 전 실행 파일의 크기와 다르다는 것을 주의하십시오.
SizeOfHeader
FILE 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
폐지하다.
NumberOfRvaAndSize
IMAGE_DATA_DIRECTRY
의 수량.보통
IMAGE_NUMBEROF_DIRECTRY_ENTRIES
(16)입니다.DataDirectory
IMAGE_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는 동일한 이름과 특성의 일부를 한데 묶습니다.
섹션 제목
PointerToRawData
과 SizeOfRawData
에 값이 있을 때만 섹션 데이터가 존재합니다.Name
절 이름.
VirtualSize
절의 크기.
VirtualAddress
부분적인 RVA.
PointerToRawData
영역이 초기 값이면 파일 내 오프셋이 저장됩니다.
초기화 변수 등 데이터가 없는 부분에 저장
0
.PointerToRelocations
PE 파일에서 사용되지 않습니다.
PointerToLinenumbers
행 번호로 오프셋합니다.
구식 디버깅 정보이기 때문에 통상적으로 저장한다
0
.cl에/Z7 옵션을 추가하여 생성합니다.
NumberOfRelocations
정보의 수를 재배치합니다.
PE 파일에 저장됩니다
0
.NumberOfLinenumbers
줄 번호 정보의 수입니다.
Characteristics
절의 특성을 나타내는 표지의 논리와.
참고 자료
Reference
이 문제에 관하여(PE 파일 형식 정보), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/cha1aza/items/f64dc4351517a2477ef1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)