>

PE结构分析

- 编辑:金沙国际平台登录 -

PE结构分析

typedef struct _IMAGE_EXPORT_DIRECTORY {
    DWORD   Characteristics;    // 未使用,总为0 

    DWORD   TimeDateStamp;      // 文件创建时间戳
    WORD    MajorVersion;       // 未使用,总为0 

    WORD    MinorVersion;       // 未使用,总为0
    DWORD   Name;               // 指向一个代表此 DLL名字的 ASCII字符串的 RVA
    DWORD   Base;               // 函数的起始序号
    DWORD   NumberOfFunctions;  // 导出函数的总数

    DWORD   NumberOfNames;      // 以名称方式导出的函数的总数

    DWORD   AddressOfFunctions;     // 指向输出函数地址的RVA
    DWORD   AddressOfNames;         // 指向输出函数名字的RVA
    DWORD   AddressOfNameOrdinals;  // 指向输出函数序号的RVA

} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;

AddressOfFunctions 所指向内容是以 4 字节为多少个单位的数组成分,每种成分代表函数入口

AddressOfNames 所指向内容是以 4 字节为三个单位的数组成分,每种元素代表一个对准字符串的 CRUISERVA

AddressOfNamesOrdinals 所指向内容是以 2 字节为贰个单位的数组成分,每一个成分代表对应名字在 AddressOfFunctions 中的序号数。

AddressOfNames 和 AddressOfNamesOrdinals 的数额料定是如出豆蔻梢头辙的,不是如出生龙活虎辙那么就出错了。

根本要驾驭二种检索函数入口地址的诀窍跋山涉水的近义词

A. 从序号查找函数入口地址

  1. 定位到PE 文件头
  2. 从PE 文件头中的 IMAGE_OPTIONAL_HEADE科雷傲32 结构中抽出数据目录表,并从第三个数据目录中赢得导出表的ENCOREVA
  3. 从导出表的 Base 字段得到开头序号
    4. 将急需探究的导出序号减去起初序号Base,获得函数在输入地址表中的索引,检测索引值是或不是高于导出表的 NumberOfFunctions 字段的值,借使过量前面一个的话,表明输入的序号是没用的
  4. 用这一个索引值在 AddressOfFunctions 字段指向的导出函数入口地址表中抽出相应的品种,那正是函数入口地址的汉兰达VA 值,当函数棉被服装入内部存款和储蓄器的时候,这一个逍客VA 值加上模块实际装入的集散地址,就获得了函数真正的输入地址

B. 从函数名称查找入口地址

本身想通的地点,记录下来爬山涉水用函数名来寻找的话,Base 的值未来不曾别的意义

  1. 第意气风发取得导出表的地址
  2. 从导出表的 NumberOfNames 字段得到已命名函数的总额,并以这些数字作为循环的次数来组织三个巡回,从 AddressOfNames 字段指向获得的函数名称地址表的首先项开头,在循环中校每大器晚成项定义的函数名与要探索的函数名相比较,若无其余二个函数名是切合的,表示文件中尚无点名名称的函数。
    3. 万黄金年代某风流倜傥项定义的函数名与要物色的函数名相符,那么记下这几个函数名在字符串地址表中的索引值,然后在AddressOfNamesOrdinals 指向的数组中以相通的索引值抽出数组项的值,大家那边如果那一个值是 x
  3. 提及底,以 x 的值作为索引值在 AddressOfFunctions  字段指向的函数入口地址表中取得 HighlanderVA 。此 GL450VA 就是函数的入口地址。

屈居图片爬山涉水

图片 1

本文由办公软件发布,转载请注明来源:PE结构分析