PE文件结构Word文档格式.docx

上传人:b****6 文档编号:16173497 上传时间:2022-11-21 格式:DOCX 页数:21 大小:42.59KB
下载 相关 举报
PE文件结构Word文档格式.docx_第1页
第1页 / 共21页
PE文件结构Word文档格式.docx_第2页
第2页 / 共21页
PE文件结构Word文档格式.docx_第3页
第3页 / 共21页
PE文件结构Word文档格式.docx_第4页
第4页 / 共21页
PE文件结构Word文档格式.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

PE文件结构Word文档格式.docx

《PE文件结构Word文档格式.docx》由会员分享,可在线阅读,更多相关《PE文件结构Word文档格式.docx(21页珍藏版)》请在冰豆网上搜索。

PE文件结构Word文档格式.docx

代替的,我会向你介绍包含在PE文件中的概念,并且将他们和你每天都遇到的东西联系起来。

比如,线程局部变量的概念,如下所述:

declspec(thread)inti;

我快要发疯了,直到我发现它在可执行文件中实现起来是如此的简单并且优雅。

既然你们中的许多人都有使用16Windows的背景,我将把Win32PE文件的构造追溯到和它等价的16位NE文件。

除了一个不同的可执行文件格式,MicroSoft还引入了一个用它的编译器和汇编器生成的新的目标模块格式。

这个新的OBJ文件格式有许多和PE文件共同的东东。

我做了许多无用功去查找这个新的OBJ文件格式的文档。

所以我以自己的理解对它进行解析,并且,在这里,除了PE文件,我会描述它的一部分。

大家都知道,WindowsNT继承了VAX?

VMS?

和UNIX?

的传统。

许多WindowsNT的创始人在进入微软前都在这些平台上进行设计和编码。

当他们开始设计WindowsNT时,很自然的,为了最小化项目启动时间,他们会使用以前写好的并且已经测试过的工具。

用这些工具生成的并且工作的可执行和OBJ文件格式叫做COFF(CommonObjectFileFormat的首字母缩写)。

COFF的相对年龄可以用八进制的域来指定。

COFF本身是一个好的起点,但是需要扩展到一个现代操作系统如Windows95和WindowsNT的需要。

这个更新的结果就是(PE格式)可移植可执行文件格式。

它被称为"

可移植的"

是因为在所有平台(如x86,Alpha,MIPS等等)上实现的WindowsNT都使用相同的可执行文件格式。

当然了,也有许多不同的东西如二进制代码的CPU指令。

重要的是操作系统的装入器和程序设计工具不需要为任何一种CPU完全重写就能达到目的。

MicroSoft抛弃现存的32位工具和可执行文件格式的事实证实了他们想让WindowsNT升级并且运行的更快的决心。

为16位Windows编写的虚拟设备驱动程序用一种不同的32位文件布局--LE文件格式--WindowsNT出现很早以前就存在了。

比这更重要的是对OBJ文件的替换!

在WindowsNT的C编译器以前,所有的微软编译器都用Intel的OMF(ObjectModuleFormat)规范。

就像前面提到的,MicroSoft的Win32编译器生成COFF格式的OBJ文件。

一些微软的竞争者,如Borland和Symentec,选择放弃了COFF格式并坚持Intel的OMF文件格式。

这样的结果是制作OBJ和LIB的公司为了使用多个不同的编译器,不得不为每个不同的编译器分发这些库的不同版本(如果他们不这么做)。

PE文件格式在winnt.h头文件中文档化了(用最不精确的语言)!

大约在winnt.h的中间部分标题为"

ImageFormat"

的一个快。

在把MS-DOS的MZ文件头和NE文件头移入新的PE文件头之前,这个块就开始于一个小栏。

WINNT.H提供PE文件用到的生鲜数据结构的定义,但只有很少有助于理解这些数据结构和标志变量的注释。

不管谁为PE文件格式写出这样的头文件都肯定是一个信徒无疑(突然持续地冒出MichaelJ.O'

Leary的名字来)。

描述名字,连同深嵌的结构体和宏。

当你配套winnt.h进行编码时,类似下面这样的表达式并不鲜见:

pNTHeader->

OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG]

.VirtualAddress;

为了有助于逻辑的理解这些winnt.h中的信息,阅读可移植可执行和公共对象文件格式的规格说明,这些在MSDN既看光盘中是可用的,一直包括到2001年8月。

