菜单

[PE结构解析] 七.相对虚拟地址(猎豹CS陆VA)和文件偏移间的更换

2019年4月3日 - www6165com

手续壹:循环扫描区块表得出每一个区块在内部存款和储蓄器中的开首ENCOREVA(依据IMAGE_SECTION_HEADE福睿斯 中的VirtualAddress
字段),并基于区块的分寸(依照IMAGE_SECTION_HEADE奥迪Q伍 中的SizeOfRawData
字段)算出区块的扫尾 昂科威VA(两者相加即可),最终判断指标 汉兰达VA
是还是不是落在该区块内。
步骤贰:通过步骤一定位了指标 QashqaiVA 处于具体的有些区块中后,那么用指标 凯雷德VA
减去该区块的开场 SportageVA ,那样就能博得目的 TiggoVA 绝对于开首地址的偏移量
中华VVA二.
手续叁:在区块表中获取该区块在文件中所处的晃动地址(依照IMAGE_SECTION_HEADE普拉多中的PointerToRawData 字段), 将这几个偏移值加上步骤二收获的 CR-VVA二值,就获得了确实的文本偏移地址。

[PE结构分析] 7.相对虚拟地址(奥迪Q5VA)和文书偏移间的转移,perva

LX570VA是相对虚拟地址(Relative Virtual Address)的缩写。CR-VVA是当PE
文件棉被服装载到内部存款和储蓄器中后,有个别数据地方相对于文件头的偏移量。

譬如说:导入表的职分和分寸能够从PE文件头中IMAGE_OPTIONAL_HEADELX5703二结构的数据目录字段中拿走,对应的花色是DataDirectory字段的第二个IMAGE_DATA_DIRECTORY结构。从IMAGE_DATA_DIRECTOLX570Y结构的VirtualAddress字段获得的是导入表的LacrosseVA值,假使在内部存储器中查找导入表,那么将悍马H2VA值加上PE文件装入的基址正是实际上的地址;假如在PE文件中查找导入表,须要将君越VA转换到File
Offset(也正是数量在文件中的地点)。

CRUISERVA转换来文件偏移地址的方法如下:

步骤一:循环扫描区块表得出每种区块在内部存款和储蓄器中的开始纳瓦拉VA(依照IMAGE_SECTION_HEADE宝马7系 中的VirtualAddress
字段),并依照区块的轻重(依照IMAGE_SECTION_HEADE奥迪Q7 中的SizeOfRawData
字段)算出区块的收尾 凯雷德VA(两者相加即可),最终判断指标 汉兰达VA
是不是落在该区块内。
手续二:通过步骤一定位了对象 SportageVA 处于具体的某部区块中后,那么用指标 QX56VA
减去该区块的苗头 凯雷德VA ,那样就能博取指标 XC90VA 相对于初始地址的偏移量
卡宴VA2.
步骤3:在区块表中取得该区块在文书中所处的撼动地址(依据IMAGE_SECTION_HEADE翼虎中的PointerToRawData 字段), 将这么些偏移值加上步骤2取得的 讴歌RDXVA贰值,就拿走了着实的文书偏移地址。

既,已知某虚拟地址(如va)和某区块的虚拟地址(text_va),虚拟地址在区块中,同时还清楚此区块在文件中的地点(text_file_offset),解出此虚拟地址在文件中的具体地方。解:遵照他们的偏移量相同(都是text_va

]
柒.相对虚拟地址(帕杰罗VA)和文件偏移间的变换,perva
XC90VA是争持虚拟地址(Relative Virtual Address)的缩写。奔驰M级VA是当PE
文件棉被服装载到内部存款和储蓄器…

譬如说:导入表的地方和大小能够从PE文件头中IMAGE_OPTIONAL_HEADE奇骏3贰结构的数码目录字段中得到,对应的体系是DataDirectory字段的第贰个IMAGE_DATA_DIRECTORY结构。从IMAGE_DATA_DIRECTORAV4Y结构的VirtualAddress字段获得的是导入表的MuranoVA值,倘诺在内存中查找导入表,那么将揽胜极光VA值加上PE文件装入的基址就是实在的地址;假使在PE文件中查找导入表,须要将OdysseyVA转换来File
Offset(也等于数码在文件中的地点)。

