结构祥解WindowsNT3 1引入了一种名为PE文件格式新可执行_第1页
结构祥解WindowsNT3 1引入了一种名为PE文件格式新可执行_第2页
结构祥解WindowsNT3 1引入了一种名为PE文件格式新可执行_第3页
结构祥解WindowsNT3 1引入了一种名为PE文件格式新可执行_第4页
结构祥解WindowsNT3 1引入了一种名为PE文件格式新可执行_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1WindowsNT3.1引入了一种名为PE文件格式的新可执行文件格式。PE文件格式的规范包含在了MSDN的CD(SpecsandStrategy,Specifications,WindowsNTFileFormatSpecifications为了获得PE文件中所包含的重要信息,我编写了一个名为PEFILE.DLL的动态库,本DLL;同样,你亦可以依你所愿地使用并构建它的源码。在本文末尾,你会PEFILE.DLL的函数导出列表和一个如何使用它们的说明。我觉得你会发现这些函数会让你从容应付PE文件格式的。Windows操作系统最近增加的WindowsNT为开发环境和应用程序本身带来了很大的改变,这之中一个最为重大的当属PE文件格式了。新的PEUNIX操作系COFFMS-DOSWindows操作系统的兼容,PE文件格式也保留了MS-DOS中那熟悉的MZ头部。之中,本文会详细讨论PE文件的每一个组成部分。很多解决PE文件格式的工作和直接数据有关。例如,要弄懂导入地址名称表是如何构成的,我就得同时查看.idata段头部、导入映像数据、可选头部以及当前的.idata段实体,而EXEVIEW.EXE就是查看这些信息的最佳示例。 )1PE)失败,并提供一些完全没用的信息,例如:“Thenamespecifiedisnotrecognizedasaninternalorexternalcommand,operableprogramorbatchfile.”typedeftypedefstructIMAGEDOSDOS的.EXEUSHORTemagicUSHORTecblpUSHORTecpUSHORTecrlcUSHORTecparhdr头部尺寸,以段落为单位USHORTeminalloc;//所需的最小附加段USHORTemaxalloc;//所需的最大附加段USHORTess;//SS值(相对偏移量)USHORTesp;//SP值USHORTecsumUSHORTeipIPUSHORTecsCS值(相对偏移量)USHORTelfarlc;//重分配表文件地址USHORTeovno;//覆盖号USHORTeres[4USHORTeoemidOEM标识符(相对eoeminfo)USHORTeoeminfo;//OEM信息USHORTeres2[10LONGelfanewexee_magicMS-DOS打开文件:hFileCreateFile(lpFileName,MS-DOSMS-DOS像文件,应用程序就是从这里执行的。对于Windows、OS/2、WindowsNT这些操作系统来说,MS-DOS残余程序就代替了主程序的位置被放在这里。这种残余程序通常什么也不做,而只是输出一行文本,例如:“ThisprogramrequiresWindowsv3.1orgreater.”当然,用户可以在此放入任何的残余程序,这就意味着你可能经常看到像这样的东西:“YourunaWindowsNTapplicationonOS/2,it''ssimplynot当为Windows3.1构建一个应用程序的时候,器将向你的可执行文件中一个名为由MS-DOS头的域e_lfnew来确定。{DWORDSignature;IMAGE_FILE_HEADERFileHeader;}IMAGE_NT_HEADERS,{DWORDSignature;IMAGE_FILE_HEADERFileHeader;}IMAGE_NT_HEADERS,TheIMAGE_FILE_HEADERstructurerepresentstheCOFFheader{WORDWORDNumberOfSections;DWORDTimeDateStamp;DWORDNumberOfSymbols;WORDSizeOfOptionalHeader;WORDCharacteristics;}IMAGE_FILE_HEADER,但是请确信:这个头部并非“可选”,而是“必需”的。可选头部的偏移量即为:offset=dos_head->e_lfanewSIZE_OF_NT_SIGNATURE(即:4)sizeof(IMAGE_FILE_HEADER)。可选头TheIMAGE_OPTIONAL_HEADERstructurerepresentstheoptionalheadertypedefstruct{WORDBYTE//iftherearemultiplecodesumofallsuchsectionsiftherearemultipleinitializeddatasections.DWORDSizeOfUninitializedData;//Sizeoftheuninitializeddatasection,inbytes,orthesumofallsuchsectionsiftherearemultipleuninitializeddatasections.thismemberiszero.DWORDImageBase;//Preferredaddressofthefirstbyteoftheimagewhenitis//inmemory.Thisvalueisamultipleof64Kbytes.ThedefaultvalueforDLLsis//0x.Thedefaultvalueforapplicationsis0x.sizeforthesystem.DWORDWORDWORDWORDMajorImageVersion;WORDMinorImageVersion;DWORDWin32VersionValue;DWORDSizeOfImage;//Sizeoftheimage,inbytes,includingallheaders.Mustbe//multipleof//headers,roundedtoamultipleofthevaluespecifiedintheFileAlignmentWORDWORDDllCharacteristics; DWORDSizeOfHeapReserve; DWORDDWORD}IMAGE_OPTIONAL_HEADER, 一个IMAGE_DATA_DIRECTORY结构的数组,位于可选头部结构的末尾。TheIMAGE_DATA_DIRECTORYstructurerepresentsthedatatypedeftypedefstruct{DWORDVirtualAddress;DWORDSize;}IMAGE_DATA_DIRECTORY,当前的PE文件格式定义了16种可能的数据 Thefollowingisalistofthedata函Architecture-specificdataaddressand数的引Threadlocalstorage(TLS)tableaddressand入LoadconfigurationtableaddressandBoundimporttableaddressandsize绑定输入表(引入表ImportaddresstableaddressandDelayimportdescriptoraddressandExportExporttableaddressandImporttableaddressandsize输入表(引入表)ResourcetableaddressandsizeExceptiontableaddressandtableaddressandBaserelocationtableaddressandsize用TheIMAGE_SECTION_HEADERstructurerepresentstheimagesectionheadertypedeftypedefstruct{BYTEunionDWORDPhysicalAddress;//FileDWORDVirtualSize;//Totalsizeofthesectionwhenloadedintomemory,inbytes.//if}//relativetotheimagebeamultipleoftheFileAlignmentmemberoftheIMAGE_OPTIONAL_HEADERstructure.//IfthisvalueislessthantheVirtualSizemember,theremainderofthesectionis//filledwithzeroes.Ifthesectioncontainsonlyuninitializeddata,thememberis//zero.DWORDPointerToRawDataFilepointertothefirstpagewithintheCOFFfile.ThisvaluemustbeamultipleoftheFileAlignmentmemberoftheIMAGEOPTIONALHEADERstructure.If//asectioncontainsonlyuninitializeddata,thismemberiszero.//本节在文件中的偏移量//forthesection.Iftherearenorelocations,thisvalueisforthesection.IftherearenoCOFFlinenumbers,thisvalueiszero.WORDNumberOfRelocations;//Numberofrelocationentriesforthesection.This//iszeroforexecutableWORDNumberOfLinenumbers;//Numberofline-numberentriesforthesection.DWORDCharacteristics;}IMAGE_SECTION_HEADER,1(4)部分模拟出,要得到所有段头部的总大小:节,通常有这样的宏定义:#defineSIZE_OF_NT_SIGNATURE4,即可按如下方法得到:则第SecOffset=dos_head->e_lfanew+SIZE_OF_NT_SIGNATURE+sizeof(IMAGE_FILE_HEADER)+sizeofIMAGE_SECTION_HEADER)多个单元,以指向下一个段头部。*(section_header+1)section_header[1]指向同一个单元。PEdllIIDIIDdll。typedefstruct TimeDateStamp04h{DWORDCharacteristics;//00hDWORDOriginalFirstThunk1{ //10h ForwarderChain08h该结构本身,即:有几个IMAGE_IMPORT_BY_NAME结构,收集这些结构的RVA(即:typedeftypedefstructIMAGETHUNK{{PDWORD DWORD PIMAGEIMPORTBYNAME该结构只占4个字节,在文件中准确定位到该块数据时,只需要4个字节。从而就可拟地址RVA,指示了IMAGE_IMPORT_BY_NAME结构的数据地址。typedeftypedefstructIMAGEIMPORTBYNAME }IMAGE_IMPORT_BY_NAME,typedeftypedefstructIMAGEIMPORTBYNAME1 }IMAGE_IMPORT_BY_NAME1,则就是该功能在DLL中的序号;还指向原来的数组(INTImportNameTable)FirstThunk(输入地址表:ImportAddressTable)PEtypedefstructIMAGE{DWORDCharacteristics; TimeDateStamp; //RVAfrombaseof //RVAfrombaseofAddressOfNameOrdinals;//RVAfromof}IMAGE_EXPORT_DIRECTORY,输出表一般存在与dll文件中,很少出现在exe文件中(也有)。主要为可执行文件修正其IAT提供信息和依据;输出表的位置在:pe头的可选映像头中的数据 表的第1个字段中,OffSet=PEHeader->OptionalHeader.DataDirectory[0].VirtualAddress处,这是一个相对虚拟结构数据。准确定位后,只要sizeof(IMAGE_EXPORT_DIRECTORY)字节的数据,即可获取输typedeftypedefstructIMAGEEXPORT{ULONGCharateristics;未使用,总为0ULONGTimeDateStamp;文件生成时间ULONGName;模块中的真实名称ULONGBase;基数,加上序数就是函数地址数组的索引值//通常为1ULONGNumberOfNames;AddressOfNames序列中的元素个数PULONG*AddressOfFunctions;指向函数地址数组PULONG*AddressOfNames;函数名字的指针地址}IMAGEEXPORTDIRECTORY,*PIMAGEEXPORT如下的关系:第i个函数名称对应的地址=(RVA1—>RAW)+i个输出序号。PIMAGE_NT_HEADERSpNTHeader;NTPIMAGE_BASE_RELOCATIONpReloc;//指向重定位表的址typedefstructIMAGEBASEtypedefstructIMAGEBASERELOCATION{DWORDVirtualAddress;//}}212RVARVAtypedefstructtypedefstructIMAGESECTION{BYTEName[IMAGESIZEOFSHORT{DWORDVirtualSize;}DWORDDWORDDWORDDWORDDWORDWORDWORDDWORD}IMAGE_SECTION_HEADER,));//{找到.rsrc}}typedefstructIMAGERESOURCEDWORDCharacteristics标识此资源的类型DWORDTimeDateStamp;WORDWORDWORD。IMAGERESOURCEDIRECTORYENTRYDirectoryEntries请注意这里,下面}IMAGE_RESOURCE_DIRECTORY,树枝,树枝的Characteristics会标识不同的资源类型,而每根树枝又会有枝。这样一直义如下(可在winuser.h*PredefinedResource#defineRT_CURSORMAKEINTRESOURCE(1)#defineRT_BITMAPMAKEINTRESOURCE(2)#defineRT_ICONMAKEINTRESOURCE(3)#defineRT_MAKEINTRESOURCE(4)#defineRT_DIALOGMAKEINTRESOURCE(5)#defineRT_STRINGMAKEINTRESOURCE(6)#defineRT_FONTMAKEINTRESOURCE(8)#defineRT_RCDATAMAKEINTRESOURCE(10)typedeftypedefstructIMAGERESOURCEDIRECTORY{{{DWORDNameOffset:31;DWORDName;WORDId;{ {DWORD 了。那么,IMAGE_RESOURCE_DIRECTORY_ENTRY结构应该怎么得到呢?让我们再看一下,IMAGE_RESOURCE_DIRECTORY的结构说明吧。typedefstruc

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论