8.2. PE¶
8.2.1. 简介¶
PE(全称Portable Executable)格式,是微软Win32环境可移植可执行文件(如exe、dll、vxd、sys、vdm等)的标准文件格式。
8.2.2. Table¶
每个PE文件在文件最开始的地方都有一个 import 和 export table。import table包含所有从dll中读取的函数,有一个.reloc 段来保存dll在内存中信息。
和linux不同,pe会优先加载同一个文件夹内的dll而不是去其他地方找。在开发者看来这省去了修改PATH的烦恼,避免了dll-hell,但是在攻击者看来这为一些绕过提供了方便。
8.2.3. RVAs¶
PE-COFF的一个比较重要的概念是Relative Virtual Address(RVAs) RVAs是用来减少一些PE Loader需要做的工作的,简单的说,每个DLL都被加载到内存中的某个位置, 可以把RVA加到一个基址上去找想要的东西。
8.2.4. Heaps¶
在dll加载的时候,会调用一些初始函数,这些函数会用HeapCreate()来设置其自身的栈,然后用一个全局变量的指针来指向它。
大多数dll在内存中也有一个.data段来记录全局变量,因为有这么多的heap,堆溢出攻击会有点麻烦。
在linux中只会有一个栈溢出,但是在win中可能有几个栈同时溢出,这就增加了分析的难度
每个进程都有一个默认的堆,可以用GetDefaultHeap()来找到它,尽管这个heap并不一定是溢出的那一个。
8.2.5. Thread¶
windows没有fork(),而是用CreateProcess,这个函数会起一个新的有自己内存空间的进程,子进程会继承父进程所有可继承的属性。
8.2.6. DCOM¶
Distributed Common Object Model(DCOM)。windows有一个特点的是分发程序一般都是用binary,使得几乎所有程序都支持COM。
COM可以用COM支持的任何一种语言完成,而且可以在其中进行无缝转换 要深入的了解DOM,需要了解IDL(Interface Description Language)文件。