老文章档案 · 2003 年

PE文件结构剖析

天下资讯 · 破解文章 · 2003-09-19 · 作者:怜香 人气: · 出处:赢政天下整理收藏)

本部分内容:/文件解说/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

(出处:赢政天下整理收藏)

相关资讯:

相关软件:

→ 特别推荐

→ 热点TOP10

我为人人《《==》》人人为我

关于我们 |

帮助(?)

| 广告服务 |

版权声明 |

商业合作 |

发展历程 |

加盟我们 |

联系我们

Copyright ? 1998-2003 winzheng.com

All Rights Reserved.

特别感谢 蓝芒科技 提供下载站及论坛服务器

2003-2004 年,宽带刚刚普及,下载站的文章区是许多人学电脑的第一课堂。
🕰 → 🤖 从那时到现在

当年一篇教程能让一台电脑焕然一新;今天的效率工具换成了 AI。 想知道当下最可靠的 AI 模型怎么选?看 赢政指数——我们用了 28 年的选软件严谨,现在用来评测大模型。

档案性质声明:本页为赢政天下(1998-2011)老文章的历史档案复原, 内容反映当年发表时的原貌——包括当年的技术表述、软件版本与观点,部分方法在今天已不适用或不合规,仅作互联网历史记录与研究用途, 不提供任何形式的下载。原始数据经由公共网络存档(Internet Archive)复原。发现问题请联系我们
← 返回老文章档案 · 软件史档案馆 · 赢政天下站史