pe文件结构

     
     本部分内容:/文件解说/PE剖析图/W32dasm反汇编参考/PE剖析中所用结构参考

    大家都很清楚,了解可执行文件的结构有多么的重要,DOS下如此,Windows下也同样如此。如果你想加密程序,编写病毒等,了解PE文件结构必是不可缺少的。大家也可能见到很多这方面的资料,但都是从理论上解说一下,很少见到拿一个具体文件开刀的。这里,我就用前面“系列4”中的文件4.EXE为例来剖析一下PE文件格式,因时间关系,不可能一下子就写的很完善,如可行,以后再慢慢补来。

===============================================================      
    对于本文件,红色外框将文件分成4个部分,各部分的内容是:
    Ⅰ - 文件头;
    Ⅱ - 代码段;.text  section
    Ⅲ - 引入表;.rdata section
    Ⅳ - 数据段;.data  section
   
    可以看出,每部分都有大量的垃圾数据,用绿色的叉号进行标注。
   
    我们先从整体看一下文件的结构:(要结合PE剖析图来看)
    ----------------------------------------------------------
    1、IMAGE_DOS_HEADER
       虽然你这是Windows下的程序,但保不准别人会拿它到DOS下执行,当然肯定不是想象的结果啦。该文件头和DOS下可执行文件的文件头基本上是一样的,所以你也可以认为它是一个标准的DOS下的EXE文件,只不过程序执行的结果是显示一个错误信息:This program cannot be run in DOS mode.,意思是这是Windows下的程序,到Windows下用吧!
       该结构的最后一个元素e_lfanew指示PE文件头的位置,是个重要的数据。
       对本例,该元素位于文件偏移量是3C的位置,其值是000000B0。
    2、dos下执行时的程序部分
    3、dos执行时显示的错误信息
    4、垃圾数据
    -----------------------------------------------------------
    就是PE文件头啦,它是一个IMAGE_NT_HEADERS STRUCT结构
    5、PE文件标记,db 'PE',0,0
    6、是一个IMAGE_FILE_HEADER结构
    7、是一个IMAGE_OPTIONAL_HEADER结构
    8、是一个IMAGE_DATA_DIRECTORY结构数组,共16项
    9、是一个IMAGE_SECTION_HEADER结构数据,项数由结构6中 NumberOfSections 确定。
       本例中位于偏移量B6处,其值是0003
    -------------------------------------------------------------
    10、程序的代码部分,也就是.text section的内容
    -------------------------------------------------------------
    下面是.rdata section的内容,注意这里的指针值都是“虚拟地址”,即在内存执行时的地址。
   
    11、IDA (Import Address table)用来存放函数的地址值。加载器执行文件时会重写该部分内容,程序中调用dll中的函数就是通过这里转到函数的真正位置的。
    12、是一个IMAGE_IMPORT_DESCRIPTOR结构数组,项数怎么定呢?
        这么说吧,假如你的程序中要调用N个动态链接库中的函数,那么项数就是N+1,总后一项结构中的数据全0,表示结束。
        本例中的程序仅调用Kernell32.dll中的函数,所以此处有两个这样的结构。
    13、是一个IMAGE_THUNK_DATA结构数组,该结构实际就是一个DWORD值,每个DWORD值指示一个IMAGE_IMPORT_BY_NAME结构,反应程序要调用的函数名。最后一个DWORD值为0,表示结束。
    14、数据,由12、13中的内容指定。
   
==============================================================
下面是用UltraEdit打开4.exe后的抓图(处理)

若下面没图,点这里,可能还要刷新。

==============================================================
下面是用W32dasm反汇编4.exe后的详细内容,供参考:
Disassembly of File: 4.exe
Code Offset = 00000400, Code Size = 00000200     ;在文件中的偏移量是400H,大小200H(调整后的)
Data Offset = 00000800, Data Size = 00000200     ;在文件中的偏移量是800H,大小200H(调整后的)

Number of Objects = 0003 (dec), Imagebase = 00400000h   ;section的个数是3,基地址是400000H

   Section   相对虚拟地址    在文件中的偏移量  调整后的大小     段属性标记
   Object01: .text    RVA: 00001000 Offset: 00000400 Size: 00000200 Flags: 60000020
   Object02: .rdata   RVA: 00002000 Offset: 00000600 Size: 00000200 Flags: 40000040
   Object03: .data    RVA: 00003000 Offset: 00000800 Size: 00000200 Flags: C0000040

+++++++++++++++++++ IMPORTED FUNCTIONS ++++++++++++++++++
Number of Imported Modules =    1 (decimal)      ;程序仅调用一dll中的函数

   Import Module 001: KERNEL32.dll

