二进制文件概述

365bet体育在线网投 1

如FileOffset = 435(文件偏移地址)

   
因为大家的文件是储存在磁盘上的,有个别数据相对于文件头的偏移量正是其一数额的舞狮地址,称为文件偏移地址(File
Offset)可能物理地址(RAW Offset),偏移地址的开头值是0。

Windows下的动态链接

  • 在ELF中,由于代码段是地点无关的,所以它能够落成四个进度之间共享一份代码,但是DLL的代码却并不是地点毫无干系的,所以它只是在好几景况下能够被多少个经过间共享。

  • PE文件里有七个常用的定义正是基地址(Base
    Address)
    相对地址(HighlanderVA,Relative Virtual
    Address)
    。营地址就是PE头文件中的Image
    Base,是PE文件被装载进进程地址空间中的初叶地址,
    对于EXE文件来说,其值1般是0x伍仟00,对于DLL文件来讲,其值1般是0x一千0000。而相对地址便是一个地点相对于营地址的舞狮。

  • ELF暗许导出富有的全局符号。可是在DLL中,我们须求显式地“告诉”编写翻译器大家要求导出有个别符号,不然编写翻译器暗中认可全部符号都不导出。在VC++中,我们运用“__declspec(dllexport)”表示DLL导出符号,使用“__declspec(dllimport)”表示DLL导入符号。除了选取导出导入符号外,大家也能够利用“.def”文件中的IMPORT恐怕EXPORTS段来声称导入导出符号。这几个点子不仅对C/C++有效,对任何语言也使得。

  • 使用.def文件来叙述DLL文件导出属性的亮点有七个,壹是足以调整导出符号的暗号名,而是能够操纵一些链接的进程。

  • Windows提供叁个API来协理DLL的运作时链接,分别是LoadLibrary(LoadLibraryEx):装载DLL,GetProcAddress:获取有个别符号的地点,FreeLibrary:卸载DLL。

  • 在Windows PE中,全部导出的标记被集中存放在导出表(Export
    Table)
    的布局中。从最轻易易行的布局上来看,它提供了三个标志名与符号地址的照耀关系。导出表是一个IMAGE_EXPORT_DIRECTORY结构体,定义在“Winnt.h”中:

typedef struct _IMAGE_EXPORT_DIRECTORY {
    DWORD   Characteristics;
    DWORD   TimeDateStamp;
    WORD    MajorVersion;
    WORD    MinorVersion;
    DWORD   Name;
    DWORD   Base;
    DWORD   NumberOfFunctions;
    DWORD   NumberOfNames;
    DWORD   AddressOfFunctions;     // RVA from base of image
    DWORD   AddressOfNames;         // RVA from base of image
    DWORD   AddressOfNameOrdinals;  // RVA from base of image
} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;

365bet体育在线网投 2

  • 导出表结构中,最终一个成员推行3个数组,分别是导出地址表(EAT,Export
    Address Table)
    标志名表(Name
    Table)
    名字序号对应表(Name-Ordinal Table)

  • 导出地址表中存放的是逐1导出函数的奇骏VA,符号名表中存放的是导出函数的名字。序号表实际是初期1几人windows为了应对内部存储器小而利用的建制。使用序号导入导出的收益正是省去了函数名查找进度,函数名表也不必要保留到内部存款和储蓄器中。可是它最大的标题正是八个函数的序号恐怕会转移。那就供给程序员手工内定每种导出函数的序号。由于目前硬件品质的升迁,那种内部存款和储蓄器空间的节约和查找速度的进步效益就不显著了。所以今后那种措施为主就不选拔了,可是为了维持向后十分,它依旧被封存了下去。

  • 动态链接器怎么着查找函数牧马人VA呢?假使模块A导入了Math.dll中的Add函数,那么A的导入表中就封存了“Add”这一个函数名。当进行动态链接时,动态链接器在Math.dll的函数名表中实行二分查找,找到“Add”函数,然后在名字序号对应表中找到“Add”所对应的序号,即一,减去Math.dll的Base值一,结果为0,然后在EAT中找到下标0的要素,即“Add”的TiggoVA为0x一千。

  • 在ELF中,“.rel.dyn”和“.rel.plt”四个段中分头保存了该模块所急需导入的变量和函数的号子以及所在的模块等音讯,而“.got”和“.got.plt”则保留着这一个变量和函数的真的地址。Windows中也有近似机制,叫做导入表(Import
    Table)
    。当有些PE文件被加载时,Windows加载器的中间多个任务就是将有所需求导入的函数地址明确并且将导入表中的因素调控到科学的地址,以促成动态链接的历程。

  • 导入表是一个IMAGE_IMPORT_DESC猎豹CS陆IPTO奥迪Q5结构体数组,每3个IMAGE_IMPORT_DESC猎豹CS陆IPTOHighlander结构对应3个被导入的DLL。它也被定义在“Winnt.h”中:

