PE文件-PE文件格式

在研究之前首先拜读了来自网络的多篇文档,首先根据分析结果附图两张:

 

 

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

以下内容摘自网络:

PE 的意思就是 Portable Executable(可移植的执行体)。它是 Win32环境自身所带的执行体文件格式。它的一些特性继承自 UnixCoff (common object file format)文件格式。"portable executable"(可移植的执行体)意味着此文件格式是跨win32平台的 : 即使Windows运行在非IntelCPU上,任何win32平台的PE装载器都能识别和使用该文件格式。当然,移植到不同的CPUPE执行体必然得有一些改变。所有 win32执行体 (除了VxD16位的Dll)都使用PE文件格式,包括NT的内核模式驱动程序(kernel mode drivers)。因而研究PE文件格式给了我们洞悉Windows结构的良机。

本教程就让我们浏览一下 PE文件格式的概要。

DOS MZ header
DOS stub
PE header
Section table
Section 1
Section 2
Section ...
Section n

上图是 PE文件结构的总体层次分布。所有 PE文件(甚至32位的 DLLs) 必须以一个简单的 DOS MZ header 开始。我们通常对此结构没有太大兴趣。有了它,一旦程序在DOS下执行,DOS就能识别出这是有效的执行体,然后运行紧随 MZ header 之后的 DOS stubDOS stub实际上是个有效的 EXE,在不支持 PE文件格式的操作系统中,它将简单显示一个错误提示,类似于字符串 "This program requires Windows" 或者程序员可根据自己的意图实现完整的 DOS代码。通常我们也不对 DOS stub 太感兴趣: 因为大多数情况下它是由汇编器/编译器自动生成。通常,它简单调用中断21h服务9来显示字符串"This program cannot run in DOS mode"

紧接着 DOS stub 的是 PE headerPE header PE相关结构 IMAGE_NT_HEADERS 的简称,其中包含了许多PE装载器用到的重要域。当我们更加深入研究PE文件格式后,将对这些重要域耳目能详。执行体在支持PE文件结构的操作系统中执行时,PE装载器将从 DOS MZ header 中找到 PE header 的起始偏移量。因而跳过了 DOS stub 直接定位到真正的文件头 PE header

PE文件的真正内容划分成块,称之为sections(节)。每节是一块拥有共同属性的数据,比如代码/数据、读/写等。我们可以把PE文件想象成一逻辑磁盘,PE header 是磁盘的boot扇区,而sections就是各种文件,每种文件自然就有不同属性如只读、系统、隐藏、文档等等。 值得我们注意的是 ---- 节的划分是基于各组数据的共同属性: 而不是逻辑概念。重要的不是数据/代码是如何使用的,如果PE文件中的数据/代码拥有相同属性,它们就能被归入同一节中。不必关心节中类似于"data", "code"或其他的逻辑概念: 如果数据和代码拥有相同属性,它们就可以被归入同一个节中。(译者注:节名称仅仅是个区别不同节的符号而已,类似"data", "code"的命名只为了便于识别,惟有节的属性设置决定了节的特性和功能)如果某块数据想付为只读属性,就可以将该块数据放入置为只读的节中,当PE装载器映射节内容时,它会检查相关节属性并置对应内存块为指定属性。

如果我们将PE文件格式视为一逻辑磁盘,PE headerboot扇区而sections是各种文件,但我们仍缺乏足够信息来定位磁盘上的不同文件,譬如,什么是PE文件格式中等价于目录的东东?别急,那就是 PE header 接下来的数组结构 section table(节表)。 每个结构包含对应节的属性、文件偏移量、虚拟偏移量等。如果PE文件里有5个节,那么此结构数组内就有5个成员。因此,我们便可以把节表视为逻辑磁盘中的根目录,每个数组成员等价于根目录中目录项。

