PE结构分析

图片 1

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
字节为二个单位的数组成分,各样元素代表二个针对字符串的 LacrosseVA

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

AddressOfNames 和 AddressOfNamesOrdinals
的数码肯定是平等的,不是平等那么就出错了。

注重要控制二种检索函数入口地址的艺术:

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

  1. 定位到PE 文件头
  2. 从PE 文件头中的 IMAGE_OPTIONAL_HEADE凯雷德32
    结构中收取数据目录表,并从第贰个数据目录中拿到导出表的奥迪Q5VA
  3. 从导出表的 Base 字段得到起先序号
    4.
    将急需查究的导出序号减去开首序号Base,拿到函数在进口地址表中的索引,检验索引值是或不是超越导出表的
    NumberOfFunctions 字段的值,如若过量前者的话,表达输入的序号是不行的
  4. 用这一个索引值在 AddressOfFunctions
    字段指向的导出函数入口地址表中抽出相应的品种,那正是函数入口地址的PAJEROVA
    值,当函数棉被服装入内部存款和储蓄器的时候,那些锐界VA
    值加上模块实际装入的营地址,就得到了函数真正的输入地址

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

PE结构分析。小编想通的地点,记录下来:用函数名来搜寻的话,Base
的值以后从不别的意义

  1. 先是获得导出表的地址
  2. 从导出表的 NumberOfNames
    字段获得已命名函数的总额,并以那几个数字作为循环的次数来布局多少个巡回,从
    AddressOfNames
    字段指向获得的函数名称地址表的首先项起先,在循环中将每后生可畏项定义的函数名与要查究的函数名相相比较,若无其他一个函数名是符合的,表示文件中尚无点名名称的函数。
    3.
    假使某生龙活虎项定义的函数名与要物色的函数名相符,那么记下这些函数名在字符串地址表中的索引值,然后在AddressOfNamesOrdinals
    指向的数组中以同黄金时代的索引值收取数组项的值,大家这里倘使那几个值是 x
  3. 终极,以 x 的值作为索引值在 AddressOfFunctions 
    字段指向的函数入口地址表中拿走 凯雷德VA 。此 奥迪Q7VA 正是函数的入口地址。

附上海体育地方片:

图片 1

admin

网站地图xml地图