typedef struct _IMAGE_IMPORT_DESCRIPTOR {
    union {
        DWORD   Characteristics;            // 0 for terminating null import descriptor
        DWORD   OriginalFirstThunk;         // RVA to original unbound IAT (PIMAGE_THUNK_DATA)
    } DUMMYUNIONNAME;
    DWORD   TimeDateStamp;                  // 0 if not bound,
                                            // -1 if bound, and real date\time stamp
                                            //     in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND)
                                            // O.W. date/time stamp of DLL bound to (Old BIND)

    DWORD   ForwarderChain;                 // -1 if no forwarders
    DWORD   Name;
    DWORD   FirstThunk;                     // RVA to IAT (if bound this IAT has actual addresses)
} IMAGE_IMPORT_DESCRIPTOR;
  • 结构体中的FirstThunk指向一个导入地址数组(IAT,Import Address
    Table)
    ,IAT中各种成分对应2个被导入的号子,成分的值在不相同的情况下有不一样的意思。在动态链接器刚完结映射还尚未从头重平素和标识解析时,IAT中的成分值表示相呼应的导入符号的序号只怕是符号名;当Windows的动态链接器在成功该模块的链接时,成分值会被动态链接器改写成该符号的的确地址,从这一点看,导入地址数组与ELF中的GOT万分接近。(INT)

  • 为了使得编写翻译器能够区分函数是从外部导入的或许模块内部定义的,MSVC引进了“__declspec(dllimport)”的扩张属性,一旦二个函数被声称为“__declspec(dllimport)”,那么编写翻译器就驾驭它是外表导入的,以便发生相应的下令方式。比如:CALL
    DWORD PTR
    [0x0040D11C]
    。那其中的IAT表成分地址0x0040D1一C也是相对地址,那也是急需后边更正的。所以能够观望PE结构中,DLL的代码段并非地点非亲非故的,所以Windows系统正是大气,根本不像Linux那么在意代码段指令的再度使用。

  • 因为PE未有类似ELF的全局符号参与难题,所以对于模块内部的大局函数调用,编写翻译器产生的都以直接调用指令CALL
    XXXXXXXX
    (不是周旋地址偏移,是平素地址调用。那是因为Windows
    PE下,任何一个PE文件在编写翻译时都会付出自个儿的八个优先装载地点,然后依据此岗位爆发壹雨后玉兰片的永久,当然那一个相对地址是亟需在其实装载运营时再重新勘误的,选择了1种重定集散地址的不2法门)。

        = VA – Image Base – (相对虚拟偏移量 – 文件偏移量)

365bet体育在线网投,文本虚拟偏移地址和文件物理偏移地址的总结公式如下:

 

