⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pe.h

📁 机器码指令格式
💻 H
字号:
#ifndef PE_H
#define PE_H

#include <stdio.h>
#include <time.h>

#define IMAGE_DOS_SIGNATURE	0x5A4D		/* "MZ" */
#define IMAGE_NT_SIGNATURE	0x00004550  /* "PE\0\0" */

/* CPU Indentifers */

#define IMAGE_FILE_MACHINE_UNKNOWN		0
#define	IMAGE_FILE_MACHINE_I386			0x014C	/* Intel 386 */
#define IMAGE_FILE_MACHINE_R3000		0x0162	/* MIPS little-endian */
#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_POWERPC      0x01F0  /* IBM PowerPC Little-Endian */
#define IMAGE_FILE_MACHINE_SH3          0x01a2  /* SH3 little-endian */
#define IMAGE_FILE_MACHINE_SH3E         0x01a4  /* SH3E little-endian */
#define IMAGE_FILE_MACHINE_SH4          0x01a6  /* SH4 little-endian */
#define IMAGE_FILE_MACHINE_ARM          0x01c0  /* ARM Little-Endian */
#define IMAGE_FILE_MACHINE_THUMB        0x01c2	/* */
#define IMAGE_FILE_MACHINE_IA64         0x0200  /* Intel 64 */
#define IMAGE_FILE_MACHINE_MIPS16       0x0266  /* MIPS */
#define IMAGE_FILE_MACHINE_MIPSFPU      0x0366  /* MIPS */
#define IMAGE_FILE_MACHINE_MIPSFPU16    0x0466  /* MIPS */
#define IMAGE_FILE_MACHINE_ALPHA64      0x0284  /* ALPHA64 */
#define IMAGE_FILE_MACHINE_AXP64        IMAGE_FILE_MACHINE_ALPHA64

/* File Header Characteristics */

#define IMAGE_FILE_RELOCS_STRIPPED		0x0001	/* If set then this image must be loaded to the image base */
#define IMAGE_FILE_EXECUTABLE_IMAGE		0x0002 	/* A executable exe file */
#define IMAGE_FILE_LINE_NUMS_STRIPPED	0x0004	/* COFF line number has been removed */
#define IMAGE_FILE_LOCAL_SYMS_STRIPPED	0x0008	/* Local symbols has been removed in COFF symbol table */
#define IMAGE_FILE_AGGRESSIVE_WS_TRIM	0x0010	/* obsolete */
#define IMAGE_FILE_LARGE_ADDRESS_AWARE	0x0020	/* Address > 2GB can be manipulated */
#define IMAGE_FILE_RESERVED				0x0040	/* Reserved */
#define IMAGE_FILE_BYTES_REVERSED_LO	0x0080	/* Little-Endian obsolete */
#define IMAGE_FILE_32BIT_MACHINE		0x0100	/* 32 bits system */
#define IMAGE_FILE_DEBUG_STRIPPED		0x0200	/* DEBUG Information has been removed */
#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 0x400 /* If this Image on a removable median then load and copy */
#define IMAGE_FILE_NET_RUN_FROM_SWAP	0x0800	/* If this image on network then load and copy to swap file */
#define IMAGE_FILE_SYSTEM				0x1000	/* This image is a system rather than a user file */
#define IMAGE_FILE_DLL					0x2000	/* A Dll rahter than Exe File */
#define IMAGE_FILE_UP_SYSTEM_ONLY		0x4000	/* Single CPU Only */
#define IMAGE_FILE_BYTES_REVERSED_HI	0x8000	/* Big-Endian */

/* Optional Header Magic Number */

#define IMAGE_NT_OPTIONAL_HDR32_MAGIC	0x10B	/* Normal Executable Image */
#define IMAGE_NT_OPTIONAL_HDR64_MAGIC 	0x20B	/* PE32+ Image */
#define IMAGE_ROM_OPTIONAL_HDR_MAGIC	0x107	/* A ROM Image */

/* Sub System */