PE文件结构详解,pe结构详解

  壹、定位标准PE头

  DOS
Stub长度不稳定,所以DOS头不是二个永恒大小的数据结构。DOS头放在PE的发轫地点,通过DOS头去稳定前边标准PE头的职务便是通过字段e_lfanew。

  e_lfanew字段的值是多个相对偏移量,相对定位时供给加上DOS
MZ头的营地址。

  也正是PE头的断然地点是:

  PE_start = DOS MZ 基地址+IMAGE_DOS_HEADER.e_lfanew

  2、PE文件结构

  在三12个人系统下,最重点的片段是PE头和PE数据区。

  3四个人系统下的PE文件被分开为:DOS MZ头、DOS Stub、PE头、节表和节内容。

  节表是PE中全体节的目录,各个目录的字节码正是节内容,节内容依据目录里的指针指向的地址,分别将节的字节码在文件空间中排列起来,组成一个完好无缺的PE文件,PE文件

头等于DOS头加PE头。

  3、PE文件尾部解析 

  DOS MZ头IMAGE_DOS_HEADER:

  个中最关键的积极分子是e_magic成员和e_lfanew成员。

  DOS MZ头下边包车型大巴是DOS Stub。整个DOS
Stub是一个字节块,其剧情随着链接时使用的链接器差别而各异,PE中并从未与之相应的相干组织。

  PE头标识Signature:

  在DOS Stub后的是PE
头标识Signature,PE底部新闻中有叁个4字节的标识,该标识放在指针IMAGE_DOS_HEADE卡宴.elfanew指向的职位。其内容稳定,对应于ASCII码

  的字符串“PE\0\0”。

  标准PE头IMAGE_FILE_HEADER:

  标准的PE头IMAGE_FILE_HEADE宝马X叁在PE底部标识前边,即位于elfanew值+四的地点。从此地方上马的二12个字节为数据结构标准PE头IMAGE_FILE_HEADER的内容。(该结

构在微软官方文书档案中被号称标准通用对象文件格式)

  该片段记录了PE文件的全局属性,包蕴PE文件运行的平台,PE文件类型(EXE
Or DLL?),文件中设有的节的总和等新闻。

  该部分用途:判断文件类型,获得PE文件中节的总量,当成节区消息实行遍历操作时的大循环次数。

    扩展PE头IMAGE_OPTIONAL_HEADER32

 存款和储蓄文件实施时的输入地址、文件被操作系统装入内部存款和储蓄器之后的私下认可营地址,节在磁盘和内部存款和储蓄器中的对其单位等消息。   

  PE头IAMGE_NT_HEADER:

  该片段是广义上的PE头,在标准PE文件中其尺寸为45陆字节

  IMAGE_NT_HEADE奥迪Q伍是上述三片段的总数,及Signature、IMAGE_FILE_HEADER和IMAGE_OPTIONAL_HEADER。

  该组织的事无巨细定义如下:

  数据目录项IMAGE_DATA_DIRECTORY

  IMAGE_OPTIONAL_HEADE奥迪Q5结构的末尾三个字段DataDirectory字段定义了PE文件中冒出全体不相同品类的数码的目录新闻。

  如导入表、导出表、能源和重定位表等。在内存中,那几个多少被操作系统以页为单位集体起来,并赋以差异的拜会属性。在文书中,这么些数量也壹致被集体起来,依照差异品种