动态链接

  • 缘何要动态链接?

    • 静态链接的方法对于Computer内部存储器和磁盘的上空浪费十三分严重。
    • 静态链接对于程序的立异、安插和揭橥也会带动好多劳动。
  • 在Linux系统中,ELF动态链接文件被改为动态共享对象(DSO),简称共享对象,它们一般都以以“.so”为扩大名的有个别文书;而在Windows系统中,动态链接文件被改成动态链接库(DLL),它们平常是以“.dll”为扩张名的公文。

  • 静态链接的重定位叫链接时重一贯(Link Time
    Relocation),而动态链接的重定位为装载时重向来(Load Time
    Relocation),在Windows中,那种装载时重一向又被叫做基址重新初始化(Rebasing)。在Linux和GCC中即使利用“-shared”参数,输出的共享对象正是采用的装载时重一向。

  • 把指令中那一个急需修改的有的分离出来,跟数据部分放在一同,那样指令部分就足以保持不变,而数据部分能够在各样进程中具有3个别本,那种方案正是地点无关代码(PIC)技艺。在Linux共享对象中要转换地址无关代码只用在编写翻译是带上参数-fPIC。

365bet体育在线网投 3

  • 地方的气象并未包蕴定义在共享模块内部的全局变量。ELF共享库在编译时,暗中认可都把定义在模块内部的全局变量当做定义在别的模块的全局变量,也正是说当做上海体育场合中的类型(肆),通过GOT来促成变量的访问。当共享模块棉被服装载时,假诺有些全局变量在可实施文件中具有副本,那么动态链接器就会把GOT中的相应地方指向该别本,那样该变量在运作时实际上最后就唯有一个实例。若是变量在共享模块中被初阶化,那么动态链接器还索要将该初叶化值复制到主模块中的变量别本;假使该全局变量在程序主模块中从不别本,那么GOT中的相应地方就针对模块内部的该变量别本。

  • 对此共享对象的话,纵然数额段中有相对地址引用,那么编译器和链接器就会发生三个重定位表,那一个重定位表里面包括了“索罗德_386_RELATIVE”类型的重定位入口。当动态链接器装载共享对象时,假如发现该共享对象有这么的重定位入口,那么动态链接器就会对该共享对象举行重平素。

  • 大家在编写翻译共享对象时一旦利用“-fPIC”参数,就意味着要产生地址非亲非故的代码段。GCC编写翻译动态链接的可施行文件会默许带上该参数的。假诺不采用该参数就会生出二个装载时重一向的共享对象,它的代码段就不是地方非亲非故的,也就无法被多个经过之间共享,于是就失去了节约内部存款和储蓄器的长处。不过装载时重平素的共享对象的运维速度要比使用地方非亲非故代码的共享对象快,因为它省去了地方非亲非故代码中年老年是访问全局数据和函数时需求做一遍计算当前地方以及直接地址寻址的进度。

  • 动态链接比静态链接慢的第三原因是动态链接下对于全局和静态的数码访问都要进行复杂的GOT定位,然后直接寻址;对于模块间的调用也要先稳住GOT,然后再拓展直接跳转,那恐怕会导致程序运行可能运转速度减慢,所以大家需求优化动态链接品质。

  • ELF采取延迟绑定来优化动态链接品质,基本思维是当函数第3次被用到时才开始展览绑定(符号查找、重从来等)。具体方法是应用了PLT(Procedure
    Linkage
    Table)。PLT为GOT直接跳转又追加了一个中间层,在调用有个别外部模块的函数时,并不间接通过GOT跳转,而是经过二个叫作PLT项的组织来进展跳转。每一个外部函数在PLT中都有2个一见依然的项。(汇编指令完毕)

365bet体育在线网投 4

  • 实际的PLT基本构造代码如下:

PLT0:
push *(GOT +4)
jump *(GOT+8)

...

