我们接下来要学习的有,如果没有加载到这个地

作者: 软件开发  发布:2019-12-05

源代码如下:

图片 1

导出表:

typedef struct _IMAGE_BASE_RELOCATION {
    DWORD   VirtualAddress;
    DWORD   SizeOfBlock;
//  WORD    TypeOffset[1];
} IMAGE_BASE_RELOCATION;
typedef IMAGE_BASE_RELOCATION UNALIGNED * PIMAGE_BASE_RELOCATION;

image.png

  • 上篇文章,我们学习了各样头,Dos,NT,节表头,大家精通,OptionalHeader指向的DataDirectory[]数组风姿罗曼蒂克共有15个:

重定位表是二个数组,那么些数组的深浅记载在 _IMAGE_OPTIONAL_HEADER 的

Dos头:
  • Dos头的前七个字节恒为4D5A(只是充当推断PE文件的第一个标记,并无法因而它就能够看清是还是不是是PE文件卡塔尔(قطر‎

  • Dos头的尾声七个字节是指向NT头的偏移量
    只有前几个字节和前面多个字节关系到PE文件是不是符合规律运营

  • NT头:

![](https://upload-images.jianshu.io/upload_images/5676193-1017ee68ff187eb6.png)

image.png
  • 前面七个字节恒为0x4550,用于推断是不是为PE文件的第二个标识

  • Nt头前边正是各种区段音信

图片 2

.DataDirect‌​ory[IMAGE_DIRECTORY_E‌​NTRY_BASERELOC].Size 成员中

文件头

图片 3

image.png

  • 文件头大小0x11个字节(由图可以预知:它是Nt头的第二个成分卡塔尔(英语:State of Qatar)

  • 扩张头的抑扬顿挫就在在那之中

  • 节的数码也在其间

  • 文件头里面保存了PE文件的局地品质(这里只列举了有的卡塔尔(قطر‎:
    1.是否是dll(0x0210),exe(0x010F)
    2.是还是不是可实行

  • 我们接下去要学习的有:

布局图如下,图片中 0 和 000 都意味16进制数,转变成二进制是  0000 和 0000 0000 0000:

扩展头

图片 4

image.png

图片 5

image.png

  1. IMAGE_DIRECTORY_ENTRY_IMPORT 导入表
  2. IMAGE_DIRECTORY_ENTRY_BASERELOC 基址重定位表
  3. IMAGE_DIRECTORY_ENTRY_EXPORT 导出表
  4. IMAGE_DIRECTORY_ENTRY_RESOURCE 资源表

图片 6

恢宏头安详严整:
typedef struct _IMAGE_OPTIONAL_HEADER {
    //
    // Standard fields.
    //

    WORD    Magic;                          //表示这是一个什么类型的PE文件,32位一般是0x010B,64位的文件一般是0x020B
    BYTE    MajorLinkerVersion;
    BYTE    MinorLinkerVersion;
    DWORD   SizeOfCode;                  //所有代码区段(节)的总大小(基于文件对齐后的大小)
    DWORD   SizeOfInitializedData;            //已经初始化的数据的总大小
    DWORD   SizeOfUninitializedData;        //未初始化的数据的大小
    DWORD   AddressOfEntryPoint;            //程序开始执行的相对虚拟地址,即OEP,这是一个RVA,要想得到VA,则必须要加上ImageBase(下面有介绍!!!!!)
    DWORD   BaseOfCode;              //起始代码的相对虚拟地址(RVA),就是.text段的RVA
    DWORD   BaseOfData;              //  其实数据的相对虚拟地址(RVA),就是.data段的RVA

    //
    // NT additional fields.
    //

    DWORD   ImageBase;                //默认加载地址(如果没有这个基址会发生重定位)
    DWORD   SectionAlignment;          //块对齐数,一般是0x1000
    DWORD   FileAlignment;                    //文件对齐数,一般是0x200
    WORD    MajorOperatingSystemVersion;
    WORD    MinorOperatingSystemVersion;
    WORD    MajorImageVersion;
    WORD    MinorImageVersion;
    WORD    MajorSubsystemVersion;
    WORD    MinorSubsystemVersion;
    DWORD   Win32VersionValue;
    DWORD   SizeOfImage;                      //把文件加载进内存,所需要的内存大小,是进行了内存对齐之后的大小
    DWORD   SizeOfHeaders;                //所有头部大小(这是按照文件对齐后的大小),也是文件主体相对文件起始的偏移,是所有头 节表的大小
    DWORD   CheckSum;
    WORD    Subsystem;
    WORD    DllCharacteristics;                    //文件(包括exe和dll文件)特征标志(见下面一张图)
    DWORD   SizeOfStackReserve;                   //表示进程中栈可以增长到的最大值,一般1M
    DWORD   SizeOfStackCommit;                    //进程中栈的初始值,据说也是栈每次分配增长的值,一般4KB
    DWORD   SizeOfHeapReserve;                      //表示进程中堆可以增长到的最大值,一般1M
    DWORD   SizeOfHeapCommit;                        //进程堆的初始值
    DWORD   LoaderFlags;
    DWORD   NumberOfRvaAndSizes;      //数据目录的个数,也就是下面那个数组中元素的个数
    IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];//数据目录表,比较重要!
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

图片 7

image.png

扩张头里面前遇到比根本的在下边已经做出注释

  • 昨天我们上学导出表:

各个元素的深浅都记载在 SizeOfBlock 中,那些因素是由 一个 _IMAGE_BASE_RELOCATION 构造体和三个TypeOffset 数组组成的。TypeOffset 数组的每一个成分占2个字节,当中,高4位是偏移类型(type),低10位表示需求重平昔之处(Offset),即,它与 VirtualAddress 相加便是指向 PE 映像中要求修正的不行代码的奥德赛VA。

再小结一波:

ImageBase(影象基址,装载基址,它是三个VA值卡塔尔(قطر‎:若无加载到那一个地址则会重一直(便是PE文件加载进内部存款和储蓄器之后,就一定于明白了Dos头之处,然后就能够领略别的的岗位了卡塔尔(قطر‎,正是PE装入内部存款和储蓄器的营地址,私下认可景况下,EXE文件在内部存款和储蓄器中的集散地址是0X0040 0000,DLL文件为0x0100 0000,由编写翻译器决定!
程序入口点(OEP卡塔尔
印象大小(SizeOfImage卡塔尔(قطر‎------------>把文件加载进内部存款和储蓄器,所急需的内部存款和储蓄器大小(注意是进行了块对齐之后卡塔尔(قطر‎
代码大小(SizeOfCode卡塔尔(قطر‎------>全部区段的总大小
代码基址(BaseOfCode卡塔尔(قطر‎初叶代码的 EscortVA---->.text的XC60VA
数量基址(BaseOfData卡塔尔开头数据的本田CR-VVA----->.data的SportageVA
头大小(SizeOfHeaders卡塔尔------------>全数底部大小,正是文件中央相对文件开首的摆荡
内部存款和储蓄器对齐(SectionAlignment卡塔尔国----------->为0x1000(4KB卡塔尔(英语:State of Qatar)
文本对齐(FileAlignment卡塔尔(قطر‎---------------->200h(0x200卡塔尔
DLL标记(DllCharacteristics卡塔尔-------->提示Dll特征的表明

  1. 咱俩知道dll文件,是动态链接库,里面有那多少个函数给旁人调用,然则人家怎么精晓此中有何函数呢?就需求导出表项目清单给每户看,就不啻你去餐厅点餐,却不知底餐厅有何样菜,这时候推销员会拿出美食指南来,那几个菜单就仿佛导出表。
  2. 具备PE文件都得以有导出表,只是超越三成场地下,exe不提供导出表而已。

偏移类型的含义如下:

PE尾部包蕴了Dos头,平昔到节表的终结地点,.text区段先河此前
  • 数量目录表
![](https://upload-images.jianshu.io/upload_images/5676193-cfbc56c21cd7568f.png)

image.png
  • 大家清楚OptionalHeader指向的DataDirectory[]数组生龙活虎共有19个,每一个无差别的构造:

本文由巴黎人游戏官网发布于软件开发,转载请注明出处:我们接下来要学习的有,如果没有加载到这个地

关键词: 巴黎人游戏