+++++++++++++++++++ IMPORT MODULE DETAILS +++++++++++++++

   Import Module 001: KERNEL32.dll 

Addr:00002064 hint(013D) Name: GetStdHandle     ;将调用Kernel32中的三个函数
Addr:00002074 hint(02B9) Name: WriteFile        ;这个Addr给出的值可不函数的真正地址
Addr:00002048 hint(0075) Name: ExitProcess      ;执行时加载器会修改这三个值

+++++++++++++++++++ ASSEMBLY CODE LISTING ++++++++++++++++++
//********************** Start of Code in Object .text **************
Program Entry Point = 00401000 (4.exe File Offset:00001600)

* Possible StringData Ref from Data Obj ->"How are you !"
                                  |

//******************** Program Entry Point ********
:00401000 6800304000              push 00403000
:00401005 E80E000000              call 00401018
:0040100A 6A00                    push 00000000

* Reference To: KERNEL32.ExitProcess, Ord:0075h
                                  |
:0040100C E801000000              Call 00401012
:00401011 CC                      int 03

* Referenced by a CALL at Address:
|:0040100C  
|

* Reference To: KERNEL32.ExitProcess, Ord:0075h
                                  |
:00401012 FF2508204000            Jmp dword ptr [00402008]

* Referenced by a CALL at Address:
|:00401005  
|
:00401018 55                      push ebp
:00401019 8BEC                    mov ebp, esp
:0040101B 83C4F4                  add esp, FFFFFFF4
:0040101E 6AF5                    push FFFFFFF5

* Reference To: KERNEL32.GetStdHandle, Ord:013Dh
                                  |
:00401020 E863000000              Call 00401088
:00401025 8945FC                  mov dword ptr [ebp-04], eax
:00401028 FF7508                  push [ebp+08]
:0040102B E820000000              call 00401050
:00401030 8945F4                  mov dword ptr [ebp-0C], eax
:00401033 6A00                    push 00000000
:00401035 8D45F8                  lea eax, dword ptr [ebp-08]
:00401038 50                      push eax
:00401039 FF75F4                  push [ebp-0C]
:0040103C FF7508                  push [ebp+08]
:0040103F FF75FC                  push [ebp-04]

* Reference To: KERNEL32.WriteFile, Ord:02B9h
                                  |
:00401042 E847000000              Call 0040108E
:00401047 8B45F8                  mov eax, dword ptr [ebp-08]
:0040104A C9                      leave
:0040104B C20400                  ret 0004


:0040104E CC                      int 03
:0040104F CC                      int 03

* Referenced by a CALL at Address:
|:0040102B  
|
:00401050 55                      push ebp
:00401051 8BEC                    mov ebp, esp
:00401053 53                      push ebx
:00401054 8B4508                  mov eax, dword ptr [ebp+08]
:00401057 8D5003                  lea edx, dword ptr [eax+03]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040106F(C)
|
:0040105A 8B18                    mov ebx, dword ptr [eax]
:0040105C 83C004                  add eax, 00000004
:0040105F 8D8BFFFEFEFE            lea ecx, dword ptr [ebx+FEFEFEFF]
:00401065 F7D3                    not ebx
:00401067 23CB                    and ecx, ebx
:00401069 81E180808080            and ecx, 80808080
:0040106F 74E9                    je 0040105A
:00401071 F7C180800000            test ecx, 00008080
:00401077 7506                    jne 0040107F
:00401079 C1E910                  shr ecx, 10
:0040107C 83C002                  add eax, 00000002

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401077(C)
|
:0040107F D0E1                    shl cl, 1
:00401081 1BC2                    sbb eax, edx
:00401083 5B                      pop ebx
:00401084 C9                      leave
:00401085 C20400                  ret 0004

* Referenced by a CALL at Address:
|:00401020  
|

* Reference To: KERNEL32.GetStdHandle, Ord:013Dh
                                  |
:00401088 FF2500204000            Jmp dword ptr [00402000]  ;转去IDA表中对应的函数

* Reference To: KERNEL32.WriteFile, Ord:02B9h
                                  |
:0040108E FF2504204000            Jmp dword ptr [00402004]

==============================================================
下面是PE文件剖析时设计到的结构,来自Windows.inc文件,供参考:
   
IMAGE_DOS_HEADER STRUCT
  e_magic           WORD      ?
  e_cblp            WORD      ?
  e_cp              WORD      ?
  e_crlc            WORD      ?
  e_cparhdr         WORD      ?
  e_minalloc        WORD      ?
  e_maxalloc        WORD      ?
  e_ss              WORD      ?
  e_sp              WORD      ?
  e_csum            WORD      ?
  e_ip              WORD      ?
  e_cs              WORD      ?
  e_lfarlc          WORD      ?
  e_ovno            WORD      ?
  e_res             WORD   4 dup(?)
  e_oemid           WORD      ?
  e_oeminfo         WORD      ?
  e_res2            WORD  10 dup(?)
  e_lfanew          DWORD     ?
