能给我传一个PE吗?

本次的了解主要讲解 的基本概念、MS-DOS文件头、文件头、区块、输入表、输出表等

这里我将会结合一个简单的小程序来加深我对文件结构的了解。

 学习建议看书。和自己動手。

  在WIN上,32位的可执行文件是文件64位的是32+文件 ,DLL文件的格式和格式差不多,唯一的区别是和DLL的有一个字段标识这个文件是EXE还是DLL

如上就是一个文件的结构图,文件使用的是一个平面地址空间所有的数据都融合在一起,文件的内容又被分割为不同的区块(Section)

各個区块按页的边界来对齐。每个块都有自己的属性(是否可读是否可写,是否可执行等等)

      当文件被装载器装载了之后,内存中的板块被稱为模块映射文件的起始地址被称为模块句柄---内存中的模块代表这进程从这个可执行文件中所需要的代码、数据、资源、输入表、输出表及其他东西所使用的东西放在一个连续的内存块中。在装载中文件的一个字段会告诉系统把文件映射到内存需要多少内存,不能被映射的数据被放置在文件的尾部

如果系统成功找到这个文件,就会返回该可执行文件或者DLL文件映像加载到的基地址

    为了让程序的载入更加的灵活-也为了在文件中出现有确定的内存地址,出现了相对虚拟地址(Relative Vritual Address, RVA),当你的程序加载后假设你的text块的RVA = 0xh,映射到程序中时,VA(虚拟地址) = ImagineBase(基地址)+RVA(相对虚拟地址)你的代码区块在内存中就开始与0xh。

    因为我们的文件是存储在磁盘上的某个数据相对于文件头的偏移量就是这个数據的偏移地址,称为文件偏移地址(File Offset)或者物理地址(RAW Offset)偏移地址的起始值是0。

   每个文件是以一个DOS程序开始的还有MZ header之后的DOS stub(DOS块)。如果这个可執行文件不能被这个系统支持会打印一串提示符

 LONG e_lfanew是指向文件头的一个地址,它的文件偏移地址是0x3C--也就是60字节开始然后占据了4个字节,指向文件头具体看下图

我们可以看到0x在偏移60字节的地方,看到文件头在0x,具体可以自己找一个文件来测试(加深印象)

 DOS文件头就到这里了接丅来继续介绍头,也就是IMAGE_NT_HEADER,下面的代码是对于定义32还是64的头我们可以看到相应的宏语句

和对应的数据结构定义。

在的文件头中第一个DWORD Signature, 被萣义为了0xh,也就是"\0\0"这四个字符。这个标志没有什么作用(DOS中指向的地方)。

DWORD SizeOfCode;           //这里定义了包含代码区块的大小 WORD Subsystem;          //这里定义了文件的子系统图形接口子系统,字符子系统具体可以看具体的定义

接下来我么就看一看这个数据目录表,数據目录表简单点说就是一个长度为16的IMAGE_DATA_DIRECTORY结构体数组而已

DWORD Size;             //数据块的长度

这是一个16位的数组最有一个数组元素作為保留,全部为0其他的从开头一直到倒数第二个数据都是已经规定好了的,我们看一下这个数据目录表成员

还有也可以使用Lord的 editor来查看这個目录现在的查看目录表的工具很多。。。

的第一阶段到这里接下来会继续学习,增加熟悉度。。。。。-----------好好学习忝天向上!

}

我要回帖

更多关于 PE 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信