##はじめに
PEファイルフォーマットについての用語解説や詳細についての補足になります。
勉強が進み次第随時更新・修正する予定です。
誤りや補足等ありましたら、コメント欄にお願い致します。
##語句
- Oblect file
- リンカへの入力として与えられたファイル。
- セクション
-
コードや文字リテラル、変数のような分類ごとに分けられた区画のこと。
- RVA
-
相対仮想アドレス (Relative Virtual Address) の略。
実際のアドレスからイメージのロードアドレスを引いた、メモリにロードされたアイテムのアドレス。
ディスク上のファイル内の位置(ファイルポインタ)とほぼ常に異なる。
オブジェクトファイルでは、メモリの場所が割り当てられていないため、RVAの意味はない。
##フィールド
- Magic / file signeture
- winnt.hにて定義されている。
winnt.h
\#define IMAGE_DOS_SIGNATURE 0x4D5A // MZ
\#define IMAGE_OS2_SIGNATURE 0x4E45 // NE
\#define IMAGE_OS2_SIGNATURE_LE 0x4C45 // LE
\#define IMAGE_NT_SIGNATURE 0x50450000 // PE00
- Machine
-
winnt.hにて定義されている。
フィールドには、そのCPUタイプを指定する次の値のいずれかがある。
ファイルは、指定されたマシン上または指定されたマシンをエミュレートするシステム上でのみ実行できる。
winnt.h
\#define IMAGE_FILE_MACHINE_UNKNOWN 0
\#define IMAGE_FILE_MACHINE_TARGET_HOST 0x0001 // Useful for indicating we want to interact with the host and not a WoW guest.
\#define IMAGE_FILE_MACHINE_I386 0x014c // Intel 386.
\#define IMAGE_FILE_MACHINE_R3000 0x0162 // MIPS little-endian, 0x160 big-endian
\#define IMAGE_FILE_MACHINE_R4000 0x0166 // MIPS little-endian
\#define IMAGE_FILE_MACHINE_R10000 0x0168 // MIPS little-endian
\#define IMAGE_FILE_MACHINE_WCEMIPSV2 0x0169 // MIPS little-endian WCE v2
\#define IMAGE_FILE_MACHINE_ALPHA 0x0184 // Alpha_AXP
\#define IMAGE_FILE_MACHINE_SH3 0x01a2 // SH3 little-endian
\#define IMAGE_FILE_MACHINE_SH3DSP 0x01a3
\#define IMAGE_FILE_MACHINE_SH3E 0x01a4 // SH3E little-endian
\#define IMAGE_FILE_MACHINE_SH4 0x01a6 // SH4 little-endian
\#define IMAGE_FILE_MACHINE_SH5 0x01a8 // SH5
\#define IMAGE_FILE_MACHINE_ARM 0x01c0 // ARM Little-Endian
\#define IMAGE_FILE_MACHINE_THUMB 0x01c2 // ARM Thumb/Thumb-2 Little-Endian
\#define IMAGE_FILE_MACHINE_ARMNT 0x01c4 // ARM Thumb-2 Little-Endian
\#define IMAGE_FILE_MACHINE_AM33 0x01d3
\#define IMAGE_FILE_MACHINE_POWERPC 0x01F0 // IBM PowerPC Little-Endian
\#define IMAGE_FILE_MACHINE_POWERPCFP 0x01f1
\#define IMAGE_FILE_MACHINE_IA64 0x0200 // Intel 64
\#define IMAGE_FILE_MACHINE_MIPS16 0x0266 // MIPS
\#define IMAGE_FILE_MACHINE_ALPHA64 0x0284 // ALPHA64
\#define IMAGE_FILE_MACHINE_MIPSFPU 0x0366 // MIPS
\#define IMAGE_FILE_MACHINE_MIPSFPU16 0x0466 // MIPS
\#define IMAGE_FILE_MACHINE_AXP64 IMAGE_FILE_MACHINE_ALPHA64
\#define IMAGE_FILE_MACHINE_TRICORE 0x0520 // Infineon
\#define IMAGE_FILE_MACHINE_CEF 0x0CEF
\#define IMAGE_FILE_MACHINE_EBC 0x0EBC // EFI Byte Code
\#define IMAGE_FILE_MACHINE_AMD64 0x8664 // AMD64 (K8)
\#define IMAGE_FILE_MACHINE_M32R 0x9041 // M32R little-endian
\#define IMAGE_FILE_MACHINE_ARM64 0xAA64 // ARM64 Little-Endian
\#define IMAGE_FILE_MACHINE_CEE 0xC0EE
###Characteristics
FILE HEADER
フラグ | 値 | 意味 |
---|---|---|
IMAGE_FILE_RELOCS_STRIPPED | 0x0001 | 再配置情報が含まれているか |
IMAGE_FILE_EXECUTABLE_IMAGE | 0x0002 | ファイルは実行可能であるか |
IMAGE_FILE_LINE_NUMS_STRIPPED | 0x0004 | 廃止 |
IMAGE_FILE_LOCAL_SYMS_STRIPPED | 0x0008 | 廃止 |
IMAGE_FILE_AGGRESSIVE_WS_TRIM | 0x0010 | 廃止 |
IMAGE_FILE_LARGE_ADDRESS_ AWARE | 0x0020 | 2GB以上のアドレスを処理できるか |
0x0040 | 将来使用するために予約されているフラグ | |
IMAGE_FILE_BYTES_REVERSED_LO | 0x0080 | 廃止 |
IMAGE_FILE_32BIT_MACHINE | 0x0100 | 32ビットアーキテクチャのファイルであるか |
IMAGE_FILE_DEBUG_STRIPPED | 0x0200 | デバッグ情報 |
IMAGE_FILE_REMOVABLE_RUN_ FROM_SWAP | 0x0400 | リムーバブルメディア上にある場合、完全に読み込んでスワップファイルにコピーする |
IMAGE_FILE_NET_RUN_FROM_SWAP | 0x0800 | ネットワークメディア上にある場合、完全に読み込んでスワップファイルにコピーする |
IMAGE_FILE_SYSTEM | 0x1000 | システムファイルであるか |
IMAGE_FILE_DLL | 0x2000 | DLLファイルであるか |
IMAGE_FILE_UP_SYSTEM_ONLY | 0x4000 | ユニプロセッサマシン上で実行する必要があるか |
IMAGE_FILE_BYTES_REVERSED_HI | 0x8000 | 廃止 |
SECTION HEADER
IMAGE_SCN_XXXX
//
// Section characteristics.
//
// IMAGE_SCN_TYPE_REG 0x00000000 // Reserved.
// IMAGE_SCN_TYPE_DSECT 0x00000001 // Reserved.
// IMAGE_SCN_TYPE_NOLOAD 0x00000002 // Reserved.
// IMAGE_SCN_TYPE_GROUP 0x00000004 // Reserved.
\#define IMAGE_SCN_TYPE_NO_PAD 0x00000008 // Reserved.
// IMAGE_SCN_TYPE_COPY 0x00000010 // Reserved.
\#define IMAGE_SCN_CNT_CODE 0x00000020 // Section contains code.
\#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 // Section contains initialized data.
\#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 // Section contains uninitialized data.
\#define IMAGE_SCN_LNK_OTHER 0x00000100 // Reserved.
\#define IMAGE_SCN_LNK_INFO 0x00000200 // Section contains comments or some other type of information.
// IMAGE_SCN_TYPE_OVER 0x00000400 // Reserved.
\#define IMAGE_SCN_LNK_REMOVE 0x00000800 // Section contents will not become part of image.
\#define IMAGE_SCN_LNK_COMDAT 0x00001000 // Section contents comdat.
// 0x00002000 // Reserved.
// IMAGE_SCN_MEM_PROTECTED - Obsolete 0x00004000
\#define IMAGE_SCN_NO_DEFER_SPEC_EXC 0x00004000 // Reset speculative exceptions handling bits in the TLB entries for this section.
\#define IMAGE_SCN_GPREL 0x00008000 // Section content can be accessed relative to GP
\#define IMAGE_SCN_MEM_FARDATA 0x00008000
// IMAGE_SCN_MEM_SYSHEAP - Obsolete 0x00010000
\#define IMAGE_SCN_MEM_PURGEABLE 0x00020000
\#define IMAGE_SCN_MEM_16BIT 0x00020000
\#define IMAGE_SCN_MEM_LOCKED 0x00040000
\#define IMAGE_SCN_MEM_PRELOAD 0x00080000
\#define IMAGE_SCN_ALIGN_1BYTES 0x00100000 //
\#define IMAGE_SCN_ALIGN_2BYTES 0x00200000 //
\#define IMAGE_SCN_ALIGN_4BYTES 0x00300000 //
\#define IMAGE_SCN_ALIGN_8BYTES 0x00400000 //
\#define IMAGE_SCN_ALIGN_16BYTES 0x00500000 // Default alignment if no others are specified.
\#define IMAGE_SCN_ALIGN_32BYTES 0x00600000 //
\#define IMAGE_SCN_ALIGN_64BYTES 0x00700000 //
\#define IMAGE_SCN_ALIGN_128BYTES 0x00800000 //
\#define IMAGE_SCN_ALIGN_256BYTES 0x00900000 //
\#define IMAGE_SCN_ALIGN_512BYTES 0x00A00000 //
\#define IMAGE_SCN_ALIGN_1024BYTES 0x00B00000 //
\#define IMAGE_SCN_ALIGN_2048BYTES 0x00C00000 //
\#define IMAGE_SCN_ALIGN_4096BYTES 0x00D00000 //
\#define IMAGE_SCN_ALIGN_8192BYTES 0x00E00000 //
// Unused 0x00F00000
\#define IMAGE_SCN_ALIGN_MASK 0x00F00000
\#define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000 // Section contains extended relocations.
\#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 // Section can be discarded.
\#define IMAGE_SCN_MEM_NOT_CACHED 0x04000000 // Section is not cachable.
\#define IMAGE_SCN_MEM_NOT_PAGED 0x08000000 // Section is not pageable.
\#define IMAGE_SCN_MEM_SHARED 0x10000000 // Section is shareable.
\#define IMAGE_SCN_MEM_EXECUTE 0x20000000 // Section is executable.
\#define IMAGE_SCN_MEM_READ 0x40000000 // Section is readable.
\#define IMAGE_SCN_MEM_WRITE 0x80000000 // Section is writeable.