bar@plt:
jmp *(bar@GOT)
push n
jump PLT0
  • 在动态链接情形下,操作系统在装载完可推行文件之后会先运行三个动态链接器,之后就将调控权交给动态链接器的入口地址。当动态链接器获得调整权之后,它开始实行一密密麻麻自己的起始化操作,然后依据当下的环境参数,开头对可实践文件举行动态链接职业。当全部动态链接工作实现以往,动态链接器会将调节权交到可实践文件的进口地址,程序开头正儿8经实行。

  • 动态链接相关协会

    • “.interp”段:里面保存的便是一个字符串,那一个字符串正是可试行文件所急需的动态链接器的不二等秘书技。
    • “.dynamic”段:ELF文件中最重大的布局,保存了借助于怎样共享对象、动态链接符号表的地方、动态链接重定位表的地方、共享对象初阶化代码的地址等音讯。
    • “.dynsym”段:动态符号表,表示动态链接模块之间的号子导入导出关系。
    • “.rel.dyn”段:数据援引重平素,纠正“.got”以及数据段。
    • “.rel.plt”段:函数引用重平素,校勘“.got.plt”。
  • 动态链接基本上分为3步:先是运行动态链接器自身(自举,bootstrap),然后装载全部必要的共享对象,最终是重平昔和起初化。(跳转)

  • 完了大旨自举以后,动态链接器将可实践文件和链接器本身的标记表都合并到二个大局符号表中。在Linux中,当二个标识须求被投入全局符号表时,如若同样的符号名曾经存在,则后进入的号子被忽视(全局符号插足难点)。

  • 当上边的手续完结之后,链接器开端重新遍历可实行文件和各类共享对象的重定位表,将它们的GOT/PLT中的每一种供给重一向的岗位举办纠正。

  那万一有用户须要收取高出实际金额数如何是好,操作系统原理中有“虚拟内部存款和储蓄器”概念,
即在那种情景下有时会将“部分硬盘空间”权且作为内部存款和储蓄器使用。(两者“虚拟内部存款和储蓄器“概念对象区别,不宜混为一谈)

ImageBase = 00400000 (基地址)

在PE的文本头中,首个DWO奇骏D Signature,
被定义为了0x00004550h,也正是”PE\0\0″那多少个字符。那一个标识未有何样意义。(DOS中针对的地方)。

DLL优化

  • DLL的代码段和数码段本人并不是地方毫不相关的,也便是说它暗中同意须求棉被服装载到由ImageBase钦赐的对象地方中。即使目的地方被占用,那么就供给装载到任哪儿方,便会唤起上上下下DLL的Rebase。那对于具备大量DLL的顺序来讲,频繁的Rebase也会促成程序运转缓慢。那是熏陶DLL品质的3个缘故

  • 动态链接进度中,导入函数的号子在运转时索要被每个解析。在这些分析进度中,免不了涉及到符号字符串的可比和探究进程,那一个查找进程中,动态链接器会在对象DLL的导出表中张开符号字符串的二分查找。就算是行使了二分查找法,对于具有DLL数量众多,并且有大气导入导出符号的次第来讲,这几个历程照旧是十一分耗费时间的。那是熏陶DLL品质的另一个原因

  • Windows
    PE选拔了装载时重一直来化解共享对象的地方争论问题。那一个重平素进度某些至极,因为具备这一个供给重一贯的地点只供给丰富贰个固定的差值,也正是说加上三个对象装载地方与实际装载地方的差值。这第贰得益于DLL内部的地点都以基于营地址的,恐怕就像是绝对于营地址的RVA。所以那种重定位进程比一般的重定位要简明,速度越来越快1些。PE里把那种特别的重定位进度叫做重定营地址(Rebasing)

  • MSVC的链接器提供了钦点输出文件的营地址的效益。能够在链接时使用link命令中的“/BASE”参数来钦命集散地址。比如:link
    /BASE:0x100100000, 0x10000 /DLL bar.obj

  • Windows系统自己自带繁多体系的DLL,基本上Windows的应用程序运行时都要用到。Windows系统就在进程空间中尤其划出一块0x80000000~0x八千0000区域,用于映射这几个常用的种类DLL。Windows在安装时就把那块地点分配给这么些DLL,调控那几个DLL的营地址使得它们互相之间不顶牛,从而在装载时就不供给进行重定基址了。

  • 每一次二个程序运营时,全部被正视的DLL都会棉被服装载,并且一名目繁多的导入导出符号重视关系都会被重复分析。在许多情况下,那么些DLL都会以平等的逐①棉被服装载到同壹的内部存款和储蓄器地址,所以它们的导出符号的地点应该都以不改变的,既然这么些标识的地址不变,那程序主模块的导入表应该如故和上次程序运维时1致,故而能够保存下去,那样就足以节省每一次运行时符号解析的进度。这种方法称为DLL绑定。

  • 在PE的导入表中有一个和IAT同样的数组叫做INT正是用来保存绑定符号的地址的。一旦检查测试到INT里面有音信,则不须求再行张开标志重定位了,假若境遇难题(如借助的DLL更新,DLL装载顺序打乱了和此前装载地方不均等),导致INT中绑定符号消息失效,则也能够依靠IAT的消息再重来1遍重一向。Windows系统中众多体系自带程序便利用DLL绑定用以加快程序运维。

  可实行文件:包含2进制代码,字符串,菜单,Logo,位图字体等。

