当前位置:鱼C工作室 >解密系列 >系统篇 > 查看文章

PE格式详细讲解9 – 系统篇09|解密系列

PE格式详细讲解9 – 系统篇09

 

让编程改变世界

Change the world by program


 

当PE 文件被执行的时候,Windows 加载器将文件装入内存并将导出表(Export Table) 登记的动态链接库(一般是DLL 格式)文件一并装入地址空间,再根据DLL 文件中的函数导出信息对被执行文件的IAT 进行修正。

 

基础补充:

 

很多朋友可能看到这里会有点懵,各位看官请允许小甲鱼啰嗦一下,照顾初学者。

我们都明白Windows 在加载一个程序后就在内存中为该程序开辟一个单独的虚拟地址空间。

这样的话在各个程序自己看来,自己就拥有几乎任意地址的支配权,所以他自身的函数想放在哪个地址自己说了算。

 

有一些函数很多程序都会用到,为每一个程序写一个相同的函数看起来似乎有点浪费空间。

因此Windows就整出了动态链接库的概念,将一些常用的函数封装成动态链接库,等到需要的时候通过直接加载动态链接库。

将需要的函数整合到自身中,这样就大大的节约了内存中资源的存放。

 

如图:

PE格式详细讲解

 

有一个重要的概念需要记住:动态链接库是被映射到其他应用程序的地址空间中执行的,它和应用程序可以看成是“一体”的。

动态链接库可以使用应用程序的资源,它所拥有的资源也可以被应用程序使用,它的任何操作都是代表应用程序进行的。

当动态链接库进行打开文件、分配内存和创建窗口等操作后,这些文件、内存和窗口都是为应用程序所拥有的。

所以,动态链接库用小甲鱼的话说就是“寄生虫”! )

 

那导出表是干啥用的呢?

 

导出表就是记载着动态链接库的一些导出信息。

通过导出表,DLL 文件可以向系统提供导出函数的名称、序号和入口地址等信息,比便Windows 加载器通过这些信息来完成动态连接的整个过程。

 

友情提示:

 

扩展名为.exe 的PE 文件中一般不存在导出表,而大部分的.dll 文件中都包含导出表。但注意,这并不是绝对的。

例如纯粹用作资源的.dll 文件就不需要导出函数啦,另外有些特殊功能的.exe 文件也会存在导出函数。

所以,世事无绝对……好了,我们接下来就对导出表的结构进行分析。

 

导出表结构

 

导出表(Export Table)中的主要成分是一个表格,内含函数名称、输出序数等。

序数是指定DLL 中某个函数的16位数字,在所指向的DLL 文件中是独一无二的。

在此我们不提倡仅仅通过序数来索引函数的方法,这样会给DLL 文件的维护带来问题。

例如当DLL 文件一旦升级或修改就可能导致调用改DLL 的程序无法加载到需要的函数。

 

数据目录表的第一个成员指向导出表,是一个IMAGE_EXPORT_DIRECTORY(以后简称IED)结构,IED 结构的定义如下:

IMAGE_EXPORT_DIRECTORY STRUCT
	Characteristics		DWORD	?	; 未使用,总是定义为0
	TimeDateStamp		DWORD	?       ; 文件生成时间
	MajorVersion		WORD	?	; 未使用,总是定义为0
	MinorVersion		WORD	?	; 未使用,总是定义为0
	Name			DWORD	?	; 模块的真实名称
	Base		        DWORD	?	; 基数,加上序数就是函数地址数组的索引值
	NumberOfFunctions	DWORD	?	; 导出函数的总数
	NumberOfNames		DWORD	?	; 以名称方式导出的函数的总数
	AddressOfFunctions	DWORD	?	; 指向输出函数地址的RVA
	AddressOfNames		DWORD	?	; 指向输出函数名字的RVA
	AddressOfNameOrdinals	DWORD	?	; 指向输出函数序号的RVA
IMAGE_EXPORT_DIRECTORY ENDS

 

这个结构中的一些字段并没有被使用,有意义的字段说明如下。

分页阅读: 1 2 下一页
为您推荐

报歉!评论已关闭.