Chinese:
1、PE (Portable Executable) 是微软Win32环境下可移植可执行文件的标准文件格式。
2、exe文件和dll文件的PE格式是完全相同的。
3、32位下的PE格式叫PE32,64位下的PE格式叫PE32+,PE32+并没有加入新的结构,改变的只是简单的将32位字段扩展成了64位。
4、PE格式定义的主要地方位于我们的头文件winnt.h,这个头文件中几乎能找到关于PE文件的所有定义。
5、PE文件中的数据结构一般都有32位和64位之分,一般在文件名称上会表现出来:比如IMAGE_NT_HEADER32或IMAGE_NT_HEADER64。
6、PE结构框架图一览
7、PE文件使用的是一个平面地址空间,所有代码和数据都被合并在一起,组成一个很大的结构。
8、文件的内容被分割为不同的区块,块中包含代码或数据。各个区块按页边界来对齐,区块没有大小限制,是一个连续的结构。
9、此外,每个块有自己在内存中的一套属性,比如说这个区块时否包含代码、时否只读或可读/写等。
10、PE文件不是作为单一内存映射文件被装入内存的。
11、Windows加载器(PE装载器)遍历PE文件并决定文件的哪一部份被映射,这种映射方式是将文件较高的偏移位置映射到较高的内存地址中。
12、当磁盘文件一旦被装入内存中,磁盘上的数据结构布局和内存中的数据结构布局是一致的。因此这样如果知道在磁盘的数据结构中找到一些内容,那么几乎都能在被装入到内存映射文件中找到相同的信息;但数据之间的相对位置可能改变,其某项的偏移地址可能区别于原始的偏移位置,不管怎样,所有表现出来的信息都允许从磁盘文件偏移到内存偏移的转换(相同的比例)。
13、PE文件磁盘与内存映像结构图:
14、PE文件加载到内存后,我们把内存中的这个PE文件称之为模块,上图所示的基地址就是该模块的头地址,也就是该模块的"句柄"(hModule)。该句柄可以通过Win32 api的GetModuleHandle获得。函数原型: HMODULE GetModuleHandle(LPCTSTR lpModuleName) 详细的请参考msdn http://msdn.microsoft.com/en-us/library/windows/desktop/ms683199(v=vs.85).aspx
15、文件偏移地址就是各个块相对于文件头的偏移量,虚拟地址也就是地址管理器为该程序分配的伪地址(分配在硬盘上,32位下是4G),相对虚拟地址则是虚拟地址与基地址的差值。