1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
|
/*-
* Copyright (c) 2015 Kai Wang
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: pe.h 3441 2016-04-07 15:04:20Z emaste $
*/
#ifndef _PE_H_
#define _PE_H_
#include <stdint.h>
/*
* MS-DOS header.
*/
typedef struct _PE_DosHdr {
char dh_magic[2];
uint16_t dh_lastsize;
uint16_t dh_nblock;
uint16_t dh_nreloc;
uint16_t dh_hdrsize;
uint16_t dh_minalloc;
uint16_t dh_maxalloc;
uint16_t dh_ss;
uint16_t dh_sp;
uint16_t dh_checksum;
uint16_t dh_ip;
uint16_t dh_cs;
uint16_t dh_relocpos;
uint16_t dh_noverlay;
uint16_t dh_reserved1[4];
uint16_t dh_oemid;
uint16_t dh_oeminfo;
uint16_t dh_reserved2[10];
uint32_t dh_lfanew;
} PE_DosHdr;
/*
* Rich header.
*/
typedef struct _PE_RichHdr {
uint32_t rh_xor;
uint32_t rh_total;
uint32_t *rh_compid;
uint32_t *rh_cnt;
} PE_RichHdr;
/*
* COFF header: Machine Types.
*/
#define IMAGE_FILE_MACHINE_UNKNOWN 0x0 /* not specified */
#define IMAGE_FILE_MACHINE_AM33 0x1d3 /* Matsushita AM33 */
#define IMAGE_FILE_MACHINE_AMD64 0x8664 /* x86-64 */
#define IMAGE_FILE_MACHINE_ARM 0x1c0 /* ARM LE */
#define IMAGE_FILE_MACHINE_ARMNT 0x1c4 /* ARMv7(or higher) Thumb */
#define IMAGE_FILE_MACHINE_ARM64 0xaa64 /* ARMv8 64-bit */
#define IMAGE_FILE_MACHINE_EBC 0xebc /* EFI byte code */
#define IMAGE_FILE_MACHINE_I386 0x14c /* x86 */
#define IMAGE_FILE_MACHINE_IA64 0x200 /* IA64 */
#define IMAGE_FILE_MACHINE_M32R 0x9041 /* Mitsubishi M32R LE */
#define IMAGE_FILE_MACHINE_MIPS16 0x266 /* MIPS16 */
#define IMAGE_FILE_MACHINE_MIPSFPU 0x366 /* MIPS with FPU */
#define IMAGE_FILE_MACHINE_MIPSFPU16 0x466 /* MIPS16 with FPU */
#define IMAGE_FILE_MACHINE_POWERPC 0x1f0 /* Power PC LE */
#define IMAGE_FILE_MACHINE_POWERPCFP 0x1f1 /* Power PC floating point */
#define IMAGE_FILE_MACHINE_R4000 0x166 /* MIPS R4000 LE */
#define IMAGE_FILE_MACHINE_RISCV32 0x5032 /* RISC-V 32-bit */
#define IMAGE_FILE_MACHINE_RISCV64 0x5064 /* RISC-V 64-bit */
#define IMAGE_FILE_MACHINE_RISCV128 0x5128 /* RISC-V 128-bit */
#define IMAGE_FILE_MACHINE_SH3 0x1a2 /* Hitachi SH3 */
#define IMAGE_FILE_MACHINE_SH3DSP 0x1a3 /* Hitachi SH3 DSP */
#define IMAGE_FILE_MACHINE_SH4 0x1a6 /* Hitachi SH4 */
#define IMAGE_FILE_MACHINE_SH5 0x1a8 /* Hitachi SH5 */
#define IMAGE_FILE_MACHINE_THUMB 0x1c2 /* ARM or Thumb interworking */
#define IMAGE_FILE_MACHINE_WCEMIPSV2 0x169 /* MIPS LE WCE v2 */
/*
* COFF header: Characteristics
*/
#define IMAGE_FILE_RELOCS_STRIPPED 0x0001
#define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002
#define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004
#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008
#define IMAGE_FILE_AGGRESSIVE_WS_TRIM 0x0010
#define IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020
#define IMAGE_FILE_BYTES_REVERSED_LO 0x0080
#define IMAGE_FILE_32BIT_MACHINE 0x0100
#define IMAGE_FILE_DEBUG_STRIPPED 0x0200
#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 0x0400
#define IMAGE_FILE_NET_RUN_FROM_SWAP 0x0800
#define IMAGE_FILE_SYSTEM 0x1000
#define IMAGE_FILE_DLL 0x2000
#define IMAGE_FILE_UP_SYSTEM_ONLY 0x4000
#define IMAGE_FILE_BYTES_REVERSED_HI 0x8000
/*
* COFF Header.
*/
typedef struct _PE_CoffHdr {
uint16_t ch_machine;
uint16_t ch_nsec;
uint32_t ch_timestamp;
uint32_t ch_symptr;
uint32_t ch_nsym;
uint16_t ch_optsize;
uint16_t ch_char;
} PE_CoffHdr;
/*
* Optional Header: Subsystem.
*/
#define IMAGE_SUBSYSTEM_UNKNOWN 0
#define IMAGE_SUBSYSTEM_NATIVE 1
#define IMAGE_SUBSYSTEM_WINDOWS_GUI 2
#define IMAGE_SUBSYSTEM_WINDOWS_CUI 3
#define IMAGE_SUBSYSTEM_POSIX_CUI 7
#define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI 9
#define IMAGE_SUBSYSTEM_EFI_APPLICATION 10
#define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 11
#define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 12
#define IMAGE_SUBSYSTEM_EFI_ROM 13
#define IMAGE_SUBSYSTEM_XBOX 14
/*
* Optional Header: DLL Characteristics
*/
#define IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE 0x0040
#define IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY 0x0080
#define IMAGE_DLL_CHARACTERISTICS_NX_COMPAT 0x0100
#define IMAGE_DLL_CHARACTERISTICS_NO_ISOLATION 0x0200
#define IMAGE_DLL_CHARACTERISTICS_NO_SEH 0x0400
#define IMAGE_DLL_CHARACTERISTICS_NO_BIND 0x0800
#define IMAGE_DLL_CHARACTERISTICS_WDM_DRIVER 0x2000
#define IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE 0x8000
/*
* Optional Header.
*/
#define PE_FORMAT_ROM 0x107
#define PE_FORMAT_32 0x10b
#define PE_FORMAT_32P 0x20b
typedef struct _PE_OptHdr {
uint16_t oh_magic;
uint8_t oh_ldvermajor;
uint8_t oh_ldverminor;
uint32_t oh_textsize;
uint32_t oh_datasize;
uint32_t oh_bsssize;
uint32_t oh_entry;
uint32_t oh_textbase;
uint32_t oh_database;
uint64_t oh_imgbase;
uint32_t oh_secalign;
uint32_t oh_filealign;
uint16_t oh_osvermajor;
uint16_t oh_osverminor;
uint16_t oh_imgvermajor;
uint16_t oh_imgverminor;
uint16_t oh_subvermajor;
uint16_t oh_subverminor;
uint32_t oh_win32ver;
uint32_t oh_imgsize;
uint32_t oh_hdrsize;
uint32_t oh_checksum;
uint16_t oh_subsystem;
uint16_t oh_dllchar;
uint64_t oh_stacksizer;
uint64_t oh_stacksizec;
uint64_t oh_heapsizer;
uint64_t oh_heapsizec;
uint32_t oh_ldrflags;
uint32_t oh_ndatadir;
} PE_OptHdr;
/*
* Optional Header: Data Directories.
*/
#define PE_DD_EXPORT 0
#define PE_DD_IMPORT 1
#define PE_DD_RESROUCE 2
#define PE_DD_EXCEPTION 3
#define PE_DD_CERTIFICATE 4
#define PE_DD_BASERELOC 5
#define PE_DD_DEBUG 6
#define PE_DD_ARCH 7
#define PE_DD_GLOBALPTR 8
#define PE_DD_TLS 9
#define PE_DD_LOADCONFIG 10
#define PE_DD_BOUNDIMPORT 11
#define PE_DD_IAT 12
#define PE_DD_DELAYIMPORT 13
#define PE_DD_CLRRUNTIME 14
#define PE_DD_RESERVED 15
#define PE_DD_MAX 16
typedef struct _PE_DataDirEntry {
uint32_t de_addr;
uint32_t de_size;
} PE_DataDirEntry;
typedef struct _PE_DataDir {
PE_DataDirEntry dd_e[PE_DD_MAX];
uint32_t dd_total;
} PE_DataDir;
/*
* Section Headers: Section flags.
*/
#define IMAGE_SCN_TYPE_NO_PAD 0x00000008
#define IMAGE_SCN_CNT_CODE 0x00000020
#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040
#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080
#define IMAGE_SCN_LNK_OTHER 0x00000100
#define IMAGE_SCN_LNK_INFO 0x00000200
#define IMAGE_SCN_LNK_REMOVE 0x00000800
#define IMAGE_SCN_LNK_COMDAT 0x00001000
#define IMAGE_SCN_GPREL 0x00008000
#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
#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
#define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000
#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000
#define IMAGE_SCN_MEM_NOT_CACHED 0x04000000
#define IMAGE_SCN_MEM_NOT_PAGED 0x08000000
#define IMAGE_SCN_MEM_SHARED 0x10000000
#define IMAGE_SCN_MEM_EXECUTE 0x20000000
#define IMAGE_SCN_MEM_READ 0x40000000
#define IMAGE_SCN_MEM_WRITE 0x80000000
/*
* Section Headers.
*/
typedef struct _PE_SecHdr {
char sh_name[8];
uint32_t sh_virtsize;
uint32_t sh_addr;
uint32_t sh_rawsize;
uint32_t sh_rawptr;
uint32_t sh_relocptr;
uint32_t sh_lineptr;
uint16_t sh_nreloc;
uint16_t sh_nline;
uint32_t sh_char;
} PE_SecHdr;
#endif /* !_PE_H_ */
|