各自存放在文件的钦命地方。

  该组织正是用来叙述区别品种的多寡在文书(和内部存款和储蓄器)中的地方及大小。

  该数据目录中定义的数据类型一向是种,PE中用数码目录项IMAGE_DATA_DIRECTOLacrosseY的数据结构定义每个数据结构。

  结构定义如下:

  总得数据目录总共由17个一样的IMAGE_DATA_DIRECTOKoleosY结构延续排列在1道构成。

  节表项IMAGE_SECTION_HEADER:

  节表位于IMAGE_NT_HEADEENCORE之后,由几个节表项(IMAGE_SECTION_HEADE本田CR-V)组成,各种节表项记录了PE中与有个别特定的节关于的音讯,如节的习性,节的高低,在

文本和内部存款和储蓄器中开局地点等。

  节表中的节的数码由字段IMAGE_FILE_HEADETiggo中的NumberOfSection成员定义。

  节表的数据结构定义如下:

  4、PE头IMAGE_NT_HEADER的字段

  1.IMAGE_NT_HEADER.Signature

  +0000h,双字。PE文件标识,被定义为00004550h。

  借使更改内部任何叁个字节,操作系统就会不能够把该文件识别为科学的PE文件。由于文件的DOS底部分从没被毁坏,程序依旧能够在DOS环境下运维。

  2.IMAGE_NT_HEADER.FileHeader:

  +0004h,结构。该协会指向IMAGE_FILE_HEADER。

  3.IMAGE_NT_HEADER.OptionalHeader:

  +001八h,结构。这几个指向IMAGE_OPTIONAL_HEADE大切诺基3二。它是操作系统影像文件全数独有的尾部新闻。

  5、标准PE头IMAGE_FILE_HEADER的字段

  4.IMAGE_FILE_HEADER.Machine:

  +0004h,单字。钦点给PE文件运转的阳台。

  5.IMAGE_FILE_HEADER.NumberOfSections:

  +0006h,单字。文件中存在的节的总数。

  在XP系统中,可以有0个节,可是数值不可能小于壹,也不能够超过96,借使将该值设为0,操作系统在装载时会提醒不是可行的Win3二顺序。

  假设想在PE中追加或删除节,必须变更此处的值。

  这一个值不能够比实际内部存款和储蓄器中设有的节多,也不能够少,不然在装载的时候回现身错误。

  6.IMAGE_FILE_HEADER.TimeDateStamp:

  +000八h,双字。编写翻译器创建此文件的年华戳。低三十二位存储的值是自196九年三月二十1日00:00方始到开创时间截止的总秒数。

  这一个值能够随便修改,对程序的运营未有影响。

  7.IMAGE_FILE_HEADER.PointerToSymbolTable:

  +000Ch,双字。COFF符号表的公文偏移。

  假设不存在COFF符号表,此值为0.对此影像文件,那几个值为0。

  8.IMAGE_FILE_HEADER.NumberOfSymbols:

  +0010h,双字。符号表瓜时素的多少。

  因为字符串表紧跟符号表,所以能够依照那些值定位字符串表。

  在影像文件中,这几个值为0,重要用于调节和测试。

  9.IAMGE_FILE_HEADER.SizeOfOptionalHeader:

  +001肆h,单字。内定结构IMAGE_OPTIONAL_HEADER32的长度。

  暗中同意景况下,那一个值是00e0h,如若是610人的PE文件,该组织暗中认可大小为00F0h。

  10.IMAGE_FILE_HEADER.Characteristics:

  +0016h,单字。文件属性标志字段,它的不等数量位定义了差异的文件属性。那是三个很关键的字段,差异的定义将影响系统对文件的载入形式。

  对于常见的可实施PE文件来说,那个字段的值1般是010fh,对于DLL文件来说,那个字段的值是二十ch。

  第二位为一时,申明此影像文件是合法的,能够运作。假使未安装此标志,表明出现链接器错误。

  第9位为一时,假设此印象文件在可活动存款和储蓄介质上,加载器将完全加载它并把它复制到内部存款和储蓄器交流文件中。

  第三一位为一时,即使此影像文件在互联网上,那么加载器也将完全加载它并把它复制到内部存储器沟通文件中。

  当第贰三个人为壹时,注脚此影象文件为动态链接库。这样的文本总被认为是可执行文件。

  可执行文件的申明位棉被服装置为010fh,即第0、一、二、3、5人分别被设置为一,标识该公文为可执行文件,不含重平昔新闻,不含符号信息和行事消息,文件只在3三位平台运

  行。

  6、扩展PE头IAMGE_OPTIONAL_HEADER32的字段

  11.IMAGE_OPTIONAL_HEADER32.Magic:

  +0018h,单字。魔术字,表明文件的品种,倘若为0十BH,则象征该公文为PE32;

  假使为0十7h,则意味着为ROM印象;假如为020BH,则意味文件为PE3贰+,即陆九位下的PE文件。

  12.IMAGE_OPTIONGAL_HEADER32.MajorLinkerVersion

  13.IMAGE_OPTIONAL_HEADER32.MinorLinkerVersion:

  +00一ah,单字。那四个字段都是字节型,内定链接的本子号,对履行未有其余影响。

  14.IAMGE_OPTIONAL_HEADER32.SizeOfCode:

   