#define IMAGE_SUBSYSTEM_UNKNOWN			0		/* Unknown subsystem */
#define IMAGE_SUBSYSTEM_NATIVE			1		/* Image doesn't require a subsystem */
#define IMAGE_SUBSYSTEM_WINDOWS_GUI		2		/* Image runs in the Windows GUI subsystem */
#define IMAGE_SUBSYSTEM_WINDOWS_CUI		3		/* Image runs in the Windows character subsystem */
#define IMAGE_SUBSYSTEM_OS2_CUI			5		/* Image runs in the OS/2 character subsystem */
#define IMAGE_SUBSYSTEM_POSIX_CUI		7		/* Image runs in the Posix character subsystem */
#define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI	9		/* Image runs in the Windows CE subsystem */
#define IMAGE_SUBSYSTEM_EFI_APPLICATION 10		/* EFI Application */
#define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 11 /* Bootable EFI Driver */
#define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 12	/* Runtime EFI Driver */
#define IMAGE_SUBSYSTEM_EFI_ROM			13		/* EFI ROM */
#define IMAGE_SUBSYSTEM_XBOX			14		/* XBOX */

/* Dll Characteristics Entries */

#define IMAGE_DLLCHARACTERISTICS_RESERVE1		 0x0001	/* Reserved1 */
#define IMAGE_DLLCHARACTERISTICS_RESERVE2		 0x0002 /* Reserved2 */
#define IMAGE_DLLCHARACTERISTICS_RESERVE3		 0x0004	/* Reserved3 */
#define IMAGE_DLLCHARACTERISTICS_RESERVE4		 0x0008	/* Reserved4 */
#define IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE	 0x0040	/* Dll Can be Relocated */
#define IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY 0x0080 /* Code Integrity Check */
#define IMAGE_DLLCHARACTERISTICS_NX_COMPAT		 0x0100 /* Image campatable with NX */
#define IMAGE_DLLCHARACTERISTICS_NO_ISOLATION	 0x0200 /* Can be Isolated */
#define IMAGE_DLLCHARACTERISTICS_NO_SEH			 0x0400 /* Can't Use SEH */
#define IMAGE_DLLCHARACTERISTICS_NO_BIND		 0x0800 /* No Binding */
#define IMAGE_DLLCHARACTERISTICS_RESERVE5		 0x1000 /* Reserved 5 Must be Zero */
#define IMAGE_DLLCHARACTERISTICS_WDM_DRIVER		 0x2000 /* WDM Driver */
#define IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE 0x8000 /* Can be used on Termial server */

/* Data Directory Entries */

#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES	16		/* Number of Directory Entries */

#define IMAGE_DIRECTORY_ENTRY_EXPORT			0		/* Export Directory */
#define IMAGE_DIRECTORY_ENTRY_IMPORT			1		/* Import Directory */
#define IMAGE_DIRECTORY_ENTRY_RESOURCE			2		/* Resource Directory */
#define IMAGE_DIRECTORY_ENTRY_EXCEPTION			3		/* Exception Directory */
#define IMAGE_DIRECTORY_ENTRY_CERTIFICATE		4		/* Certificate, FilePtr not RAV */
#define IMAGE_DIRECTORY_ENTRY_BASE_RELOCATION	5		/* Base Relocation Directory */
#define IMAGE_DIRECTORY_ENTRY_DEBUG				6		/* Debug Directory */
#define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE		7		/* Architecture must be zero */
#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR			8		/* RAV of Global Prt Must be Zero */
#define IMAGE_DIRECTORY_ENTRY_TLS				9 		/* TLS Table of Line Thread table */
#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG		10		/* Load Config Directory */
#define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT		11		/* Bound Import Directory */
#define IMAGE_DIRECTORY_ENTRY_IAT				12		/* Import Address Diretory */
#define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT		13		/* Delay Import Directory */
#define IMAGE_DIRECTORY_ENTRY_CLR_RUNTIME		14		/* CLR Runtime Directory */
#define IMAGE_DIRECTORY_ENTRY_RESERVE			15		/* Reserved Must be Zero */

/* Section Header */

#define IMAGE_SIZEOF_SHORT_NAME					8		/* Section Name Size */

typedef char BYTE;
typedef unsigned int DWORD;
typedef unsigned short WORD;
typedef unsigned long LONG;