FileOffset = VA – ImageBase – VEvoquek = 0040一千 – 00陆仟00 – C00 = 400(文件物理地址的偏移地址)

 

参考小说

Windows下动态链接之二:DLL优化加快
怎么通晓DLL不是地方无关的?DLL与ELF的相比分析

365bet体育在线网投 5

+———+———+———+———+———+———+

     
在PE文件中,有贰个字符设置了营地址,VC++建立的exe文件的集散地址是0x00四千00h,DLL文件的集散地址是0x一千0000h。

可试行文件的装载与经过

  • 种种程序都怀有本身单独的虚拟地址空间,这些空间尺寸由Computer硬件平台决定(理论上的最大上限)。比如,叁拾伍位硬件平台的虚拟地址空间的地点为0到②32-1,即0x000000000xFFFFFFFF,总共大概4G;而64位硬件平台的虚拟地址空间地址为0到2<sup>64</sup>-1,即0x00000000000000000xFFFFFFFFFFFFFFFF,大约有171798691捌四G。在3十四位平台上,Linux操作系统中四G的虚拟地址空间会被分开为几个部分,从0xC0000000到0xFFFFFFFF共一G的地点空间被分配给了操作系统,剩下的从0x00000000到0xBFFFFFFF共三G的地址空间是预留进度的。从原则上讲,大家经过最多能使用3G的虚拟地址空间。对于Windows操作系统来讲,它的长河虚拟地址空间划分是操作系统占用2G,进度只剩余二G。对于一些主次来讲2G虚拟空间太小,所以Windows有个运维参数可以将操作系统占用的虚拟地址空间压缩到壹G。方法如下:修改Windows系统盘根目录下的boot.ini,加上“/叁G”参数。

365bet体育在线网投 6

  • 动态装载的两种典型情势是覆盖装入和页映射,覆盖装入在并未有表达虚拟存款和储蓄在此以前运用比较常见,将来壹度差不离被淘汰了。页映射一言以蔽之就是操作系统将顺序须求利用的页按自然的算法动态映射到轮廓内部存款和储蓄器中实施。

  • 从操作系统的角度来看,三个历程最重大的性状是它有着独立的虚拟地址空间,那使得它有别于别的进度。二个经过的树立有三步:

    • 首先是开创虚拟地址空间。
    • 读取可实行文件头,并且建立虚拟空间与可推行文件的照耀关系。(可推行文件装载中最根本的一步,也是守旧意义上的“装载”)
    • 将CPU指令寄存器设置成可实施文件入口,运行运维。
  • 作者们知晓,当程序实践发生页错误时,操作系统将从物理内部存款和储蓄器中分配多个物理页,然后将该“缺页”从磁盘中读取到内部存储器中,再安装缺页的虚拟页和物理页的炫人眼目关系,那样程序才得以符合规律运营。可是很明朗的1些是,当操作系统捕获到缺页错误时,它应明白程序当前所需求的页在可实施文件中的哪2个职位。那就是虚构空间与可实践文件之间的映照关系。

