菜单

[PE结构分析] 九.导出表 IMAGE_EXPO福特ExplorerT_DIRECTO安德拉Y,dockerexportimage

2019年4月12日 - 皇家赌场系统
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;

[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字节为贰个单位的数组成分,每种成分代表八个针对性字符串的 BMWX三VA

AddressOfNamesOrdinals 所指向内容是以 贰字节为一个单位的数组成分,每一种成分代表对应名字在 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;

ELF&PE 文件结构解析

说简单题,ELF 对应于UNIX 下的文本,而PE 则是Windows
的可执行文件,分析ELF 和 PE
的公文结构,是逆向工程,大概是做调节和测试,甚至是支付所应具备的着力力量。在实行逆向工程的上马,我们获得ELF
文件,或许是PE
文件,首先要做的就是分析文件头,了然音信,进而逆向文件。不说废话,早先分析:

ELF和PE 文件都以基于Unix 的 COFF(Common Object File Format)
改造而来,特别切实的来说,他是来源于当时老牌的 DEC(Digital Equipment
Corporation) 的VAX/VMS 上的COFF文件格式。大家从ELF 提起。

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

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

  1. 定位到PE 文件头
  2. 从PE 文件头中的 IMAGE_OPTIONAL_HEADE宝马X33二结构中取出数据目录表,并从第一个数据目录中获得导出表的兰德酷路泽VA
  3. 从导出表的 Base 字段获得伊始序号
    四.
    将须要摸索的导出序号减去伊始序号Base,获得函数在入口地址表中的索引,检测索引值是还是不是超过导出表的
    NumberOfFunctions 字段的值,假使超越后者的话,表达输入的序号是不行的
  4. 用这么些索引值在 AddressOfFunctions
    字段指向的导出函数入口地址表中取出相应的体系,那正是函数入口地址的汉兰达VA
    值,当函数棉被服装入内存的时候,这么些LX570VA
    值加上模块实际装入的集散地址,就收获了函数真正的输入地址

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

ELF

ELF 文件标准里把系统中利用ELF 格式的文本归类为八种:

ELF 文件的总体布局大体上是那样的:

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

AddressOfNames 所指向内容是以 四字节为二个单位的数组成分,各个成分代表3个对准字符串的 奥德赛VA

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

自家想通的位置,记录下来:用函数名来寻找的话,Base
的值现在未曾其余意义

  1. 率先得到导出表的地点
  2. 从导出表的 NumberOfNames
    字段获得已命名函数的总额,并以这一个数字作为循环的次数来布局三个循环,从
    AddressOfNames
    字段指向得到的函数名称地址表的率先项初步,在循环师长每一项定义的函数名与要物色的函数名绝比较,假若未有别的二个函数名是切合的,表示文件中尚无点名名称的函数。
    三.
    只要某壹项定义的函数名与要摸索的函数名符合,那么记下那个函数名在字符串地址表中的索引值,然后在AddressOfNamesOrdinals
    指向的数组中以同样的索引值取出数组项的值,大家那边假诺那几个值是 x
  3. 最终,以 x 的值作为索引值在 AddressOfFunctions 
    字段指向的函数入口地址表中赢得 HummerH贰VA 。此 PRADOVA 正是函数的进口地址。

附上海体育场合片:

] 9.导出表
IMAGE_EXPORT_DIRECTORY,dockerexportimage typedef struct
_IMAGE_EXPORT_DIRECTORY { DWORD Characteristics; // 未使用,总为0
DWORD TimeDateStamp;…

AddressOfNames 所指向内容是以 四字节为2个单位的数组成分,各样成分代表一个对准字符串的 奥迪Q5VA

ELF Header

ELF 文件音讯的查看利器在Linux 下是是objdump, readelf,
相关命令较多,可查。上边大家从ELF 文件头聊起。

文本头包罗的剧情很多,我们在Ubuntu 系统下使用 readelf 命令来查看ELF
文件头:

图片 1

大家以bash 那几个可执行文件为例,大家能够看来ELF 文件头定义了ELF
魔数,文件机器字节长度,数据存款和储蓄格局,版本,运转平台,ABI版本,ELF
重定位类型,硬件平台,硬件平台版本,入口地址,程序头入口和尺寸,段表的岗位和长短,段的数目。

ELF 文件头的构造和连锁常数一般定义在了 /usr/include/elf.h
中,大家得以进来查看一下:

图片 2

除开首个,其余都以逐1对应的,第叁个是1个一见如旧了Magic number, Class,
Data, Version, OS/ABI, ABI version.

出现在最伊始的ELF Magic number, 1陆字节是用来标识ELF
文件的平台属性,比如字长,字节序,ELF
文件版本。在加载的时候,首先会确认魔数的不易,不得法的话就拒绝加载。

另三个主要的事物是段表(Section Header Table)
,保存了五光拾色段的主导属性,比如段名,段长度,文件中的偏移,读写权限,段的别样品质。而段表本人在ELF
文件中的地方是在ELF 头文件 e_shoff 决定的。

大家能够运用 objdump -h 的通令来查看ELF 文件中隐含哪些段,以bash
那些可实施为例,其实除了大家事先说的哪些基本组织,他饱含众多任何的结构:

图片 3

同1的,大家利用readelf -S 的通令也能够拓展查看。

上面咱们来看一下组织,依旧到elf.h 中去查看,他的结构体名字叫
Elf3贰_Shdr,64位对应Elf64_Shdr,结构如下:

图片 4

上述结构中,分别对应于:

那一个体系,在利用readelf -S 指令时1一对应。

除此以外还有三个人命关天的表,叫重定位表,1般段名称为.rel.text,
在下面未有出现,链接器在处理指标文件时,必要对指标文件中的有些地点进行重一贯,就是代码段和数目段中那三个对绝对地址引用的职位,那年就供给动用重定位表了。

相关文章

发表评论

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

网站地图xml地图