typedef struct _IMAGE_DOS_HEADER
{
	WORD	MagicNumber;			/* Magic Number must be "MZ" */
	WORD	BytesLPF;				/* Byte on last page of file */
	WORD	Pages;					/* Pages in file */
	WORD	Relocations;			/* Relocations */
	WORD	HeaderSize;				/* Size of header in paragraphs */
	WORD	MinParagraphs;			/* Minimum extra paragraphs needed */
	WORD	MaxParagraphs;			/* Maximum extra paragraphs needed */
	WORD	RegisterSS;				/* Initial (relative) SS value */
	WORD 	RegisterSP;				/* Initial SP value */
	WORD	Checksum;				/* CheckSum */
	WORD	RegisterIP;				/* Initial IP value */
	WORD	RegisterCS;				/* Initial (relative) CS value */
	WORD	RelocationTable;		/* File address of relocation table */
	WORD	OverlayNumber;			/* Overlay Number */
	WORD	Reserved[4];			/* Reserved words */
	WORD	OEMIdentifier;			/* OEM indentifier */
	WORD	OEMInformation;			/* OEM information */
	WORD	Reserved2[10];			/* Reserved words */
	WORD	PEHeader;				/* File Address of new exe header */
}	IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

typedef struct _IMAGE_FILE_HEADER
{
	WORD	Machine;				/* CPU Indentifer */
	WORD	NumberOfSections;		/* Number of sections */
	DWORD	TimeDateStamp;			/* Time linker create this file */
	DWORD	PointerToSymbolTable;	/* Pointer to Symbol Table */
	DWORD	NumberOfSymbols;		/* Number of Symbols */
	WORD	SizeOfOptionalHeader; 	/* Size of Optional Header */
	WORD	Characteristics;		/* Some Important characteristics */
}	IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

