计算机病毒原理与防范(第2版)实验pe&peloader

上传人:bao****ty 文档编号:117542857 上传时间:2019-12-05 格式:DOCX 页数:28 大小:690.74KB
返回 下载 相关 举报
计算机病毒原理与防范(第2版)实验pe&peloader_第1页
第1页 / 共28页
计算机病毒原理与防范(第2版)实验pe&peloader_第2页
第2页 / 共28页
计算机病毒原理与防范(第2版)实验pe&peloader_第3页
第3页 / 共28页
计算机病毒原理与防范(第2版)实验pe&peloader_第4页
第4页 / 共28页
计算机病毒原理与防范(第2版)实验pe&peloader_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《计算机病毒原理与防范(第2版)实验pe&peloader》由会员分享,可在线阅读,更多相关《计算机病毒原理与防范(第2版)实验pe&peloader(28页珍藏版)》请在金锄头文库上搜索。

1、推荐参考资料:PECOFF官方说明文档、老码识途、MSDN、各大搜索引擎1.什么是PEPE的定义什么的就不多介绍了,随便一搜一大把,我们只要知道PE是一种为了便于组织数据而产生的一种文件格式。打个比方,每个程序、链接库都好比是一个图书馆,内部有大量的书籍(数据),另外哪些书是什么属性、放在哪都有明确的记录。PE文件就是图书馆,里面包含了大量的数据和数据摆放的规定。下面我们来一点点的解析PE当中的摆放规则和数据。2.用机器码构造一个PE格式的可执行文件了解了什么是PE,接下来我们要自己动手写一个PE格式的可执行文件了。首先要准备的是WinHex编辑器。打开之后新建一个文件,输入文件长度为1之后确

2、定,就会看到如下界面,我们就要在这里面,把所需数据按规则填到合适的位置,最后保存成exe就可以直接运行了。这个程序要能弹出一个对话框,显示一句HelloPE,然后结束。在填充它之前,我们要先了解一下PE文件数据的摆放方式。如下图,是32位系统下的PE文件格式。它分为三块,第一块是DOS头,第二块是PE头,第三块是PE数据区。我们先来解释DOS头。它是为了兼容DOS系统而存在的,当此程序运行在DOS系统下时,会运行DOS头里的程序,一般只是打印一句话:This Program cannot be run in DOS mode。DOS头中包含两个部分:DOS MZ和DOS STUB。DOS MZ

3、是一个IMAGE_DOS_HEADER 结构,IMAGE_DOS_HEADER是一个在系统中定义好的一种结构体,可以直接当变量类型申明使用,需要包含windows.h头文件,这个结构体在字节码文件中按顺序存储,下面所有类似的结构都是如此。它的定义如下:关于它的每个成员的详细含义,如果需要了解可以在PECOFF官方文档中查找,我们在这里只关心我们需要用到的成员。在这些成员中,需要用到且马上可以确定其值的成员,我们标为绿色;需要用到但是其值需要根据后面的信息来计算的成员,我们标为红色,并暂时将其值设为 若干个A;其他在这暂时用不到的成员标为黑色,大家可以选择性的进行了解。后面所有成员都是如此。ty

4、pedefstruct_IMAGE_DOS_HEADER/DOS.EXEheaderWORDe_magic;/MagicnumberWORDe_cblp;/BytesonlastpageoffileWORDe_cp;/PagesinfileWORDe_crlc;/RelocationsWORDe_cparhdr;/SizeofheaderinparagraphsWORDe_minalloc;/MinimumextraparagraphsneededWORDe_maxalloc;/MaximumextraparagraphsneededWORDe_ss;/Initial(relative)SSv

5、alueWORDe_sp;/InitialSPvalueWORDe_csum;/ChecksumWORDe_ip;/InitialIPvalueWORDe_cs;/Initial(relative)CSvalueWORDe_lfarlc;/FileaddressofrelocationtableWORDe_ovno;/OverlaynumberWORDe_res4;/ReservedwordsWORDe_oemid;/OEMidentifier(fore_oeminfo)WORDe_oeminfo;/OEMinformation;e_oemidspecificWORDe_res210;/Res

