XenevaOS
Loading...
Searching...
No Matches
pe.h
Go to the documentation of this file.
1
30#ifndef __PE_H__
31#define __PE_H__
32
33
34#include <stdint.h>
35#if defined(__GNUC__) || defined(__clang__)
36#ifndef __cplusplus
37#include <stdbool.h>
38#endif
39#endif
40
41#pragma pack(push, 1)
42
64
65typedef struct _IMAGE_NT_HEADERS_PE32_ IMAGE_NT_HEADERS_PE32, *PIMAGE_NT_HEADERS_PE32;
66typedef struct _IMAGE_NT_HEADERS_PE32PLUS_ IMAGE_NT_HEADERS_PE32PLYS, *PIMAGE_NT_HEADERS_PE32PLUS;
67
77
87
89 MAGIC_PE32 = 0x10b,
90 MAGIC_PE32P = 0x20b
91};
92
97
98#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
99
133
135
136 uint16_t Magic; // not-so-magical number
137 uint8_t MajorLinkerVersion; // linker version
139 uint32_t SizeOfCode; // size of .text in bytes
140 uint32_t SizeOfInitializedData; // size of .bss (and others) in bytes
141 uint32_t SizeOfUninitializedData; // size of .data,.sdata etc in bytes
142 uint32_t AddressOfEntryPoint; // RVA of entry point
143 uint32_t BaseOfCode; // base of .text
144 uint64_t ImageBase; // image base VA
145 uint32_t SectionAlignment; // file section alignment
146 uint32_t FileAlignment; // file alignment
147 uint16_t MajorOperatingSystemVersion; // Windows specific. OS version required to run image
149 uint16_t MajorImageVersion; // version of program
151 uint16_t MajorSubsystemVersion; // Windows specific. Version of SubSystem
154 uint32_t SizeOfImage; // size of image in bytes
155 uint32_t SizeOfHeaders; // size of headers (and stub program) in bytes
156 uint32_t CheckSum; // checksum
157 uint16_t Subsystem; // Windows specific. subsystem type
158 uint16_t DllCharacteristics; // DLL properties
159 uint64_t SizeOfStackReserve; // size of stack, in bytes
160 uint64_t SizeOfStackCommit; // size of stack to commit
161 uint64_t SizeOfHeapReserve; // size of heap, in bytes
162 uint64_t SizeOfHeapCommit; // size of heap to commit
163 uint32_t LoaderFlags; // no longer used
164 uint32_t NumberOfRvaAndSizes; // number of DataDirectory entries
167
173
179
180
181#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
182
183
184#define IMAGE_SCN_CNT_CODE 0x00000020
185#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040
186#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080
187#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000
188#define IMAGE_SCN_MEM_NOT_CACHED 0x04000000
189#define IMAGE_SCN_MEM_NOT_PAGED 0x08000000
190#define IMAGE_SCN_MEM_SHARED 0x10000000
191#define IMAGE_SCN_MEM_EXECUTE 0x20000000
192#define IMAGE_SCN_MEM_READ 0x40000000
193#define IMAGE_SCN_MEM_WRITE 0x80000000
194
207
208#define IMAGE_DATA_DIRECTORY_EXPORT 0
209#define IMAGE_DATA_DIRECTORY_IMPORT 1
210
224
235
240
246
251
252
253#define IMAGE_IMPORT_LOOKUP_TABLE_FLAG_PE32 0x80000000
255
256#define IMAGE_IMPORT_LOOKUP_TABLE_FLAG_PE32P 0x8000000000000000
258
259#pragma pack(pop)
260
264static const enum PeOptionalMagic MAGIC_NATIVE = MAGIC_PE32;
265static const enum PeMachineType MACHINE_NATIVE = IMAGE_FILE_MACHINE_I386;
266#define IMAGE_IMPORT_LOOKUP_TABLE_FLAG IMAGE_IMPORT_LOOKUP_TABLE_FLAG_PE32
267
268
269#pragma pack(push,1)
270typedef struct {
271 union {
272 char short_name[8];
273 struct { uint32_t zeros; uint32_t offset; } lng;
274 }name;
281#pragma pack(pop)
282
283/*
284* AuGetProcAddress -- get procedure address in a dll image
285* @param image -- dll image
286* @param procname -- procedure name
287*/
288extern void* AuGetProcAddress(void *image, const char* procname);
289
290/*
291* AuKernelLinkDLL -- Links a dll library to kernel symbols
292* @param image -- dll image
293*/
294extern void AuKernelLinkDLL(void* image);
295
296/*
297* AuPEPrintExports -- get procedure address in a dll image
298* @param image -- dll image
299*/
300extern void AuPEPrintExports(void *image);
301
302/*
303* AuKernelLinkImports -- Links kernel imports to dll
304* @param image -- dll image
305*/
306extern void AuKernelLinkImports(void* image);
307
308/*
309* AuKernelRelocatePE -- relocates the image from its actual
310* base address
311* @param image -- pointer to executable image
312* @param nt -- nt headers
313* @param diff -- difference from its original
314*/
315extern void AuKernelRelocatePE(void* image, PIMAGE_NT_HEADERS nt, int diff);
316
317/*
318* AuPEFileIsDynamicallyLinked -- checks if the current
319* binary image is dynamically linked
320* @param image -- pointer to image address
321*/
322extern bool AuPEFileIsDynamicallyLinked(void* image);
323
330extern bool AuCoffResolveAddress(uint8_t* imageBase, uint64_t paddr);
331#endif
struct _IMAGE_RELOCATION_ENTRY_ IMAGE_RELOCATION_ENTRY
bool AuCoffResolveAddress(uint8_t *imageBase, uint64_t paddr)
AuCoffResolveAddress – print the symbol function name for specific pointing address.
Definition pe.c:329
void AuPEPrintExports(void *image)
AuPEPrintExports – print all function exports for DEBUG purpose.
Definition pe.cpp:72
bool AuPEFileIsDynamicallyLinked(void *image)
AuPEFileIsDynamicallyLinked – checks if the current binary image is dynamically linked.
Definition pe.cpp:244
struct _IMAGE_FILE_HEADER_ * PIMAGE_FILE_HEADER
PeMachineType
Definition pe.h:68
@ IMAGE_FILE_MACHINE_THUMB
Definition pe.h:73
@ IMAGE_FILE_MACHINE_ARM
Definition pe.h:70
@ IMAGE_FILE_MACHINE_EBC
Definition pe.h:71
@ IMAGE_FILE_MACHINE_AMD64
Definition pe.h:69
@ IMAGE_FILE_MACHINE_I386
Definition pe.h:72
@ IMAGE_FILE_MACHINE_ARM64
Definition pe.h:74
@ IMAGE_FILE_MACHINE_ARMNT
Definition pe.h:75
struct _IMAGE_IMPORT_HINT_TABLE * PIMAGE_IMPORT_HINT_TABLE
unsigned long long * PIMAGE_IMPORT_LOOKUP_TABLE_PE32P
Definition pe.h:257
struct _IMAGE_DOS_HEADER_ IMAGE_DOS_HEADER
struct _IMAGE_OPTIONAL_HEADER_PE32PLUS IMAGE_OPTIONAL_HEADER_PE32PLUS
void AuKernelLinkDLL(void *image)
AuKernelLinkDLL – Links a dll library to kernel symbols.
Definition pe.cpp:96
struct _IMAGE_IMPORT_DIRECTORY * PIMAGE_IMPORT_DIRECTORY
struct _IMAGE_RELOCATION_BLOCK_ * PIMAGE_RELOCATION_BLOCK
IMAGE_IMPORT_LOOKUP_TABLE_PE32 * PIMAGE_IMPORT_LOOKUP_TABLE
Definition pe.h:262
struct _IMAGE_DATA_DIRECTORY_ IMAGE_DATA_DIRECTORY
struct _IMAGE_OPTIONAL_HEADER_PE32PLUS * PIMAGE_OPTIONAL_HEADER_PE32PLUS
uint32_t * PIMAGE_IMPORT_LOOKUP_TABLE_PE32
Definition pe.h:254
struct _IMAGE_NT_HEADERS_PE32PLUS * PIMAGE_NT_HEADERS
Definition pe.h:261
struct _IMAGE_NT_HEADERS_PE32_ * PIMAGE_NT_HEADERS_PE32
Definition pe.h:65
struct _IMAGE_OPTIONAL_HEADER_PE32_ * PIMAGE_OPTIONAL_HEADER_PE32
struct _IMAGE_SECTION_HEADER SECTION_HEADER
struct _IMAGE_EXPORT_DIRECTORY * PIMAGE_EXPORT_DIRECTORY
struct _IMAGE_RELOCATION_BLOCK_ IMAGE_RELOCATION_BLOCK
struct _IMAGE_SECTION_HEADER * PSECTION_HEADER
struct _IMAGE_OPTIONAL_HEADER_PE32_ IMAGE_OPTIONAL_HEADER_PE32
void AuKernelLinkImports(void *image)
Definition pe.cpp:125
void AuKernelRelocatePE(void *image, PIMAGE_NT_HEADERS nt, int diff)
AuKernelRelocatePE – relocates the image from its actual base address.
Definition pe.cpp:187
PeOptionalMagic
Definition pe.h:88
@ MAGIC_PE32P
Definition pe.h:90
@ MAGIC_PE32
Definition pe.h:89
struct _IMAGE_IMPORT_DIRECTORY IMAGE_IMPORT_DIRECTORY
struct _IMAGE_DOS_HEADER_ * PIMAGE_DOS_HEADER
struct _IMAGE_EXPORT_DIRECTORY IMAGE_EXPORT_DIRECTORY
IMAGE_IMPORT_LOOKUP_TABLE_PE32 IMAGE_IMPORT_LOOKUP_TABLE
Definition pe.h:262
struct _IMAGE_RELOCATION_ENTRY_ * PIMAGE_RELOCATION_ENTRY
struct _IMAGE_NT_HEADERS_PE32PLUS_ * PIMAGE_NT_HEADERS_PE32PLUS
Definition pe.h:66
struct _IMAGE_NT_HEADERS_PE32PLUS_ IMAGE_NT_HEADERS_PE32PLYS
Definition pe.h:66
unsigned long long IMAGE_IMPORT_LOOKUP_TABLE_PE32P
Definition pe.h:257
void * AuGetProcAddress(void *image, const char *procname)
AuGetProcAddress – get procedure address in a dll image.
Definition pe.cpp:41
struct _IMAGE_IMPORT_HINT_TABLE IMAGE_IMPORT_HINT_TABLE
struct _IMAGE_NT_HEADERS_PE32_ IMAGE_NT_HEADERS_PE32
Definition pe.h:65
struct _IMAGE_DATA_DIRECTORY_ * PIMAGE_DATA_DIRECTORY
struct _IMAGE_FILE_HEADER_ IMAGE_FILE_HEADER
uint32_t IMAGE_IMPORT_LOOKUP_TABLE_PE32
Definition pe.h:254
unsigned int uint32_t
Definition acefiex.h:163
short int int16_t
Definition acefiex.h:159
unsigned char uint8_t
Definition acefiex.h:161
COMPILER_DEPENDENT_UINT64 uint64_t
Definition acefiex.h:165
unsigned short int uint16_t
Definition acefiex.h:162
#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES
Definition pe_.h:94
Definition pe.h:270
int16_t section
Definition pe.h:276
uint32_t value
Definition pe.h:275
uint8_t storage
Definition pe.h:278
uint8_t aux_count
Definition pe.h:279
uint16_t type
Definition pe.h:277
Definition pe.h:93
uint32_t VirtualAddress
Definition pe.h:94
uint32_t Size
Definition pe.h:95
Definition pe.h:43
uint16_t e_sp
Definition pe.h:52
uint16_t e_cparhdr
Definition pe.h:48
uint16_t e_cs
Definition pe.h:55
uint16_t e_res[4]
Definition pe.h:58
uint16_t e_ovno
Definition pe.h:57
uint16_t e_ss
Definition pe.h:51
uint16_t e_oeminfo
Definition pe.h:60
uint16_t e_lfarlc
Definition pe.h:56
uint16_t e_cp
Definition pe.h:46
uint16_t e_minalloc
Definition pe.h:49
uint16_t e_crlc
Definition pe.h:47
uint16_t e_ip
Definition pe.h:54
uint16_t e_csum
Definition pe.h:53
uint16_t e_res2[10]
Definition pe.h:61
uint16_t e_lfanew
Definition pe.h:62
uint16_t e_oemid
Definition pe.h:59
uint16_t e_magic
Definition pe.h:44
uint16_t e_cblp
Definition pe.h:45
uint16_t e_maxalloc
Definition pe.h:50
Definition pe.h:211
uint32_t TimeDateStamp
Definition pe.h:213
uint32_t AddressOfNames
Definition pe.h:221
uint32_t NumberOfFunctions
Definition pe.h:218
uint32_t Base
Definition pe.h:217
uint32_t NumberOfNames
Definition pe.h:219
uint16_t MajorVersion
Definition pe.h:214
uint32_t Characteristics
Definition pe.h:212
uint32_t AddressOfFunctions
Definition pe.h:220
uint32_t AddressOfNameOrdinal
Definition pe.h:222
uint16_t MinorVersion
Definition pe.h:215
uint32_t Name
Definition pe.h:216
Definition pe.h:78
uint16_t Machine
Definition pe.h:79
uint32_t NumberOfSymbols
Definition pe.h:83
uint16_t Characteristics
Definition pe.h:85
uint32_t PointerToSymbolTable
Definition pe.h:82
uint16_t NumberOfSections
Definition pe.h:80
uint16_t SizeOfOptionaHeader
Definition pe.h:84
uint32_t TimeDateStamp
Definition pe.h:81
Definition pe.h:225
uint32_t Characteristics
Definition pe.h:227
uint32_t OriginalFirstThunk
Definition pe.h:228
uint32_t ThunkTableRva
Definition pe.h:233
uint32_t ForwarderChain
Definition pe.h:231
uint32_t TimeDateStamp
Definition pe.h:230
uint32_t NameRva
Definition pe.h:232
Definition pe.h:247
char name[2]
Definition pe.h:249
uint16_t Hint
Definition pe.h:248
Definition pe.h:174
IMAGE_OPTIONAL_HEADER_PE32PLUS OptionalHeader
Definition pe.h:177
uint32_t Signature
Definition pe.h:175
IMAGE_FILE_HEADER FileHeader
Definition pe.h:176
Definition pe.h:168
IMAGE_FILE_HEADER FileHeader
Definition pe.h:170
uint32_t Signature
Definition pe.h:169
IMAGE_OPTIONAL_HEADER_PE32 OptionalHeader
Definition pe.h:171
uint16_t MinorOperatingSystemVersion
Definition pe.h:148
uint32_t SectionAlignment
Definition pe.h:145
uint64_t SizeOfStackReserve
Definition pe.h:159
uint16_t DllCharacteristics
Definition pe.h:158
uint16_t MajorSubsystemVersion
Definition pe.h:151
uint32_t SizeOfInitializedData
Definition pe.h:140
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]
Definition pe.h:165
uint32_t SizeOfImage
Definition pe.h:154
uint32_t FileAlignment
Definition pe.h:146
uint16_t Subsystem
Definition pe.h:157
uint32_t Reserved1
Definition pe.h:153
uint32_t SizeOfUninitializedData
Definition pe.h:141
uint16_t MajorImageVersion
Definition pe.h:149
uint32_t NumberOfRvaAndSizes
Definition pe.h:164
uint64_t SizeOfStackCommit
Definition pe.h:160
uint16_t MajorOperatingSystemVersion
Definition pe.h:147
uint16_t MinorSubsystemVersion
Definition pe.h:152
uint64_t SizeOfHeapReserve
Definition pe.h:161
uint32_t LoaderFlags
Definition pe.h:163
uint64_t ImageBase
Definition pe.h:144
uint32_t BaseOfCode
Definition pe.h:143
uint16_t Magic
Definition pe.h:136
uint32_t SizeOfCode
Definition pe.h:139
uint64_t SizeOfHeapCommit
Definition pe.h:162
uint32_t AddressOfEntryPoint
Definition pe.h:142
uint16_t MinorImageVersion
Definition pe.h:150
uint8_t MinorLinkerVersion
Definition pe.h:138
uint8_t MajorLinkerVersion
Definition pe.h:137
uint32_t CheckSum
Definition pe.h:156
uint32_t SizeOfHeaders
Definition pe.h:155
Definition pe.h:100
uint8_t MinorLinkerVersion
Definition pe.h:103
uint16_t MajorOperatingSystemVersion
Definition pe.h:113
uint32_t SectionAlighnment
Definition pe.h:111
uint32_t Reserved1
Definition pe.h:119
uint32_t SizeOfUninitializedData
Definition pe.h:106
uint32_t SizeOfHeaders
Definition pe.h:121
uint16_t MajorImageVersion
Definition pe.h:115
uint16_t MinorOperatingSystemVersion
Definition pe.h:114
uint16_t DllCharacteristics
Definition pe.h:124
uint32_t SizeOfHeapReserve
Definition pe.h:127
uint32_t SizeOfImage
Definition pe.h:120
uint16_t MajorSubsystemVersion
Definition pe.h:117
uint32_t FileAlignment
Definition pe.h:112
uint32_t SizeOfStackCommit
Definition pe.h:126
uint32_t AddressOfEntryPoint
Definition pe.h:107
uint16_t MinorSubsystemVersion
Definition pe.h:118
uint16_t Magic
Definition pe.h:101
uint32_t BaseOfData
Definition pe.h:109
uint32_t SizeOfStackReserve
Definition pe.h:125
uint32_t SizeOfInitializedData
Definition pe.h:105
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]
Definition pe.h:131
uint32_t BaseOfCode
Definition pe.h:108
uint32_t SizeOfHeapCommit
Definition pe.h:128
uint16_t Subsystem
Definition pe.h:123
uint32_t ImageBase
Definition pe.h:110
uint32_t NumberOfRvaAndSizes
Definition pe.h:130
uint32_t CheckSum
Definition pe.h:122
uint32_t LoaderFlags
Definition pe.h:129
uint8_t MajorLinkerVersion
Definition pe.h:102
uint16_t MinorImageVersion
Definition pe.h:116
uint32_t SizeOfCode
Definition pe.h:104
Definition pe.h:241
IMAGE_RELOCATION_ENTRY entries[0]
Definition pe.h:244
uint32_t BlockSize
Definition pe.h:243
uint32_t PageRVA
Definition pe.h:242
Definition pe.h:236
uint16_t offset
Definition pe.h:237
uint16_t type
Definition pe.h:238
Definition pe.h:195
uint32_t SizeOfRawData
Definition pe.h:199
uint32_t PointerToLinenumbers
Definition pe.h:202
uint32_t PointerToRelocations
Definition pe.h:201
uint32_t PointerToRawData
Definition pe.h:200
uint32_t VirtualSize
Definition pe.h:197
uint32_t Characteristics
Definition pe.h:205
uint16_t NumberOfRelocations
Definition pe.h:203
uint32_t VirtualAddress
Definition pe.h:198
char Name[8]
Definition pe.h:196
uint16_t NumberOfLinenumbers
Definition pe.h:204