365bet体育在线网投 7

  • ELF文件被映射时,是以系列的页长度作为单位的。为制止内存浪费,操作系统在装载可推行文件时根本关心的只是文件中央的权能(可读、可写、可实行)。对于同壹权限的段,把它们统1到一起作为二个段进展览放映射。Linux中将进程虚拟空间中的三个段叫做虚拟内部存款和储蓄器区域(VMA),在Windows大校这些称呼虚拟段(Virtual
    Section)。许多情景下,二个进度中的堆和栈分别都有1个对应的VMA。操作系统在进程运转前会将系统的环境变量和进程的周转参数提前保存到进度的虚拟空间的栈中(也正是VMA中的stack
    VMA)。

  • PE文件的装载和ELF有所差异,在PE文件中,全数段的序幕地址都以页的倍数,段的长短借使不是页的平头倍,那么在炫丽时向上补齐到页的整数倍。由于那个特点,PE文件的酷炫进程比ELF轻易得多,因为它无需考虑如ELF里面多数段地址对齐之类的主题材料,固然这么会浪费1些磁盘和内部存款和储蓄器空间。

  • PE文件中,链接器在生育可施行文件时,往往将全部的段尽也许地集合,所以1般唯有代码段、数据段、只读数据段和BSS等为数不多的多少个段。

  • 每种PE文件在装载时都会有2个装载目的地方,这些地点正是营地址,集散地址不是原则性的,每一回装载时都只怕会转移。所以PE文件中有2个常见术语叫相对虚拟地址(君越VA),它是相持于PE文件的装载集散地址的三个偏移地址。那样无论营地址怎么变卦,PE文件中的各样汉兰达VA都保持一致。

  • WIndows PE文件的装载进度:

    • 先读取文件的率先个页(包括DOS头,PE文件头和段表)。
    • 反省进度地址空间中,目标地址是不是可用,即使不可用,则其它选一个装载地方。(首要针对DLL装载)
    • 选拔段表中提供的音讯,将PE文件中具有的段11映射到地点空间中相应的地点。
    • 假定装载地方不是目标地方,则张开Rebasing
    • 装载全部PE文件所急需的DLL文件。
    • 对PE文件中的全体导入符号实行辨析。
    • 听他们讲PE头中内定的参数,建立起初化堆和栈。
    • 树立主线程并且运转进度。

  Windows内存:一.概略内部存款和储蓄器层面;二.虚拟内存层面。

FileOffset = VA – ImageBase – VRk = 00401325 – 00400000 – C00 = 725

选择学习工具:有StudyPE、LordPE、PEID。

装载与动态链接

PE文件与虚拟内存之间的映照

|  .text   00001000   00000092  00000400  00000200  60000020|

 LONG
e_lfanew是指向PE文件头的八个地址,它的公文偏移地址是0x3C–约等于60字节初叶,然后占有了五个字节,指向PE文件头,具体看下图

  那么就能够总括出:

二、汇编中虚拟地址(VRA)与公事偏移地址(FileOffset)的相互调换:

 这个IMAGE_OPTIONAL_HEADE福特Explorer只须要关心一些最主要字段就行了,记住。。

  FileOffset = VA – Image Base -节偏移

途乐VA是争辩虚拟地址(Relative Virtual
Address)的缩写,顾名思义,它是一个“相对”地址,也能够说是“偏移量”,PE文件的各类数据结构中关系到地点的字段超过45%都是以哈弗VA表示的。

