EXE和DLL文件直接的区别完全是语义上的,因为他们使用的完全相同的PE格式。而唯一的区别就是用一个字段表示出这个文件是EXE还是DLL.
64位Windows只是对PE格式做了一些简单的修饰,新格式叫PE32 .并没有认识新的结构加进去,改变的只是简单的将32位字段扩展成64位。
PE格式定义的主要地方位于我们的头文件winnt.h,这个头文件中几乎能找到关于PE文件的所有定义。
PE文件中的数据结构一般都有32位和64位之分,一般在名称上会表现出来:例如IMAGE_NT_HEADERS32或IMAGE_NT_HEADER64
我们的讲解主要基于现在主流的32位PE格式来进行研究的,64位请依次类推,因为64位版本只是对32位做了一些简单的扩展,结构几乎是一模一样的。
PE文件使用的是一个平面地址空间,所有代码和数据都被合并在一起,组成一个很大的结构。
文件的内容被分割成不同的区块,块中包含代码和数据。各个区块按页边界来对齐,区块没有大小限制,是一个连续的结构。
此外,每个块有自己在内存中的一套属性,比如说这个区块是否包含代码,是否只读或可读/写等。
认识PE文件不是作为单一内存映射文件被装入内存是很重要的。
Windows加载器(又称PE装载器)便利PE文件并决定文件的哪一部分被映射,这种映射方式是将文件较高的偏移位置映射到较高的内存地址中。
当磁盘文件一旦被装入内存中,磁盘上的数据结构布局和内存中的数据结构布局是一致的。
这样如果知道在磁盘的数据结构中寻找一些内容,那么几乎都能在被装入到内存映射文件中找到相同的信息。
但数据直接的相对位置可能改变,其某项的偏移地址可能区别于原始的偏移位置,不管怎样,所有表现出来的信息都允许从磁盘文件偏移到内存偏移的转换。
PE的基本概念 1.基地址 2.相对虚拟地址 3.文件偏移地址
4D 5A 表示DOS头部的开始
PEID是用来查看是否有壳的工具
55表示入口地址
学习到这吧,大神路过此地勿喷 |