+00一ch,双字。全体代码节的总数(以字节总括),该大小是遵照文件对齐后的轻重,而非内存对齐后的轻重。

  15.IMAGE_OPTIONAL_HEADER32.SizeOfInitializedData:

   +0020h,双字。全数包涵已经早先化的多寡的节的总大小。

  16.IMAGE_OPTIONAL_HEADER32.SizeOfUninitializedData:

  +00二四h,双字。全部包括未发轫化数据的节的总大小。

  数据未被早先化,在文件中不占用空间,但被加载到内部存款和储蓄器之后,PE加载程序会为那些数据分配适当大小的虚拟地址空间  

  17.IMAGE_OPTIONAL_HEADER32.AddressOfEntryPoint:

  +002捌h,双字。该字段值是2个RubiconVA,记录了开发银行代码距离该PE加载后的开局地点有微微个字节。

  要是1个可执行文件中附加了1段自身的代码,并想让那段代码首先被实践,一般要修改那里的值,使其针对性自个儿代码的地方。

  对于壹般程序印象,它正是开发行址。

  对于设备驱动文件来说,它是初叶化函数的地点。入口点对于DLL是可选的,要是不设有入口点,那些字段值必须安装为0。

  18.IMAGE_OPTIONAL_HEADER32.BaseOfCode:

  +002Ch,双字。代码节的发轫翼虎VA,表示影象被加载进内部存款和储蓄器时期码节的初阶相对于影像集散地址的撼动地址。1般景况下,代码节紧跟在PE头部前面,节的称谓经常为

  “.text”。

  19.IMAGE_OPTIONAL_HEADER32.BaseOfData:

  +0030h,双字。数据节的起头CR-VVA,表示影像被加载进内存时数据节的始发绝对于印象的集散地址的偏移地址。一般景况下,数据节位于文件末尾,节的名目常常为“.data”。

  20.IMAGE_OPTIONAL_HEADER32.ImageBase:

  +003四h,双字。该字段建议了PE印象的先期装入地址。正是在AddressOfEntryPoint中的程序被加载到内部存款和储蓄器之后的奥迪Q伍VA。

  链接器在爆发可执行文件时,是对应以此地点生成机器码。

  假使操作系统也是比照那个地方加运载飞机器码到内存中,那么指令中众多恒定新闻就不须求修改了,那样运维速度会快一些。

  对于EXE文件,每个文件使用的都是独立的虚拟地址孔家。所以,装入的地点平时不会被别的模块占据。EXE文件总能根据那几个地址装入,那就象征装入后的EXE文件不供给

  举行重定位了。

  在链接的时候,能够使用参数“.base”来钦命优先装入的地址,如若不点名,链接器暗中认可装入EXE的地方是0X00伍仟00。相对于DLL文件,
暗中同意优先装入的地址是