6、ervedwordsLONGe_lfanew;/Fileaddressofnewexeheader;了解完DOS MZ部分的结构之后,我们就要开始构造其内容并填进文件中了首先计算一下DOS头的大小。DOS MZ部分是固定大小的结构体。它由30个WORD和1个DWORD组成,总共64,也就是40H个字节,每行16个字节的话,正好是四行。在填充文件之前,我们要让文件尺寸增加为64个字节。在已有的那个字节处点击右键,选edit-paste zero bytes,输入63(DOS MZ大小为64字节,之前已经输入过一个字节,所以增加63个字节)点确定,63个00(每4位表示一个16进制值,两个值正好就

7、是8位,即一个字节)就被增加到了开始那个字节的后面。然后我们来设计一下DOS MZ中各成员的值,其中对我们有用的只有两个值:e_magic和e_lfanew。e_magic相当于一个标志,所有PE文件都必须以“MZ”开始(MZ是MarkZbikowski的缩写,他是DOS系统的一位主要构建者)。“MZ”的十六进制值是 4D 5A,所以我们在第一个成员对应的位置,也就是文件开始处填入4D5A。这里涉及到一个非常重要的概念:FOA。它是指在文件中的偏移量,假如我说有个4字节变量,它的FOA = 0x3c,那意思就是这个变量的值是从文件开头往后数0x3c个字节开始的那4个字节。在WINHEX界面左侧

8、有一个Offset值,在它下面有一列值,最后一位都是0,在它右边有一行值,只有一位。这两个值加起来就是每个字节的FOA。更多的解释可参考其他资料或者网络。e_lfanew中的值表示DOS头后面内容的FOA,也可以用来确定DOS头的大小。在讲解它之前,我们先要来了解一下DOS头中的另一个部分DOS STUB。DOS STUB是在DOS模式下要执行的那段程序代码。它紧跟在DOS MZ之后,长度不固定的。所以如果没有e_lfanew成员,那我们就无法确定DOS头后面的内容从哪里开始。对于我们在windows下写的程序, DOS STUB是没有作用的,因此也可以直接全部填0。我们姑且将它长度设置为70

9、H个字节,也就是从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数据和属性信息。PE头就是一个IMAGE_NT_HEADERS结构,一般来说

10、其大小是固定的(有些程序该部分大小不固定,这里我们不考虑)。在IMAGE_NT_HEADERS结构中,包含有三个部分:Signature、IMAGE_FILE_HEADER(文件头标准头)、IMAGE_OPTIONL_HEADER(可选头扩展头)。其排列如下图:Signature类似于DOS MZ部分中的e_magic,也是一个标志,大小为4字节,值必须为“PE00”,所以我们在B0H B3H这四个字节中填入50 45 00 00。随后是IMAGE_FILE_HEADER,大小为20字节,它记录了PE文件的一些全局属性,其定义如下:typedef struct _IMAGE_FILE_HEAD

11、ER WORD Machine; WORD NumberOfSections; DWORD TimeDateStamp; DWORD PointerToSymbolTable; DWORD NumberOfSymbols; WORD SizeOfOptionalHeader; WORD Characteristics; ;我们来逐个解释并确定其中成员的值:Machine WORD表示PE文件运行所要求的CPU。对于Intel平台,该值是0x014C,所以winhex中应该填入“4C 01”。NumberOfSectionsWORD表示PE文件中段(也可称作节)的总数,在我们的程序中有3个段,.

12、text(代码段)、.rdata(只读数据段)、.data(变量数据段),各个段的含义在后面会解释。所以此处值是0x0003,因此填写“03 00”。SizeOfOptionalHeaderWORD表示后面的IMAGE_OPTIONL_HEADER部分所占空间大小,我们已经知道其大小是224byte,转换成十六进制即0x00E0。在winhex中应该填写“E0 00”。CharacteristicsWORD表示文件属性的成员,各二进制位表示的意义如下:位描述填入值Bit0置1表示文件中没有重定向信息,但是否重定向(后面介绍)不靠它判断1Bit1置1表示该文件是可执行文件1Bit2置1表示没有行

13、数信息;在可执行文件中没有使用1Bit3置1表示没有局部符号信息;在可执行文件中没有使用1Bit4必须为00Bit5值1表示程序可以处理2G以上的内存0Bit6保留字0Bit7必须为00Bit8置1表示希望机器为32位机1Bit9表示没有调试信息,在可执行文件中没有使用0Bit10置1表示该程序不能运行于可移动介质中0Bit11置1表示程序不能在网上运行0Bit12置1表示文件是一个系统文件。0Bit13置1表示文件是一个动态链接库0Bit14表示文件被设计成不能运行于多处理器系统中0Bit15必须为00对于我们的程序,该成员二进制值为“0000 0001 0000 1111”,将其转换为十六进制形式为0x010F,因此在winhex中填“0F01”。所有成员数值都确定了,将Signature和IMAGE_FILE_HEADER填好之后结果如下图:然后是整个头部中最重要的IMAGE_OPTIONAL_HEADER,它有相当多的成员,其定义如下:

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号