普通PE文件的基本格式整理

普通PE文件的基本格式

  我以notepad.exe为例子说明pe文件的基本格式,因为notepad.exe具有普通PE文件的基本格式。

以下是整个PE文件的全貌:

这里写图片描述

//@2015/10/22这样比较容易看明白!大家看上面的图就好,下面的我也不删了。
文件偏移文件
00000000DOS头
00000040DOS存根
000000e0NT头
000001d8节区头(“.text”)
00000200节区头(“.data”)
00000228节区头(“.rsrc”)
NULL
00000400节区(“.text”)
NULL
00007c00节区(“.data”)
NULL
00008400节区(“.rsrc”)
NULL
00010800

一、PE头

1.1、DOS头

地址HEX数据数据注释
010000004D 5AASCII “MZ”; DOS EXE Signature
010000029000DW 0090; DOS_PartPag = 90 (144.)
010000040300DW 0003; DOS_PageCnt = 0x3
010000060000DW 0000; DOS_ReloCnt = 0x0
010000080400DW 0004; DOS_HdrSize = 0x4
0100000A0000DW 0000; DOS_MinMem = 0x0
0100000CFFFFDW FFFF; DOS_MaxMem = FFFF (65535.)
0100000E0000DW 0000; DOS_ReloSS = 0x0
01000010B800DW 00B8; DOS_ExeSP = 0xB8
010000120000DW 0000; DOS_ChkSum = 0x0
010000140000DW 0000; DOS_ExeIP = 0x0
010000160000DW 0000; DOS_ReloCS = 0x0
010000184000DW 0040; DOS_TablOff = 0x40
0100001A0000DW 0000; DOS_Overlay = 0x0

1.2 DOS 存根

DOS存根是个可选项,且大小不固定,通常包含“this program connot be run in dos mode”这个句子。

1.3、NT头 (IMAGE_NT_HEADERS)

地址HEX数据数据注释
010000E050 45 00 00ASCII “PE” ;PE signature (PE)
010000E44C01DW 014C ;Machine = IMAGE_FILE_MACHINE_I386 每个cpu拥有唯一的machine码
010000E60300DW 0003 ;NumberOfSections = 0x3 文件中存在的节区的数量
010000E887520248DD 48025287 ;TimeDateStamp = 0x48025287
010000EC00000000DD 00000000 ;PointerToSymbolTable = 0x0
010000F000000000DD 00000000 ;NumberOfSymbols = 0x0
010000F4E000DW 00E0 ;SizeOfOptionalHeader = E0 (224.)
010000F60F01DW 010F ;Characteristics = EXECUTABLE_IMAGE

characteristics 这个字段用于标识文件的属性,文件是否是可运行的形态,是否为DLL文件等信息,其中IMAG_FILE_EXECUTABLE_IMAGE = 0x0002表示文件是可执行的,IMAGE_FILE_DLL = 0x2000 表示这个文件是DLL文件

1.4、NT头 (可选头)

IMAGE_OPTIONAL_HEADER32
结构体说明:
这里写图片描述
这里写图片描述

以下是我在OllyDbg中获取到的数据,对比学习

地址HEX数据数据注释
010000F80B01DW 010B ;MagicNumber = PE32
010000FA07DB 07 ;MajorLinkerVersion = 0x7
010000FB0ADB 0A ;MinorLinkerVersion = A (10.)
010000FC00780000DD 00007800 ;SizeOfCode = 7800 (30720.)
0100010000880000DD 00008800 ;SizeOfInitializedData = 8800 (34816.)
0100010400000000DD 00000000 ;SizeOfUninitializedData = 0x0
010001089D730000DD 0000739D ;AddressOfEntryPoint = 0x739D
0100010C00100000DD 00001000 ;BaseOfCode = 0x1000
0100011000900000DD 00009000 ;BaseOfData = 0x9000
0100011400000001DD 01000000 ;ImageBase = 0x1000000
0100011800100000DD 00001000 ;SectionAlignment = 0x1000
0100011C00020000DD 00000200 ;FileAlignment = 0x200
010001200500DW 0005 ;MajorOSVersion = 0x5
010001220100DW 0001 ;MinorOSVersion = 0x1
010001240500DW 0005 ;MajorImageVersion = 0x5
010001260100DW 0001 ;MinorImageVersion = 0x1
010001280400DW 0004 ;MajorSubsystemVersion = 0x4
0100012A0000DW 0000 ;MinorSubsystemVersion = 0x0
0100012C00000000DD 00000000 ;Reserved
0100013000300100DD 00013000 ;SizeOfImage = 13000 (77824.)
0100013400040000DD 00000400 ;SizeOfHeaders = 400 (1024.)
01000138DA8A0100DD 00018ADA ;CheckSum = 0x18ADA
0100013C0200DW 0002 ;Subsystem = IMAGE_SUBSYSTEM_WINDOWS_GUI
0100013E0080DW 8000 ;DLLCharacteristics = 0x8000
0100014000000400DD 00040000 ;SizeOfStackReserve = 40000 (262144.)
0100014400100100DD 00011000 ;SizeOfStackCommit = 11000 (69632.)
0100014800001000DD 00100000 ;SizeOfHeapReserve = 100000 (1048576.)
0100014C00100000DD 00001000 ;SizeOfHeapCommit = 1000 (4096.)
0100015000000000DD 00000000 ;LoaderFlags = 0x0
0100015410000000DD 00000010 ;NumberOfRvaAndSizes = 10 (16.)
0100015800000000DD 00000000 ;Export Table address = 0x0
0100015C00000000DD 00000000 ;Export Table size = 0x0
0100016004760000DD 00007604 ;Import Table address = 0x7604
01000164C8000000DD 000000C8 ;Import Table size = C8 (200.)
0100016800B00000DD 0000B000 ;Resource Table address = 0xB000
0100016C207F0000DD 00007F20 ;Resource Table size = 7F20 (32544.)
0100017000000000DD 00000000 ;Exception Table address = 0x0
0100017400000000DD 00000000 ;Exception Table size = 0x0
0100017800000000DD 00000000 ;Certificate File pointer = 0x0
0100017C00000000DD 00000000 ;Certificate Table size = 0x0
0100018000000000DD 00000000 ;Relocation Table address = 0x0
0100018400000000DD 00000000 ;Relocation Table size = 0x0
0100018850130000DD 00001350 ;Debug Data address = 0x1350
0100018C1C000000DD 0000001C ;Debug Data size = 1C (28.)
0100019000000000DD 00000000 ;Architecture Data address = 0x0
0100019400000000DD 00000000 ;Architecture Data size = 0x0
0100019800000000DD 00000000 ;Global Ptr address = 0x0
0100019C00000000DD 00000000 ;Must be 0
010001A000000000DD 00000000 ;TLS Table address = 0x0
010001A400000000DD 00000000 ;TLS Table size = 0x0
010001A8A8180000DD 000018A8 ;Load Config Table address = 0x18A8
010001AC40000000DD 00000040 ;Load Config Table size = 40 (64.)
010001B050020000DD 00000250 ;Bound Import Table address = 0x250
010001B4D0000000DD 000000D0 ;Bound Import Table size = D0 (208.)
010001B800100000DD 00001000 ;Import Address Table address = 0x1000
010001BC48030000DD 00000348 ;Import Address Table size = 348 (840.)
010001C000000000DD 00000000 ;Delay Import Descriptor address = 0x0
010001C400000000DD 00000000 ;Delay Import Descriptor size = 0x0
010001C800000000DD 00000000 ;COM+ Runtime Header address = 0x0
010001CC00000000DD 00000000 ;Import Address Table size = 0x0
010001D000000000DD 00000000 ;Reserved
010001D400000000DD 00000000 ;Reserved