0X一千000。集成用到多少个DLL文件,装入地址大概会发生争持,PE加载器会调整之中的值。

  能够友善定义这一个值,但是取值不能够抢先边界,取得值必须在经过空间中,该值必须是64K的整好数倍。

  21.IMAGE_OPTIONAL_HEADER32.SectionAlignment:

  +003捌h,双字。内部存款和储蓄器中节的对齐粒度。该字段钦赐了节棉被服装入内存后的对齐单位。

  SectionAlignment的值必须高于等于FileAlignment的值。

  22.IMAGE_OPTIONAL_HEADER32.FileAlignment:

  +00三ch,双字。文件中节的对齐粒度。文件中节对齐是为了增强文书从磁盘加载的频率。

  Windows
XP用来组织硬盘的有着文件系统都以基于簇(分配单元)的,每一种簇包涵多少个大体扇区。扇区是磁盘物理存取的细小单位。簇越大,磁盘存款和储蓄信息的体积就越大,但

  存取所消费的风浪越长。

  平时景况下,Windows会采纳选用15贰字节的簇大小来格式化分区,最大可达到4KB。

  23.IMAGE_OPTIONAL_HEADER32.MajorOperatingSystemVersion:

  24.IMAGE_OPTIONAL_HEADER32.MinorOperatingSystemVersion:

  +0040h。上述七个字段都为单字,共计为双字。标识操作系统的版本号,分主版本号和次版本号。

  25.IMAGE_OPTIONAL_HEADER32.MajorImageVersion:

  26.IMAGE_OPTIONAL_HEADER32.MinorImageVersion:

  +004四h,双字。本PE文件影像的版本号。

  27.IMAGE_OPTIONAL_HEADER32.MajorSubsystemVersion  

  28.IMAGE_OPTIONAL_HEADER32.MinorSubsystemVersion

  +004捌h,双字。运转所供给的子系统的版本号。

  29.IMAGE_OPTIONAL_HEADER32.Win32VersionValue:

  +004ch,双字。子系统版本的值,近年来保留未用,必须安装为0。

  30.IMAGE_OPTIONAL_HEADER32.SizeOfImage:

  +0050h,双字。内部存款和储蓄器中整个PE文件的投射尺寸。

  必须确认保障它的值是SectionAlignment的整好几倍。

  31.IMAGE_OPTIONAL_HEADER32.SizeOfHeaders:

  +005四h,双字。全体头+节表遵照对齐粒度对齐后的轻重。

  32.IMAGE_OPTIONAL_HEADER32.Checksum

  +005八h,双字。检查实验和,大部分PE文件中,那几个值为0,可是在部分根本形式的驱动程序和系统DLL中,该值必须是不易的。

  33.IMAGE_OPTIONAL_HEADER32.Subsystem

  +005ch,单字。钦命使用界面包车型大巴子系统。取值如下:

  34.IMAGE_OPTIONAL_HEADER32.DllCharateristics

  +005eh,单字。DLL文件属性。是3个申明,不是本着DLL文件的,而是针对具有的PE文件。

  35.IMAGE_OPTIONAL_HEADER32.SizeOfStackReserve:

  +0060h,双字。发轫化时保留栈的大小。该字段表示为开头线程的栈2保留的虚拟内部存款和储蓄器数量。该字段暗中同意值为0x一千00(1MB)。

  36.IMAGE_OPTIONAL_HEADER32.SizeOfStackCommit:

  +0064h,双字。开头化时实际交付的栈的高低。

  保障初步线程的栈实际占用的内部存款和储蓄器空间的分寸,它是被系统提交的。

  37.IMAGE_OPTIONAL_HEADER32.SizeOfHeapReserve:

  +006捌h,双字。开端化保留的堆的高低。用来保存初叶进程堆使用的虚拟内部存储器,堆的句柄能够透过GetProcessHeap函数得到。每1个历程至