以上就是PE文件格式的物理分布,下面将总结一下装载一PE文件的主要步骤:

  1. PE文件被执行,PE装载器检查 DOS MZ header 里的 PE header 偏移量。如果找到,则跳转到 PE header
  2. PE装载器检查 PE header 的有效性。如果有效,就跳转到PE header的尾部。
  3. 紧跟 PE header 的是节表。PE装载器读取其中的节信息,并采用文件映射方法将这些节映射到内存,同时付上节表里指定的节属性。
  4. PE文件映射入内存后,PE装载器将处理PE文件中类似 import table(引入表)逻辑部分。

上述步骤是基于本人观察后的简述,显然还有一些不够精确的地方,但基本明晰了执行体被处理的过程。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

根据上文分析,我们可以通过OD来应证PE结构组成,我用OD来加载本机一个程序navicat.exe,观察PE Header:

以下是上图中提到的DOS MZ HEADER,真实类型是结构:IMAGE_DOS_HEADER

00400000    4D 5A       ASCII "MZ"           ; DOS EXE Signature
00400002    5000        DW 0050              ;  DOS_PartPag = 50 (80.)
00400004    0200        DW 0002              ;  DOS_PageCnt = 2
00400006    0000        DW 0000              ;  DOS_ReloCnt = 0
00400008    0400        DW 0004              ;  DOS_HdrSize = 4
0040000A    0F00        DW 000F              ;  DOS_MinMem = F (15.)
0040000C    FFFF        DW FFFF              ;  DOS_MaxMem = FFFF (65535.)
0040000E    0000        DW 0000              ;  DOS_ReloSS = 0
00400010    B800        DW 00B8              ;  DOS_ExeSP = B8
00400012    0000        DW 0000              ;  DOS_ChkSum = 0
00400014    0000        DW 0000              ;  DOS_ExeIP = 0
00400016    0000        DW 0000              ;  DOS_ReloCS = 0
00400018    4000        DW 0040              ;  DOS_TablOff = 40
0040001A    1A00        DW 001A              ;  DOS_Overlay = 1A
0040001C    00          DB 00
0040001D    00          DB 00
0040001E    00          DB 00
0040001F    00          DB 00
00400020    00          DB 00
00400021    00          DB 00
00400022    00          DB 00
00400023    00          DB 00
00400024    00          DB 00
00400025    00          DB 00
00400026    00          DB 00
00400027    00          DB 00
00400028    00          DB 00
00400029    00          DB 00
0040002A    00          DB 00
0040002B    00          DB 00
0040002C    00          DB 00
0040002D    00          DB 00
0040002E    00          DB 00
0040002F    00          DB 00
00400030    00          DB 00
00400031    00          DB 00
00400032    00          DB 00
00400033    00          DB 00
00400034    00          DB 00
00400035    00          DB 00
00400036    00          DB 00
00400037    00          DB 00
00400038    00          DB 00
00400039    00          DB 00
0040003A    00          DB 00
0040003B    00          DB 00
0040003C    00010000    DD 00000100          ; Offset to PE signature
以下是DOS STUB[我们似乎看不到什么数据]:
 