IMAGE_DOS_HEADER ENDS

IMAGE_NT_HEADERS STRUCT
  Signature         DWORD                   ?
  FileHeader        IMAGE_FILE_HEADER       <>
  OptionalHeader    IMAGE_OPTIONAL_HEADER32 <>
IMAGE_NT_HEADERS ENDS

IMAGE_FILE_HEADER STRUCT
  Machine               WORD    ?
  NumberOfSections      WORD    ?
  TimeDateStamp         DWORD   ?
  PointerToSymbolTable  DWORD   ?
  NumberOfSymbols       DWORD   ?
  SizeOfOptionalHeader  WORD    ?
  Characteristics       WORD    ?
IMAGE_FILE_HEADER ENDS

IMAGE_NUMBEROF_DIRECTORY_ENTRIES   equ    16

IMAGE_OPTIONAL_HEADER32 STRUCT
  Magic                         WORD       ?
  MajorLinkerVersion            BYTE       ?
  MinorLinkerVersion            BYTE       ?
  SizeOfCode                    DWORD      ?
  SizeOfInitializedData         DWORD      ?
  SizeOfUninitializedData       DWORD      ?
  AddressOfEntryPoint           DWORD      ?
  BaseOfCode                    DWORD      ?
  BaseOfData                    DWORD      ?
  ImageBase                     DWORD      ?
  SectionAlignment              DWORD      ?
  FileAlignment                 DWORD      ?
  MajorOperatingSystemVersion   WORD       ?
  MinorOperatingSystemVersion   WORD       ?
  MajorImageVersion             WORD       ?
  MinorImageVersion             WORD       ?
  MajorSubsystemVersion         WORD       ?
  MinorSubsystemVersion         WORD       ?
  Win32VersionValue             DWORD      ?
  SizeOfImage                   DWORD      ?
  SizeOfHeaders                 DWORD      ?
  CheckSum                      DWORD      ?
  Subsystem                     WORD       ?
  DllCharacteristics            WORD       ?
  SizeOfStackReserve            DWORD      ?
  SizeOfStackCommit             DWORD      ?
  SizeOfHeapReserve             DWORD      ?
  SizeOfHeapCommit              DWORD      ?
  LoaderFlags                   DWORD      ?
  NumberOfRvaAndSizes           DWORD      ?
  DataDirectory                 IMAGE_DATA_DIRECTORY IMAGE_NUMBEROF_DIRECTORY_ENTRIES dup(<>)
IMAGE_OPTIONAL_HEADER32 ENDS

IMAGE_OPTIONAL_HEADER  equ 

IMAGE_DATA_DIRECTORY STRUCT
  VirtualAddress    DWORD      ?
  isize             DWORD      ?
IMAGE_DATA_DIRECTORY ENDS

IMAGE_SIZEOF_SHORT_NAME   equ   8

IMAGE_SECTION_HEADER STRUCT
    Name1 db IMAGE_SIZEOF_SHORT_NAME dup(?)
    union Misc
        PhysicalAddress dd  ?
        VirtualSize     dd  ?
    ends
    VirtualAddress          dd  ?
    SizeOfRawData           dd  ?
    PointerToRawData        dd  ?
    PointerToRelocations    dd  ?
    PointerToLinenumbers    dd  ?
    NumberOfRelocations     dw  ?
    NumberOfLinenumbers     dw  ?
    Characteristics         dd  ?
IMAGE_SECTION_HEADER ENDS

IMAGE_IMPORT_DESCRIPTOR STRUCT
    union
        Characteristics    dd   ?
        OriginalFirstThunk dd   ?
    ends
    TimeDateStamp  dd   ?
    ForwarderChain dd   ?
    Name1          dd   ?
    FirstThunk     dd   ?
IMAGE_IMPORT_DESCRIPTOR ENDS


IMAGE_IMPORT_BY_NAME STRUCT
    Hint  dw    ?
    Name1 db    ?
IMAGE_IMPORT_BY_NAME ENDS

IMAGE_THUNK_DATA32 STRUCT
    union u1
        ForwarderString dd  ?
        Function        dd  ?
        Ordinal         dd  ?
        AddressOfData   dd  ?
    ends
IMAGE_THUNK_DATA32 ENDS

IMAGE_THUNK_DATA EQU

你可能感兴趣的:(pe文件结构)