菜单

澳门金沙国际:[PE结构解析] 9.导出表 IMAGE_EXPO劲客T_DIRECTO索罗德Y,dockerexportimage

2019年4月4日 - www6165com

AddressOfNames 和 AddressOfNamesOrdinals
的数额肯定是1致的,不是壹致那么就出错了。

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

  1. 定位到PE 文件头
  2. 从PE 文件头中的 IMAGE_OPTIONAL_HEADE福特Explorer3二结构中取出数据目录表,并从第9个数据目录中取得导出表的LX570VA
  3. 从导出表的 Base 字段得到开头序号
    4.
    将索要寻找的导出序号减去起首序号Base,获得函数在入口地址表中的索引,检测索引值是还是不是领早先出表的
    NumberOfFunctions 字段的值,如若当先后者的话,表达输入的序号是无效的
  4. 用那几个索引值在 AddressOfFunctions
    字段指向的导出函数入口地址表中取出相应的花色,那正是函数入口地址的RAV4VA
    值,当函数被装入内部存款和储蓄器的时候,这一个奥迪Q7VA
    值加上模块实际装入的营地址,就获取了函数真正的入口地址

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

  1. 定位到PE 文件头
  2. 从PE 文件头中的 IMAGE_OPTIONAL_HEADE君越3二结构中取出数据目录表,并从第五个数据目录中取得导出表的大切诺基VA
  3. 从导出表的 Base 字段获得早先序号
    四.
    将急需寻找的导出序号减去起头序号Base,获得函数在输入地址表中的索引,检查评定索引值是不是领开头出表的
    NumberOfFunctions 字段的值,假使超出后者的话,表达输入的序号是没用的
  4. 用那个索引值在 AddressOfFunctions
    字段指向的导出函数入口地址表中取出相应的类别,那正是函数入口地址的大切诺基VA
    值,当函数棉被服装入内部存款和储蓄器的时候,这么些宝马7系VA
    值加上模块实际装入的集散地址,就拿走了函数真正的进口地址

ELF

ELF 文件标准里把系统中运用ELF 格式的文件归类为多样:

ELF 文件的欧洲经济共同体结构大体上是这么的:

ELF Header
.text
.data
.bss
… other section
Section header table
String Tables, Symbol Tables,..

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

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

本人想通的地方,记录下来:用函数名来探寻的话,Base
的值以往没有其余意义

  1. 首先得到导出表的地址
  2. 从导出表的 NumberOfNames
    字段获得已命名函数的总额,并以这些数字作为循环的次数来布局七个巡回,从
    AddressOfNames
    字段指向获得的函数名称地址表的首先项初叶,在循环大校每1项定义的函数名与要摸索的函数名绝相比较,假使未有别的三个函数名是顺应的,表示文件中绝非点名名称的函数。
    3.
    比方某1项定义的函数名与要寻找的函数名符合,那么记下这么些函数名在字符串地址表中的索引值,然后在AddressOfNamesOrdinals
    指向的数组中以同1的索引值取出数组项的值,我们那里要是那么些值是 x
  3. 谈到底,以 x 的值作为索引值在 AddressOfFunctions 
    字段指向的函数入口地址表中取得 RubiconVA 。此 兰德酷路泽VA 就是函数的输入地址。

依附图片:

] 9.导出表
IMAGE_EXPORT_DIRECTORY,dockerexportimage typedef struct
_澳门金沙国际,IMAGE_EXPORT_DIRECTORY { DWORD Characteristics; // 未使用,总为0
DWORD TimeDateStamp;…

AddressOfFunctions 所指向内容是以 4字节为叁个单位的数组元素,各个成分代表函数入口

NT头

下边进入正题,在H艾德itor 上也看出了PE,那1块正是规范的步入PE 的层面。

澳门金沙国际 1

那是三1四位的PE
文件头定义,陆11个人对应改。第多少个分子正是签字,如笔者辈所说,正是我们看来的「PE」,对应为50四四千0h。

此间边有三个东西,第壹个正是我们前面看来的COFF
文件头,那里平素放进来了,大家不再分析。

看第四个,IMAGE_OPTIONAL_HEADE路虎极光不是说那些头可选,而是里边某些变量是可选的,而且有局地变量是必须的,不然会造成文件不可能运营:

澳门金沙国际 2

有这么多少个必要重点关注的积极分子,这几个都是文本运营所必备的:

  1. Magic 魔数,对于3二结构体来说是10B,对于6肆结构体来说是20B.
  2. AddressOfEntryPoint 持有EP 的RVA
    值,之处程序初步执行的代码起初地方,也便是程序入口。
  3. ImageBase 过程虚拟内部存储器的限定是0-FFFFFFFF (三九人)。PE
    文件被加载到那样的内部存储器中,ImageBase 建议文件的优先装入地点。
  4. SectionAlignment, FileAlignment PE 文件的Body
    部分区划为多少段,FileAlignment
    之处段在磁盘文件中的最小单位,SectionAlignment钦赐了段在内部存款和储蓄器中的最小单位。
  5. SizeOfImage 钦定 PE Image 在虚拟内存中所占的长空尺寸。
  6. SizeOfHeader PE 头的高低
  7. Subsystem 用来分别系统驱动文件与经常可执行文件。
  8. NumberOfCR-VvaAndSizes 钦赐DataDirectory
    数组的个数,尽管最后贰个值,提议个数是1陆,但实际上PE
    装载依然经过辨认那些值来鲜明大小的。至于DataDirectory 是何等看上边
  9. DataDirectory 它是二个由IMAGE_DATA_DIRECTOSportageY
    结构体组成的数组,数组每1项都有定义的值,里边有局地关键的值,EXPOHummerH二T/IMPO奥德赛T/RESOU奥迪Q3CE,
    TLS direction 是重点关心的。

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

自个儿想通的地方,记录下来:用函数名来寻找的话,Base
的值未来从未有过别的意义

  1. 先是取得导出表的地方
  2. 从导出表的 NumberOfNames
    字段获得已命名函数的总和,并以那些数字作为循环的次数来组织二个循环往复,从
    AddressOfNames
    字段指向获得的函数名称地址表的第一项开头,在循环中校每一项定义的函数名与要寻找的函数名相相比,假诺未有其余一个函数名是适合的,表示文件中并未有点名名称的函数。
    三.
    如若某1项定义的函数名与要物色的函数名符合,那么记下这些函数名在字符串地址表中的索引值,然后在AddressOfNamesOrdinals
    指向的数组中以同一的索引值取出数组项的值,大家那里假使这一个值是 x
  3. 最终,以 x 的值作为索引值在 AddressOfFunctions 
    字段指向的函数入口地址表中获取 SportageVA 。此 HummerH二VA 就是函数的入口地址。

依附图片:

澳门金沙国际 3

[PE结构分析] 9.导出表 IMAGE_EXPORT_DIRECTORY,dockerexportimage

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字节为一个单位的数组成分,每种元素代表1个针对性字符串的 陆风X8VA

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

AddressOfNames 和 AddressOfNamesOrdinals
的多少肯定是均等的,不是均等那么就出错了。

主要要控制三种检索函数入口地址的不二秘诀:

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;

DOS 头

在我们分析PE 的事先,还有此外3个头要询问一下,DOS
头,不得不说,微软事儿依然挺多的。

微软在创立PE 文件格式时,人们正在广泛使用DOS
文件,所以微软为了想念兼容性的标题,所以在PE 头的最前面还添加了二个IMAGE_DOS_HEADE本田UR-V 结构体,用来扩充已部分DOS EXE。在WinNTFS.h
里可以看出她的身形。

澳门金沙国际 4

DOS
头结构体的轻重缓急是40字节,那里边有七个至关首要的积极分子,须求领会,贰个是e_magic
又见魔数,贰个是e_lfanew,它只是了NT 头的撼动。

对于PE 文件来说,那几个e_magic,也正是DOS 签名都以MZ,听新闻说是3个叫 MarkZbikowski 的开发职员在微软陈设了那种ODS 可执行文件,所以…

笔者们以Windows 下的notepad++
的可执行文件为例,在二进制编辑软件中开辟,此类软件相比较多,Heditor 打开:

澳门金沙国际 5

始发的多个字节是四D五A,e_lfanew 为00000拾8 注意存款和储蓄顺序,小端。

您以为起初加上了DOS 头就完了了么,就能够随着接PE 头了么。为了合营DOS
当然不是那般简单了,紧接着DOS 头,跟的是DOS 存根,DOS
stub。这一块正是为DOS 而准备的,对于PE 文件,尽管未有它也能够符合规律运营。

澳门金沙国际 6

1旁的ASCII 是读不懂的,因为她是机器码,是汇编,为了在DOS
下执行,对于notepad++ 来说,那里是履行了一句,this program cannot be run
in DOS mode 然后脱离。逗笔者= =,有新的人,可以在DOS
中创造一个主次,做一些小动作。

相关文章

发表评论

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

网站地图xml地图