00400040    BA          DB BA
00400041    10          DB 10
00400042    00          DB 00
00400043    0E          DB 0E
00400044    1F          DB 1F
00400045    B4          DB B4
00400046    09          DB 09
00400047    CD          DB CD
00400048    21          DB 21
00400049    B8          DB B8
0040004A    01          DB 01
0040004B    4C          DB 4C
0040004C    CD          DB CD
0040004D    21          DB 21
0040004E    90          DB 90
0040004F    90          DB 90
00400050    54          DB 54
00400051    68          DB 68
00400052    69          DB 69
00400053    73          DB 73
00400054    20          DB 20
00400055    70          DB 70
00400056    72          DB 72
00400057    6F          DB 6F
00400058    67          DB 67
00400059    72          DB 72
0040005A    61          DB 61
0040005B    6D          DB 6D
0040005C    20          DB 20
0040005D    6D          DB 6D
0040005E    75          DB 75
0040005F    73          DB 73
00400060    74          DB 74
00400061    20          DB 20
00400062    62          DB 62
00400063    65          DB 65
00400064    20          DB 20
00400065    72          DB 72
00400066    75          DB 75
00400067    6E          DB 6E
00400068    20          DB 20
00400069    75          DB 75
0040006A    6E          DB 6E
0040006B    64          DB 64
0040006C    65          DB 65
0040006D    72          DB 72
0040006E    20          DB 20
0040006F    57          DB 57
00400070    69          DB 69
00400071    6E          DB 6E
00400072    33          DB 33
00400073    32          DB 32
00400074    0D          DB 0D
00400075    0A          DB 0A
00400076    24          DB 24
00400077    37          DB 37
00400078    00          DB 00
00400079    00          DB 00
0040007A    00          DB 00
0040007B    00          DB 00
0040007C    00          DB 00
0040007D    00          DB 00
0040007E    00          DB 00
0040007F    00          DB 00
00400080    00          DB 00
00400081    00          DB 00
00400082    00          DB 00
00400083    00          DB 00
00400084    00          DB 00
00400085    00          DB 00
00400086    00          DB 00
00400087    00          DB 00
00400088    00          DB 00
00400089    00          DB 00
0040008A    00          DB 00
0040008B    00          DB 00
0040008C    00          DB 00
0040008D    00          DB 00
0040008E    00          DB 00
0040008F    00          DB 00
00400090    00          DB 00
00400091    00          DB 00
00400092    00          DB 00
00400093    00          DB 00
00400094    00          DB 00
00400095    00          DB 00
00400096    00          DB 00
00400097    00          DB 00
00400098    00          DB 00
00400099    00          DB 00
0040009A    00          DB 00
0040009B    00          DB 00
0040009C    00          DB 00
0040009D    00          DB 00
0040009E    00          DB 00
0040009F    00          DB 00
004000A0    00          DB 00
004000A1    00          DB 00
004000A2    00          DB 00
004000A3    00          DB 00
004000A4    00          DB 00
004000A5    00          DB 00
004000A6    00          DB 00
004000A7    00          DB 00
004000A8    00          DB 00
004000A9    00          DB 00
004000AA    00          DB 00
004000AB    00          DB 00
004000AC    00          DB 00
004000AD    00          DB 00
004000AE    00          DB 00
004000AF    00          DB 00
004000B0    00          DB 00
004000B1    00          DB 00
004000B2    00          DB 00
004000B3    00          DB 00
004000B4    00          DB 00
004000B5    00          DB 00
004000B6    00          DB 00
004000B7    00          DB 00
004000B8    00          DB 00
004000B9    00          DB 00
004000BA    00          DB 00
004000BB    00          DB 00
004000BC    00          DB 00
004000BD    00          DB 00
004000BE    00          DB 00
004000BF    00          DB 00
004000C0    00          DB 00
004000C1    00          DB 00
004000C2    00          DB 00
004000C3    00          DB 00
004000C4    00          DB 00
004000C5    00          DB 00
004000C6    00          DB 00
004000C7    00          DB 00
004000C8    00          DB 00
004000C9    00          DB 00
004000CA    00          DB 00
004000CB    00          DB 00
004000CC    00          DB 00
004000CD    00          DB 00
004000CE    00          DB 00
004000CF    00          DB 00
004000D0    00          DB 00
004000D1    00          DB 00
004000D2    00          DB 00
004000D3    00          DB 00
004000D4    00          DB 00
004000D5    00          DB 00
004000D6    00          DB 00
004000D7    00          DB 00
004000D8    00          DB 00
004000D9    00          DB 00
004000DA    00          DB 00
004000DB    00          DB 00
004000DC    00          DB 00
004000DD    00          DB 00
004000DE    00          DB 00
004000DF    00          DB 00
004000E0    00          DB 00
004000E1    00          DB 00
004000E2    00          DB 00
004000E3    00          DB 00
004000E4    00          DB 00
004000E5    00          DB 00
004000E6    00          DB 00
004000E7    00          DB 00
004000E8    00          DB 00
004000E9    00          DB 00
004000EA    00          DB 00
004000EB    00          DB 00
004000EC    00          DB 00
004000ED    00          DB 00
004000EE    00          DB 00
004000EF    00          DB 00
004000F0    00          DB 00
004000F1    00          DB 00
004000F2    00          DB 00
004000F3    00          DB 00
004000F4    00          DB 00
004000F5    00          DB 00
004000F6    00          DB 00
004000F7    00          DB 00
004000F8    00          DB 00
004000F9    00          DB 00
004000FA    00          DB 00
004000FB    00          DB 00
004000FC    00          DB 00
004000FD    00          DB 00
004000FE    00          DB 00
004000FF    00          DB 00

 把DOS STUB转换成ASCII再看:
00400040  ?.???L?悙This program mus
00400060  t be run under Win32..$7........
00400080  ................................
004000A0  ................................
004000C0  ................................
004000E0  ................................

以下是PE HEADER、PE OPTIONAL HEADER[包含DataDirectory]:

00400100    50 45 00 00>ASCII "PE"           ; PE signature (PE)
00400104    4C01        DW 014C              ; Machine = IMAGE_FILE_MACHINE_I386
00400106    0800        DW 0008              ;  NumberOfSections = 8
00400108    195E422A    DD 2A425E19          ;  TimeDateStamp = 2A425E19
0040010C    00000000    DD 00000000          ;  PointerToSymbolTable = 0
00400110    00000000    DD 00000000          ;  NumberOfSymbols = 0
00400114    E000        DW 00E0              ;  SizeOfOptionalHeader = E0 (224.)
00400116    8E81        DW 818E              ;  Characteristics = EXECUTABLE_IMAGE|32BIT_MACHINE|LINE_NUMS_STRIPPED|LOCAL_SYMS_STRIPPED|BYTES_REVERSED_LO|BYTES_REVERSED_HI
00400118    0B01        DW 010B              ; MagicNumber = PE32
0040011A    02          DB 02                ;  MajorLinkerVersion = 2
0040011B    19          DB 19                ;  MinorLinkerVersion = 19 (25.)
0040011C    001E6D00    DD 006D1E00          ;  SizeOfCode = 6D1E00 (7151104.)
00400120    00863100    DD 00318600          ;  SizeOfInitializedData = 318600 (3245568.)
00400124    00000000    DD 00000000          ;  SizeOfUninitializedData = 0
00400128    D42C6D00    DD 006D2CD4          ;  AddressOfEntryPoint = 6D2CD4
0040012C    00100000    DD 00001000          ;  BaseOfCode = 1000
00400130    00306D00    DD 006D3000          ;  BaseOfData = 6D3000
00400134    00004000    DD 00400000          ; ImageBase = 400000
00400138    00100000    DD 00001000          ;  SectionAlignment = 1000
0040013C    00020000    DD 00000200          ;  FileAlignment = 200
00400140    0400        DW 0004              ;  MajorOSVersion = 4
00400142    0000        DW 0000              ;  MinorOSVersion = 0
00400144    0000        DW 0000              ;  MajorImageVersion = 0
00400146    0000        DW 0000              ;  MinorImageVersion = 0
00400148    0400        DW 0004              ;  MajorSubsystemVersion = 4
0040014A    0000        DW 0000              ;  MinorSubsystemVersion = 0
0040014C    00000000    DD 00000000          ;  Reserved
00400150    00809F00    DD 009F8000          ;  SizeOfImage = 9F8000 (10452992.)
00400154    00040000    DD 00000400          ;  SizeOfHeaders = 400 (1024.)
00400158    00000000    DD 00000000          ;  CheckSum = 0
0040015C    0200        DW 0002              ;  Subsystem = IMAGE_SUBSYSTEM_WINDOWS_GUI
0040015E    0000        DW 0000              ;  DLLCharacteristics = 0
00400160    00001000    DD 00100000          ;  SizeOfStackReserve = 100000 (1048576.)
00400164    00400000    DD 00004000          ;  SizeOfStackCommit = 4000 (16384.)
00400168    00001000    DD 00100000          ;  SizeOfHeapReserve = 100000 (1048576.)
0040016C    00100000    DD 00001000          ;  SizeOfHeapCommit = 1000 (4096.)
00400170    00000000    DD 00000000          ;  LoaderFlags = 0
00400174    10000000    DD 00000010          ;  NumberOfRvaAndSizes = 10 (16.)
00400178    00000000    DD 00000000          ;  Export Table address = 0
0040017C    00000000    DD 00000000          ;  Export Table size = 0
00400180    00506F00    DD 006F5000          ;  Import Table address = 6F5000
00400184    2A3F0000    DD 00003F2A          ;  Import Table size = 3F2A (16170.)
00400188    00A07700    DD 0077A000          ;  Resource Table address = 77A000
0040018C    00E02700    DD 0027E000          ;  Resource Table size = 27E000 (2613248.)
00400190    00000000    DD 00000000          ;  Exception Table address = 0
00400194    00000000    DD 00000000          ;  Exception Table size = 0
00400198    00000000    DD 00000000          ;  Certificate File pointer = 0
0040019C    00000000    DD 00000000          ;  Certificate Table size = 0
004001A0    00B06F00    DD 006FB000          ;  Relocation Table address = 6FB000
004001A4    0CEC0700    DD 0007EC0C          ;  Relocation Table size = 7EC0C (519180.)
004001A8    00000000    DD 00000000          ;  Debug Data address = 0
004001AC    00000000    DD 00000000          ;  Debug Data size = 0
004001B0    00000000    DD 00000000          ;  Architecture Data address = 0
004001B4    00000000    DD 00000000          ;  Architecture Data size = 0
004001B8    00000000    DD 00000000          ;  Global Ptr address = 0
004001BC    00000000    DD 00000000          ;  Must be 0
004001C0    00A06F00    DD 006FA000          ;  TLS Table address = 6FA000
004001C4    18000000    DD 00000018          ;  TLS Table size = 18 (24.)
004001C8    00000000    DD 00000000          ;  Load Config Table address = 0
004001CC    00000000    DD 00000000          ;  Load Config Table size = 0
004001D0    00000000    DD 00000000          ;  Bound Import Table address = 0
004001D4    00000000    DD 00000000          ;  Bound Import Table size = 0
004001D8    00000000    DD 00000000          ;  Import Address Table address = 0
004001DC    00000000    DD 00000000          ;  Import Address Table size = 0
004001E0    00000000    DD 00000000          ;  Delay Import Descriptor address = 0
004001E4    00000000    DD 00000000          ;  Delay Import Descriptor size = 0
004001E8    00000000    DD 00000000          ;  COM+ Runtime Header address = 0
004001EC    00000000    DD 00000000          ;  Import Address Table size = 0
004001F0    00000000    DD 00000000          ;  Reserved
004001F4    00000000    DD 00000000          ;  Reserved
 PE HEADER、PE OPTIONAL HEADER都属于IMAGE_NT_HEADERS结构的成员:
typedef struct _IMAGE_NT_HEADERS {
    DWORD Signature;
    IMAGE_FILE_HEADER FileHeader;
    IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

IMAGE_FILE_HEADER结构定义如下:
typedef struct _IMAGE_FILE_HEADER {
    WORD    Machine;
    WORD    NumberOfSections;
    DWORD   TimeDateStamp;
    DWORD   PointerToSymbolTable;
    DWORD   NumberOfSymbols;
    WORD    SizeOfOptionalHeader;
    WORD    Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
 
IMAGE_OPTIONAL_HEADER32 结构定义如下:
typedef struct _IMAGE_OPTIONAL_HEADER {
    //
    // Standard fields.
    //

    WORD    Magic;
    BYTE    MajorLinkerVersion;
    BYTE    MinorLinkerVersion;
    DWORD   SizeOfCode;
    DWORD   SizeOfInitializedData;
    DWORD   SizeOfUninitializedData;
    DWORD   AddressOfEntryPoint;
    DWORD   BaseOfCode;
    DWORD   BaseOfData;

    //
    // NT additional fields.
    //

    DWORD   ImageBase;
    DWORD   SectionAlignment;
    DWORD   FileAlignment;
    WORD    MajorOperatingSystemVersion;
    WORD    MinorOperatingSystemVersion;
    WORD    MajorImageVersion;
    WORD    MinorImageVersion;
    WORD    MajorSubsystemVersion;
    WORD    MinorSubsystemVersion;
    DWORD   Win32VersionValue;
    DWORD   SizeOfImage;
    DWORD   SizeOfHeaders;
    DWORD   CheckSum;
    WORD    Subsystem;
    WORD    DllCharacteristics;
    DWORD   SizeOfStackReserve;
    DWORD   SizeOfStackCommit;
    DWORD   SizeOfHeapReserve;
    DWORD   SizeOfHeapCommit;
    DWORD   LoaderFlags;
    DWORD   NumberOfRvaAndSizes;
    IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
我们可以看出IMAGE_OPTIONAL_HEADER的最后一个成员就是一个DataDirectory结构的数组
 
以下是节表数据:
004001F8    43 4F 44 45>ASCII "CODE"         ; SECTION
00400200    FC1D6D00    DD 006D1DFC          ;  VirtualSize = 6D1DFC (7151100.)
00400204    00100000    DD 00001000          ;  VirtualAddress = 1000
00400208    001E6D00    DD 006D1E00          ;  SizeOfRawData = 6D1E00 (7151104.)
0040020C    00040000    DD 00000400          ;  PointerToRawData = 400
00400210    00000000    DD 00000000          ;  PointerToRelocations = 0
00400214    00000000    DD 00000000          ;  PointerToLineNumbers = 0
00400218    0000        DW 0000              ;  NumberOfRelocations = 0
0040021A    0000        DW 0000              ;  NumberOfLineNumbers = 0
0040021C    20000060    DD 60000020          ;  Characteristics = CODE|EXECUTE|READ
00400220    44 41 54 41>ASCII "DATA"         ; SECTION
00400228    84740100    DD 00017484          ;  VirtualSize = 17484 (95364.)
0040022C    00306D00    DD 006D3000          ;  VirtualAddress = 6D3000
00400230    00760100    DD 00017600          ;  SizeOfRawData = 17600 (95744.)
00400234    00226D00    DD 006D2200          ;  PointerToRawData = 6D2200
00400238    00000000    DD 00000000          ;  PointerToRelocations = 0
0040023C    00000000    DD 00000000          ;  PointerToLineNumbers = 0
00400240    0000        DW 0000              ;  NumberOfRelocations = 0
00400242    0000        DW 0000              ;  NumberOfLineNumbers = 0
00400244    400000C0    DD C0000040          ;  Characteristics = INITIALIZED_DATA|READ|WRITE
00400248    42 53 53 00>ASCII "BSS"          ; SECTION
00400250    F9930000    DD 000093F9          ;  VirtualSize = 93F9 (37881.)
00400254    00B06E00    DD 006EB000          ;  VirtualAddress = 6EB000
00400258    00000000    DD 00000000          ;  SizeOfRawData = 0
0040025C    00000000    DD 00000000          ;  PointerToRawData = 0
00400260    00000000    DD 00000000          ;  PointerToRelocations = 0
00400264    00000000    DD 00000000          ;  PointerToLineNumbers = 0
00400268    0000        DW 0000              ;  NumberOfRelocations = 0
0040026A    0000        DW 0000              ;  NumberOfLineNumbers = 0
0040026C    000000C0    DD C0000000          ;  Characteristics = READ|WRITE
00400270    2E 69 64 61>ASCII ".idata"       ; SECTION
00400278    2A3F0000    DD 00003F2A          ;  VirtualSize = 3F2A (16170.)
0040027C    00506F00    DD 006F5000          ;  VirtualAddress = 6F5000
00400280    00400000    DD 00004000          ;  SizeOfRawData = 4000 (16384.)
00400284    00986E00    DD 006E9800          ;  PointerToRawData = 6E9800
00400288    00000000    DD 00000000          ;  PointerToRelocations = 0
0040028C    00000000    DD 00000000          ;  PointerToLineNumbers = 0
00400290    0000        DW 0000              ;  NumberOfRelocations = 0
00400292    0000        DW 0000              ;  NumberOfLineNumbers = 0
00400294    400000C0    DD C0000040          ;  Characteristics = INITIALIZED_DATA|READ|WRITE
00400298    2E 74 6C 73>ASCII ".tls"         ; SECTION
004002A0    54000000    DD 00000054          ;  VirtualSize = 54 (84.)
004002A4    00906F00    DD 006F9000          ;  VirtualAddress = 6F9000
004002A8    00000000    DD 00000000          ;  SizeOfRawData = 0
004002AC    00000000    DD 00000000          ;  PointerToRawData = 0
004002B0    00000000    DD 00000000          ;  PointerToRelocations = 0
004002B4    00000000    DD 00000000          ;  PointerToLineNumbers = 0
004002B8    0000        DW 0000              ;  NumberOfRelocations = 0
004002BA    0000        DW 0000              ;  NumberOfLineNumbers = 0
004002BC    000000C0    DD C0000000          ;  Characteristics = READ|WRITE
004002C0    2E 72 64 61>ASCII ".rdata"       ; SECTION
004002C8    18000000    DD 00000018          ;  VirtualSize = 18 (24.)
004002CC    00A06F00    DD 006FA000          ;  VirtualAddress = 6FA000
004002D0    00020000    DD 00000200          ;  SizeOfRawData = 200 (512.)
004002D4    00D86E00    DD 006ED800          ;  PointerToRawData = 6ED800
004002D8    00000000    DD 00000000          ;  PointerToRelocations = 0
004002DC    00000000    DD 00000000          ;  PointerToLineNumbers = 0
004002E0    0000        DW 0000              ;  NumberOfRelocations = 0
004002E2    0000        DW 0000              ;  NumberOfLineNumbers = 0
004002E4    40000050    DD 50000040          ;  Characteristics = INITIALIZED_DATA|SHARED|READ
004002E8    2E 72 65 6C>ASCII ".reloc"       ; SECTION
004002F0    0CEC0700    DD 0007EC0C          ;  VirtualSize = 7EC0C (519180.)
004002F4    00B06F00    DD 006FB000          ;  VirtualAddress = 6FB000
004002F8    00EE0700    DD 0007EE00          ;  SizeOfRawData = 7EE00 (519680.)
004002FC    00DA6E00    DD 006EDA00          ;  PointerToRawData = 6EDA00
00400300    00000000    DD 00000000          ;  PointerToRelocations = 0
00400304    00000000    DD 00000000          ;  PointerToLineNumbers = 0
00400308    0000        DW 0000              ;  NumberOfRelocations = 0
0040030A    0000        DW 0000              ;  NumberOfLineNumbers = 0
0040030C    40000050    DD 50000040          ;  Characteristics = INITIALIZED_DATA|SHARED|READ
00400310    2E 72 73 72>ASCII ".rsrc"        ; SECTION
00400318    00E02700    DD 0027E000          ;  VirtualSize = 27E000 (2613248.)
0040031C    00A07700    DD 0077A000          ;  VirtualAddress = 77A000
00400320    00E02700    DD 0027E000          ;  SizeOfRawData = 27E000 (2613248.)
00400324    00C87600    DD 0076C800          ;  PointerToRawData = 76C800
00400328    00000000    DD 00000000          ;  PointerToRelocations = 0
0040032C    00000000    DD 00000000          ;  PointerToLineNumbers = 0
00400330    0000        DW 0000              ;  NumberOfRelocations = 0
00400332    0000        DW 0000              ;  NumberOfLineNumbers = 0
00400334    40000050    DD 50000040          ;  Characteristics = INITIALIZED_DATA|SHARED|READ
00400338    00          DB 00
00400339    00          DB 00
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值