Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

More than 5 years have passed since last update.

PEファイルフォーマットについて 補足

Last updated at Posted at 2018-06-21

##はじめに
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.
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?