typedef struct _IMAGE_DATA_DIRECTORY
{
	DWORD	VirtualAddress;				/* RAV To the ImageBase */
	WORD	Size;						/* Table Size bytes */
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRCETORY;

typedef struct _IMAGE_OPTIONAL_HEADER
{
	WORD	Magic;						/* State of the image */
	BYTE	MajorLinkerVersion;			/* Major linker version */
	BYTE	MinorLinkerVersion;			/* Minor linker version */
	DWORD	SizeOfCode;					/* Size of code sections */
	DWORD	SizeOfInitializedData;		/* Size of initialized data */
	DWORD	SizeOfUninitializedData;	/* Uninitialized data size */
	DWORD	AddressOfEntryPoint;		/* RVA image execute from */
	DWORD	BaseOfCode;					/* RVA of code section */
	DWORD	BaseOfData;					/* RVA of data section */
	DWORD	ImageBase;					/* where image assumed to be loaded */
	DWORD	SectionAlignment;			/* Alignment of image in RAM */
	DWORD	FileAlignment;				/* Alignmnet of image in FILE */
	WORD	MajorOSVersion;				/* Major version of OS */
	WORD	MinorOSVersion;				/* Minor version of OS */
	WORD	MajorImageVersion;			/* Major version of Image */
	WORD	MinorImageVersion;			/* Minor version of Image */
	WORD	MajorSubsystemVersion;		/* Major version of Subsystem */
	WORD	MinorSubsystemVersion;		/* Minor version of Subsystem */
	DWORD	Reserved;					/* Reserved */
	DWORD	SizeOfImage;				/* Size of image form Imagebase */
	DWORD	SizeOfHeaders;				/* Size of PE Header and section tables */
	DWORD	CheckSum;					/* CRC checksum */
	WORD	Subsystem;					/* Which subsystem needed */
	WORD	DllCharacteristics;			/* When DllMain to be called */
	DWORD	SizeOfStackReserve;			/* Not all will be committed */
	DWORD	SizeOfStackCommit;			/* Statck committed */
	DWORD	SizeOfHeapReserve;			/* Not all will be committed */
	DWORD	SizeOfHeapCommit;			/* Heap committed */
	DWORD	LoaderFlags;				/* Debuging associated */
	DWORD	NumberOfRvaAndSizes;		/* Number of data directories */
	
	/* Data Directory Entries */
	
	IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; 
										
} IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;

typedef struct _IMAGE_NT_HEADERS
{
	DWORD	PESignature;					/* "PE\0\0" signature */
	IMAGE_FILE_HEADER FileHeader;			/* File Header */
	IMAGE_OPTIONAL_HEADER OptionalHeader;	/* Optional Header */
} IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;

typedef struct _IMAGE_SECTION_HEADER
{
	BYTE	Name[IMAGE_SIZEOF_SHORT_NAME];	
	union	_MISC_ADDRESS_SIZE
	{	
		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;

typedef struct _IMAGE_IMPORT_DISCRIPTOR
{
	union _IMPORT_RVA_CHARACTORISTISC
	{
		DWORD	Characteristics;
		DWORD	OriginalFirstThunk;
	} ImportRVACharacteristics;
	DWORD	TimeDateStamp;
	DWORD	ForwarderChain;
	DWORD	Name;
	DWORD	FirstThunk;
} IMAGE_IMPORT_DISCRIPTOR, *PIMAGE_IMPORT_DISCRIPTOR;

typedef struct _IMAGE_THUNK_DATA
{
	union _INDEX_NANE
	{
		DWORD	Ordinal;
		DWORD	NameTable;
	} OrdinalName;
} IMAGE_THUNK_DATA, *PIMAGE_THUNK_DATA;

typedef struct _IMAGE_IMPRT_BY_NAME
{
	WORD	Hint;
	BYTE	Name;
} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;

typedef struct _IMAGE_EXPORT_DISCRIPTOR
{
	DWORD	Characteristics;		/* Always Zero */
	DWORD	TimeDateStamp;			/* Time When Export Table Created */
	WORD	MajorVersion;			/* Export Table Version 0*/
	WORD	MinorVersion;			/* Export Table Version 0*/
	DWORD	Name;					/* Dll Name RVA */
	DWORD	Base;					/* Emport Index Begin Number */
	DWORD	NumberOfFunctions;		/* Number of Export Functions */
	DWORD	NumberOfNames;			/* Number of Export Functions By Name */
	DWORD	AddressOfFunctions;		/* Export Functions RVA Array */
	DWORD	AddressOfNames;			/* Export Functions Name RVA Array */
	DWORD	AddressOfNameOrdinals;	/* Index Of Name in Function RVA Array */
} IMAGE_EXPORT_DISCRIPTOR, *PIMAGE_EXPORT_DISCRIPTOR;

FILE 	*OpenPEFile(const char *fileName);
void	ClosePEFile(FILE *peFile);
void 	ReadDosHeader(FILE *peFile, PIMAGE_DOS_HEADER dosHeader);
void 	PrintDosHeader(IMAGE_DOS_HEADER dosHeader);
void	ReadFileHeader(FILE *peFile, PIMAGE_FILE_HEADER fileHeader, DWORD fileAddress);
void	PrintFileHeader(IMAGE_FILE_HEADER fileHeader);
void	ReadOptionalHeader(FILE *peFile, PIMAGE_OPTIONAL_HEADER optionalHeader, DWORD fileAddress);
void	PrintOptionalHeader(IMAGE_OPTIONAL_HEADER optionalHeader);
void 	ReadPEHeader(FILE *peFile, PIMAGE_NT_HEADERS peHeader, DWORD fileAddress);
void	PrintPEHeader(IMAGE_NT_HEADERS peHeader);
void 	ReadSectionTable(FILE *peFile, PIMAGE_SECTION_HEADER sectionTable, DWORD fileAddress, int sectionNumber);
void 	PrintSectionTable(PIMAGE_SECTION_HEADER sectionTable, int sectionNumber);
DWORD	RVAToFileOffset(DWORD RVA, PIMAGE_SECTION_HEADER sectionTable);
void	PrintImportTable(FILE *peFile, DWORD ImportRVA, PIMAGE_SECTION_HEADER sectionTable, PIMAGE_IMPORT_DISCRIPTOR importTable);
void	PrintExportTable(FILE *peFile, DWORD ExportRVA, PIMAGE_SECTION_HEADER sectionTable, PIMAGE_EXPORT_DISCRIPTOR exportTable);

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -