点击蓝字
关注我们
始于理论,源于实践,终于实战
老付话安全,每天一点点
激情永无限,进步看得见
严正声明
本号所写文章方法和工具只用于学习和交流,严禁使用文章所述内容中的方法未经许可的情况下对生产系统进行方法验证实施,发生一切问题由相关个人承担法律责任,其与本号无关。
特此声明!!!
PE文件的导出表
导出表是PE文件为其他应用程序提供API的一种函数示例导出方式。
Windows下存在导出表的可执行文件以指定自身的一些变量、函数以及类,并将其导出,以便提供给其他第三方程序使用。
导出表用途:PE文件能把自身的函数、变量或者类,提供给其他PE文件使用,这种行为就叫导出。导出表专门用来存放这些导出项目的信息。当一个PE文件要调用其他PE文件里的导出函数(变量、类)时,依靠导出表就能迅速找到它们在文件里的位置。一般来说,这些被导出的函数、变量、类,也叫做符号(Symbol)。
导出表的查找方法:数据目录表的第一个元素里有相对虚拟地址,利用相对虚拟地址转文件偏移的办法,就能找到导出表的位置。
导出表由3部分构成,分別是名称表、函数表与序号表,其中函数表与序号表是必须要有的。而名称表是可选的。
序号表与名称表的作用是索引,引导调用者找到真正需要的函数表,而函数表中保存的是这个被导出的函数地址信息。
PE文件导入表
导入表机制是PE文件从其他第三方程序中导入API,以供本程序调用的机制,
PE文件运行过程中,如果用到其他PE文件里的函数、变量或者类,这种行为就叫做导入。导入表专门记录这部分信息。(与导出表相对)
导入表的查找方法:数据目录表的第二个元素能帮我们定位导入表,查找的办法和找导出表一样。
导入表的存储内容:导入表会记录从其他PE文件导入的函数名和序号。当PE文件加载到内存后,导入表还会保存这些函数的实际内存地址。
PE文件资源表
PE文件的资源区段用来存放图片、菜单、图标等界面元素。数据目录中的IMAGE_DIRECTORY_ENTRY_RESOURCE项指向此结构。
资源在PE文件中是以目录结构的形式存在的,这个目录分为3层,从根目录开始分別为资源类型、目录资源ID与资源代码页。
3层目录结构都是由一个
lMAGE_RESOURCE_DIRECTORY结构为头邡的,并口.在其后跟着一个
IMAGE_RESOURCE_DIRECTORYY_ENTRY结构数组。lMAGE_RESOURCE_DIRECTORY结构上要负责指出后面结构数组的成员个数,而后面结构数组的每个成员则分別指向下一层目录结构(或资源数椐)。
PE文件基址重定位表
PE文件一般分成好多区段,如代码段、数据段等。代码会放在代码段里,局部变量存于栈空间(栈空间通过很小的偏移就能找到局部变量),全局变量和局部静态变量则存放在数据段。
当代码段要访问数据段里的数据时,直接用地址值来寻址;但直接用虚拟地址(VA)不太靠谱,因为PE文件有可能被加载到4GB内存空间的任何地方。
要是代码段用的是相对虚拟地址(RVA),那么每次程序加载到内存时,都得把RVA转换成VA,才能找到全局变量。所以,代码段里存的是PE文件加载到扩展头第10个成员——映像基址时的虚拟地址。
一旦PE文件没加载到原本预想的位置,代码段访问数据段数据的虚拟地址(VA)就得调整,这样才能保证代码能找到对应数据。重定位表就是用来存代码段里这些需要调整地址的位置。
进行重定位操作时,只要获取当前PE文件的加载基址,用当前加载基址减去默认加载基址得到一个差数,再把这个差数与需要重定位的数据相加,就能完成重定位。所以,重定位表只保存需要重定位数据的位置。
通过数据目录表的第6个元素,就能找到重定位表。 重定位表是一个结构体数组,以全零元素作为结尾。数组里每个元素,描述的是4KB大小区域的重定位信息。
重定位技术主要用在DLL文件上。后来,为了防范黑客攻击,EXE文件开始采用随机基址技术,因此EXE文件也需要进行重定位操作。
PE文件TLS表
TLS是Windows系统线程局部存储的简称,目的是解决一个进程里多个线程同时访问全局变量引发的问题。
在进程中,全局变量以及函数里定义的静态变量,各个线程都能访问,属于共享变量。一个线程修改了共享变量的内存内容,所有线程都会受到影响。这种特性有好处也有坏处。好处是线程之间的数据交换变得方便迅速;坏处是,要是一个线程意外终止,其他线程可能也无法正常工作。而且多个线程访问共享数据时,不仅要花费较多资源来进行同步操作,还容易出现和同步有关的错误。
有一种变量,它能在一个线程内部的各个函数调用中被访问,而其他线程无法访问。这种变量叫做线程局部静态变量。要实现这种变量,就需要TLS机制。
TLS是解决多线程程序中变量的同步问题 ,全称Thread Local Storage,意思是线程本地存储。因为每个线程都有独立于其他线程的栈空间,所以线程里的局部变量不存在同步问题。
多线程同步的主要问题在于对全局变量的访问。TLS在操作系统支持下,把全局变量整合到一个特殊的节里。每次创建线程时,都会将这个节里的数据复制一份,存到进程的空闲地址空间。之后,线程就可以像访问局部变量那样,访问这份独属于自己的全局变量副本,而且不需要进行同步控制。
枯燥乏味的知识点,学起来有点费劲。但是不积跬步无以至千里。日拱一卒,每天一点点的进步。
END
原文始发于微信公众号(老付话安全):Windows PE文件格式详解(二)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论