“This program cannot be run is MS-DOS
mode”,DOS底部中非常重若是WO奥迪Q伍D e_magic和 LONG
e_lfanew这么些字段比较首要。那一个数据结构能够在winnt.h中找到。

      文件偏移量 = 0x0040414壹 – 0x00伍仟00(暗中认可的Image
Base)-(0x一千 – 0x400)(代码存于.text文件中) = 0x35四1

 

#ifdef _WIN64             //如果采用64的架构
    typedef IMAGE_OPTIONAL_HEADER64 IMAGE_OPTIONAL_HEADER;
    typedef PIMAGE_OPTIONAL_HEADER64 PIMAGE_OPTIONAL_HEADER;
#define IMAGE_SIZEOF_NT_OPTIONAL_HEADER IMAGE_SIZEOF_NT_OPTIONAL64_HEADER
#define IMAGE_NT_OPTIONAL_HDR_MAGIC IMAGE_NT_OPTIONAL_HDR64_MAGIC
#else  /* _WIN64 */      //如果不是采用64而是32位的架构
    typedef IMAGE_OPTIONAL_HEADER32 IMAGE_OPTIONAL_HEADER;
    typedef PIMAGE_OPTIONAL_HEADER32 PIMAGE_OPTIONAL_HEADER;
#define IMAGE_SIZEOF_NT_OPTIONAL_HEADER IMAGE_SIZEOF_NT_OPTIONAL32_HEADER
#define IMAGE_NT_OPTIONAL_HDR_MAGIC IMAGE_NT_OPTIONAL_HDR32_MAGIC
#endif /* _WIN64 */ //上面的typedef都是改变结构体的名称

    typedef struct _IMAGE_NT_HEADERS64 {//这里是64位的PE头的结构体的定义
      DWORD Signature;
      IMAGE_FILE_HEADER FileHeader;
      IMAGE_OPTIONAL_HEADER64 OptionalHeader;
    } IMAGE_NT_HEADERS64,*PIMAGE_NT_HEADERS64;

    typedef struct _IMAGE_NT_HEADERS {//这里是32位的PE头的结构体的定义
      DWORD Signature;
      IMAGE_FILE_HEADER FileHeader;
      IMAGE_OPTIONAL_HEADER32 OptionalHeader;
    } IMAGE_NT_HEADERS32,*PIMAGE_NT_HEADERS32;

  按上表,比如总括虚拟内部存款和储蓄器中0x004041四一处的一条指令,要换算出该指令在文书中的偏移量:

 

     
当PE文件棉被服装载器装载了后头,内部存储器中的板块被称之为模块。映射文件的原初地址被誉为模块句柄—内部存储器中的模块代表那进度从那些可试行文件中所要求的代码、数据、能源、输入表、输出表及别的东西所利用的事物放在1个连接的内部存款和储蓄器块中。在装载中,PE文件的1个字段会告诉系统把文件映射到内部存款和储蓄器必要有些内存,不可能被映射的多寡被放置在文件的尾巴。

  典型PE文件壹般包罗:.text(编写翻译器产生,存放2进制代码,
反汇编和调剂的对象)、.data(初叶化数据块)、.idata(使用的外来函数如动态链接库与公事新闻)、.rsrc(存放程序能源),还包涵此外如.reloc、.edata、.tls、.rdata等。

|  段名称   虚拟地址  虚拟大小  物理地址  物理大小   标记   |

MS-DOS头部(IMAGE_DOS_HEADER):

  PE(Portable
Executable)是win32平台下可实施服从的数码格式。日常左近的诸如*.exe和*.dll都是PE文件。

+———+———+———+———+———+———+

那是1个十八个人的数组,最有一个数组元素作为保留,全体为0,别的的从上马一贯到尾数第叁个数据都是早已鲜明好了的,大家看一下以此数目目录表成员

发表评论

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