- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
计算机病毒原理与防范(第2版)实验PE文件构造验步骤11
用机器码构造一个PE格式的可执行文件的实验记录
1.什么是PE
PE的定义什么的就不多介绍了,随便一搜一大把,我们只要知道PE是一种为了便于组织数据而产生的一种文件格式。打个比方,每个程序、链接库都好比是一个图书馆,内部有大量的书籍(数据),另外哪些书是什么属性、放在哪都有明确的记录。PE文件就是图书馆,里面包含了大量的数据和数据摆放的规定。下面我们来一点点的解析PE当中的摆放规则和数据。
2.用机器码构造一个PE格式的可执行文件
了解了什么是PE,接下来我们要自己动手写一个PE格式的可执行文件了。首先要准备的是WinHex编辑器。打开之后新建一个文件,输入文件长度为1之后确定,就会看到如下界面,我们就要在这里面,把所需数据按规则填到合适的位置,最后保存成exe就可以直接运行了。这个程序要能弹出一个对话框,显示一句HelloPE,然后结束。
它分为三块,第一块是DOS头,第二块是PE头,第三块是PE数据区。
DOS头是为了兼容DOS系统而存在的,当此程序运行在DOS系统下时,会运行DOS头里的程序,一般只是打印一句话:This Program cannot be run in DOS mode。DOS头中包含两个部分:DOS MZ和DOS STUB。
DOS MZ是一个IMAGE_DOS_HEADER 结构,IMAGE_DOS_HEADER是一个在系统中定义好的一种结构体,可以直接当变量类型申明使用,需要包含windows.h头文件
计算一下DOS头的大小。DOS MZ部分是固定大小的结构体。它由30个WORD和1个DWORD组成,总共64,也就是40H个字节,每行16个字节的话,正好是四行。 在填充文件之前,我们要让文件尺寸增加为64个字节。在已有的那个字节处点击右键,
选edit-paste zero bytes,输入63(DOS MZ大小为64字节,之前已经输入过一个字节,所以增加63个字节)点确定,63个00(每4位表示一个16进制值,两个值正好就是8位,即一个字节)就被增加到了开始那个字节的后面。
设计一下DOS MZ中各成员的值,其中对我们有用的只有两个值:e_magic和e_lfanew。e_magic相当于一个标志,所有PE文件都必须以“MZ”开始。“MZ”的十六进制值是 4D 5A,所以我们在第一个成员对应的位置,也就是文件开始处填入4D5A。e_lfanew中的值表示DOS头后面内容的FOA,也可以用来确定DOS头的大小。在windows下写的程序, DOS STUB是没有作用的,因此也可以直接全部填0。将它长度设置为70H个字节,也就是从40H-AFH这一段。
确定了DOS STUB的大小,就可以填入e_lfanew的值了,因为DOS头后面的内容是从B0H开始的,所以e_lfanew的值为00 00 00 B0,填入文件时应该为B0 00 00 00(请自行了解大小端机的概念,字符串按正序存入)。
DOS MZ中其余成员全部填00,完成之后如下图所示,黄色部分为DOS MZ,绿色为DOS STUB。
这样我们的DOS头就做好了。
在DOS头下面,紧接着是PE头(FOA = B0H处开始)。它相当于一个PE程序的总体描述,里面记录了很多PE数据和属性信息。
Signature标志, 4字节,值为“PE\0\0”,所以我们在B0H – B3H这四个字节中填入50 45 00 00。随后是IMAGE_FILE_HEADER,大小为20字节,
?Machine WORD, 表示PE文件运行所要求的CPU。对于Intel平台,该值是0x014C,,填入“4C 01”。
NumberOfSections WORD 表示PE文件中段(也可称作节)的总数,在我们的程序中有3个段,.text(代码段)、.rdata(只读数据段)、.data(变量数据段)。所以此处值是0x0003,因此填写“03 00”。
SizeOfOptionalHeader WORD 表示后面的IMAGE_OPTIONL_HEADER部分所占空间大小,我们已经知道其大小是224?byte,转换成十六进制即0x00E0。在winhex中应该填写“E0 00”。Characteristics WORD 对于我们的程序,该成员二进制值为“0000 0001 0000 1111”,将其转换为十六进制形式为0x010F,因此在winhex中填“0F01”。
所有成员数值都确定了,将Signature和IMAGE_FILE_HEADER填好之后结果如下图:
然后是整个头部中最重要的IMAGE_OPTIONAL_HEADER,它有相当多的成员,
我们来逐个解释并确定其中成员的值:
Magic WORD 表示文件的格式,值为0x010B表示.
文档评论(0)