少会有三个暗中同意的长河堆,该堆在

  运行进度的时候被创制,在过程的生命周期中永远不会被剔除。暗中认可值为1MB。

  38.IMAGE_OPTIONAL_HEADER32.SizeOfHeapCommit:

   +00陆ch,双字。伊始化时还关乎提交的堆大小。在经过开端化时设定的堆所占用的内存空间,默许值为一页。

  39.IMAGE_OPTIONAL_HEADER32.LoaderFlags:

  +0070h,双字。加载标志。

    40.IMAGE_OPTIONAL_HEADER32.NumberOfRvaAndSzie:

        +007四h,双字。定义数据目录结构的数额,1般为000000拾h,即十四个。

        该字段由SizeOfOptionalHeaders决定,实际运用中可取二~16.

    41.IMAGE_OPTIONAL_HEADER32.DataDirectory:

        +0078h,结构。

      
 由16个IMAGE_DATA_DIRECTOCR-VY结构线性排列而成。定义PE文件中16中不一致门类的多寡所在的地方和分寸。

  7、数据目录项IMAGE_DATA_DIRECTORY的字段

    42.IMAGE_DATA_DIRECTORY.VirtualAddress:

      
 +0000h,双字。该字段记录了一定数据类型的初阶锐界VA。针对区别的数据结构,该字段包蕴的多寡含义差别。

    43.IMAGE_DATA_DIRECTORY.isize:

        +000四h,双字。该字段记录了特定类型的数据块的长短。

  8、节表项IMAGE_SECTION_HEADER

    44.IAMGE_SECTION_HEADER.Name1

      
 +0000h,8字节。平日是以“\0“结尾的ASCII码字符串”来标识节的称号。内容可自行定义。

    45.IMAGE_SECTION_HEADER.Misc:

        +0008h,双字。

    46.IMAGE_SECTION_HEADER.VirtualAddress

        +000ch,双字。节区的RVA地址。

    47.IMAGE_SECTION_HEADER.SizeOfRawData

        +0010h,双字。节在文书对齐后的尺寸。

    48.IMAGE_SECTION_HEADER.PointerToRawData:

        +0014h,双字。节区初阶数据在文件中的偏移。

    49.IMAGE_SECTION_HEADER.PointerToRelocations:

        +0018h,双字。在“obj”文件中动用,指向重定位表的指针。

    50.IMAGE_SECTION_HEADER.PointerToLinenumbers

        +001ch,双字。行号表的地方。

    51.IMAGE_SECTION_HEADER.NumberOfRelocations

        +0020h,单字。重定位表的个数。(在OBJ文件中运用)

    52.IMAGE_SECTION_HEADER.NumberOfLinenumbers

        +002二h,单字。行号表中行号的数目。

    53.IMAGE_SECTION_HEADER.Characteristics:

        +00贰四h,双字。节的习性。

      
 该字段属于节的质量标志字段,在这之中差异的数目位表示了区别的性质。具体定义如下:
    
   

1、定位标准PE头 DOS
Stub长度不定点,所以DOS头不是三个一定大小的数据结构。DOS头放在PE的苗头地方,通过DO…

CRUISERVA是冲突虚拟地址(Relative Virtual Address)的缩写。LacrosseVA是当PE
文件棉被服装载到内部存储器中后,有个别数据位置相对于文件头的偏移量。

步骤一:循环扫描区块表得出每种区块在内部存款和储蓄器中的开始汉兰达VA(依据IMAGE_SECTION_HEADE汉兰达 中的VirtualAddress
字段),并基于区块的深浅(依据IMAGE_SECTION_HEADE君越 中的SizeOfRawData
字段)算出区块的收尾 SportageVA(两者相加即可),最后判断指标 路虎极光VA
是或不是落在该区块内。
步骤二:通过步骤一定位了指标 奥迪Q三VA 处于具体的某些区块中后,那么用指标 RAV四VA
减去该区块的初阶 OdysseyVA ,那样就能收获指标 RVA 相对于初始地址的偏移量
酷路泽VA二.
手续3:在区块表中获取该区块在文件中所处的晃动地址(依据IMAGE_SECTION_HEADE卡宴中的PointerToRawData 字段), 将这几个偏移值加上步骤二得到的 ENCOREVA2值,就赢得了确实的文本偏移地址。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图