现在让我们转换到COFF格式的OBJ文件的主体上来,WINNT.H包括COFFOBJ和LIB的结构化定义和类型定义。

不幸的是,我还没有找到上面提到的可执行文件格式的类似文档。

既然PE文件和COFFOBJ文件是如此的相似,我决定是时间把这些文件带到重点上来,并且把它们也文档化。

仅仅读过了关于PE文件的组成,你自己也想Dump一些PE文件来看这些概念。

如果你用微软基于32位WINDOWS的开发工具,DUMPBIN程序可以将PE文件和COFFOBJ/LIB文件转化为可读的形式。

在所有的PEDump器中,DUMPBIN是最容易理解的。

它恰好有一些很好的选项来反汇编它正解析的文件的代码块,Borland用户可以使用tdump来浏览PE文件,但tdump不能解析COFFOBJ/LIB文件。

这不是一个重要的东西因为Borland的编译器首先就不生成COFF格式的OBJ文件。

我写了一个PE和COFFOBJ文件的Dump程序--PEDUMP(见表1),我想提供一些比DUMPBIN更加可理解的输出。

虽然它没有反汇编器以及和LIB库文件一起工作,它在其他方面和DUMPBIN是一样的,并且加入了一些新的特性来使它值得被认同。

它的源代码在任何一个MSJ电子公报版上都可以找到,所有我不打算在这里把他全部列出。

作为代替,我展示一些从PEDUMP得到的示例输出来阐明我为它们描述的概念。

译注:

--说实话,我从这这份代码中几乎唯一学到的东西就是"

如何处理命令行"

,其它的都没学到。

表1PEDUMP.C

file:

//--------------------/

//PROGRAM:

PEDUMP

//FILE:

PEDUMP.C

//AUTHOR:

MattPietrek-1993

#include<

windows.h>

stdio.h>

#include"

objdump.h"

exedump.h"

extrnvar.h"

//Globalvariablessethere,andusedinEXEDUMP.CandOBJDUMP.C

BOOLfShowRelocations=FALSE;

BOOLfShowRawSectionData=FALSE;

BOOLfShowSymbolTable=FALSE;

BOOLfShowLineNumbers=FALSE;

charHelpText[]=

"

PEDUMP-Win32/COFF.EXE/.OBJfiledumper-1993MattPietrek\n\n"

Syntax:

PEDUMP[switches]filename\n\n"

/Aincludeeverythingindump\n"

/Hincludehexdumpofsections\n"

/Lincludelinenumberinformation\n"

/Rshowbaserelocations\n"

/Sshowsymboltable\n"

;

//Openupafile,memorymapit,andcalltheappropriatedumpingroutine

voidDumpFile(LPSTRfilename)

{

HANDLEhFile;

HANDLEhFileMapping;

LPVOIDlpFileBase;

PIMAGE_DOS_HEADERdosHeader;

hFile=CreateFile(filename,GENERIC_READ,FILE_SHARE_READ,NULL,

OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);

if(hFile==INVALID_HANDLE_VALUE)

{printf("

Couldn'

topenfilewithCreateFile()\n"

);

return;

}

hFileMapping=CreateFileMapping(hFile,NULL,

PAGE_READONLY,0,0,NULL);

if(hFileMapping==0)

{

CloseHandle(hFile);

printf("

topenfilemappingwithCreateFileMapping()\n"

}

lpFileBase=MapViewOfFile(hFileMapping,FILE_MAP_READ,0,0,0);

if(lpFileBase==0)

CloseHandle(hFileMapping);

tmapviewoffilewithMapViewOfFile()\n"

Dumpoffile%s\n\n"

filename);

dosHeader=(PIMAGE_DOS_HEADER)lpFileBase;

if(dosHeader->

e_magic==IMAGE_DOS_SIGNATURE)

{DumpExeFile(dosHeader);

}

elseif((dosHeader->

e_magic==0x014C)//Doesitlooklikeai386

&

(dosHeader->

e_sp==0))//COFFOBJfile?

?

//Thetwotestsabovearen'

twhattheylooklike.They'

re

//reallycheckingforIMAGE_FILE_HEADER.Machine==i386(0x14C)

//andIMAGE_FILE_HEADER.SizeOfOptionalHeader==0;

DumpObjFile((PIMAG

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1