1.4、节区头 是由IMAGE_SECTION_HEADER 结构体组成的数组

1.4.1 code字段

地址HEX数据数据注释
010001D82E 74 65 78ASCII “.text” ;SECTION
010001E048770000DD 00007748 ;VirtualSize(内存中中节区所占大小) =7748 (30536.)
010001E400100000DD 00001000 ;VirtualAddress(内存中节区起始地址=RVA) = 0x1000
010001E800780000DD 00007800 ;SizeOfRawData(磁盘文件中节区所占大小) = 7800 (30720.)
010001EC00040000DD 00000400 ;PointerToRawData(磁盘文件中节区其实地址) = 0x400
010001F000000000DD 00000000 ;PointerToRelocations = 0x0
010001F400000000DD 00000000 ;PointerToLineNumbers = 0x0
010001F80000DW 0000 ;NumberOfRelocations = 0x0
010001FA0000DW 0000 ;NumberOfLineNumbers = 0x0
010001FC20000060DD 60000020 ;Characteristics节区属性 = CODE &EXECUTE &READ
//这个Characteristics由下面的值组合而成
#define IMAGE_SCN_CNT_CODE   0x00000020  //section contains code
#define ...                  0x00000040  //section contains      initialized data
#define ...                  0x00000080  //section contains      uninitialized data
#define ...                  0x20000000  //section is executable
#define ...                  0x40000000  //section is readable
#define ...                  0x80000000  //section is writable

1.4.2 data字段

地址HEX数据数据注释
010002002E 64 61 74ASCII “.data” ;SECTION
01000208A81B0000DD 00001BA8 ;VirtualSize = 1BA8 (7080.)
0100020C00900000DD 00009000 ;VirtualAddress = 0x9000
0100021000080000DD 00000800 ;SizeOfRawData = 800 (2048.)
01000214007C0000DD 00007C00 ;PointerToRawData = 0x7C00
0100021800000000DD 00000000 ;PointerToRelocations = 0x0
0100021C00000000DD 00000000 ;PointerToLineNumbers = 0x0
010002200000DW 0000 ;NumberOfRelocations = 0x0
010002220000DW 0000 ;NumberOfLineNumbers = 0x0
01000224400000C0DD C0000040 ;Characteristics = INITIALIZED_DATA

1.4.3 source字段

地址HEX数据数据注释
010002282E 72 73 72ASCII “.rsrc” ;SECTION
01000230207F0000DD 00007F20 ;VirtualSize = 7F20 (32544.)
0100023400B00000DD 0000B000 ;VirtualAddress = 0xB000
0100023800800000DD 00008000 ;SizeOfRawData = 8000 (32768.)
0100023C00840000DD 00008400 ;PointerToRawData = 0x8400
0100024000000000DD 00000000 ;PointerToRelocations = 0x0
0100024400000000DD 00000000 ;PointerToLineNumbers = 0x0
010002480000DW 0000 ;NumberOfRelocations = 0x0
0100024A0000DW 0000 ;NumberOfLineNumbers = 0x0
0100024C40000040DD 40000040 ;Characteristics = INITIALIZED_DATA
01000250A2DB A2、、

RVA to RAW

RVA 是虚拟内存地址
RAW是文件偏移
RAW -PointerToRawData = RVA - VirtualAddress

RAW = RVA - VirtualAddress + PointerToRawData

RVA + ImageBase = VirtuelAddress

VA 是进程虚拟内存的绝对地址,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值