《pe病毒与清除实验.docx》由会员分享,可在线阅读,更多相关《pe病毒与清除实验.docx(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、编号: 实验一二三四五六七八总评教师签名成绩武汉大学计算机学院课程实验(设计)报告课程名称: 软件安全实验 实验内容: PE病毒实验 专业(班): 12级信安一班 学 号: 2012302530026 姓 名: 郭蕊 任课教师: 彭国军 年 月 日目 录实验3 PE病毒分析与清除13.1实验名称13.2实验目的13.3实验步骤及内容13.4实验关键过程、数据及其分析33.4.1 熟悉masm3233.4.2 熟悉病毒重定位的基本思路和方法53.4.3 搜索API函数地址73.4.4 编译教材中的感染例子程序93.4.5 课后习题思考113.5实验体会和拓展思考12实验3 PE病毒分析与清除3.
2、1实验名称PE病毒分析与清除3.2实验目的1) 了解PE病毒的基本原理2) 熟悉PE病毒中的部分关键技术3) 学会清除PE病毒3.3实验步骤及内容第一阶段: 熟悉Masm321) 下载masm32v82) 熟悉masm32的基本环境3) 写一个最简单的helloworld程序,并编译成功4) 对得到的可执行文件进行反汇编,比较其反汇编代码和最初的汇编代码有哪些异同?5) 察看并理解masm32bin下各个批处理程序,了解他们的大致功能第二阶段: 熟悉病毒重定位的基本思路和方法n 在hello-2.5.exe中添加一段代码,该段代码满足以下几个条件:n 该段代码弹出一个对话框(标题:武大信安病毒
3、重定位,内容:姓名+学号)n 该段代码同时包括代码和字符串数据。n 该段代码可以插入到.text节的任意指令之间,而不需要修改该段代码中的任何字节。 1.先用masm工具讲asm文件编译成exe文件,再用OD打开,进行反汇编2. 再用OD打开原hello2.5的exe文件,删除原代码中最后call exitprocess语句,将要添加的代码添加到原代码段的任意位置.3. 由于调用exitprocess和messagebox语句的后移,故原程序中的call语句相对寻址也需要做相应改动。即可实现数据段的重定位:第三阶段: 搜索API函数地址n 用ollydbg打开hello-2.5.exe,获取K
4、ernel32.dll模块基地址,定位到kernel32.dll模块 1.fs:0指向TEB结构,首先从fs:30h获得PEB地址。2.然后通过PEB0x0c获得PEB_LDR_DATA数据结构地址。 3. 然后通过从PEB_LDR_DATA0x1c获取InInitializationOrderModuleList.Flink地址。4.最后在Flink0x08中得到KERNEL32.DLL模块的基地址。n 从内存中的kernel32.dll模块获取函数LoadLibraryA和GetProcessAddress的函数地址,并实际检验获得的地址是否正确?1. 定位到PE文件头。从PE文件头中的可
5、选文件头中取出数据目录表的第一个数据目录,得到导出表的地址。从导出表的NumberOfNames字段得到以命名函数的总数,并以这个数字做微循环的次数来构造一个循环。2.从AddressOfNames字段指向的函数名称地址表的第一项开始,在循环中将每一项定义的函数名与LoadLibraryA和GetProcessAddress比较,如果没有任何一个函数名符合,说明文件中没有指定名称的函数,如果某一项定义的函数名与要查找的函数名符合,那么记住这个函数名在字符串地址表中的索引值x。可得LoadLibraryA数组序号x1=0246,GetProcessAddress数组序号x2=033E。3. 然后
6、在AddressOfNameOrdinals指向的数组中以同样的索引值x去找数组项中的值y。可得LoadLibraryA序号y1=0245,GetProcessAddress序号y2=033D。4. 以y值作为索引值,在AddressOfFunctions字段指向的函数入口地址表中获取的RVA就是函数的入口地址,当函数被装入内存后,这个RVA值加上模块实际装入的基址(ImageBase),就得到了函数真正的入口地址。可得LoadLibraryA的RVA=4CD44,GetProcessAddress的RVA=4D015。第四阶段: 编译教材中的感染例子程序-bookexample-old.ra
7、r 使用该感染例子对hello-2.5.exe进行感染。思考以下问题:n 该病毒在感染文件时具体做了哪些操作? 1.判断目标文件开始的两个字节是否为“MZ”2. 判断PE文件标记“PE”3. 判断感染标记,如果已被感染则跳出继续执行HOST程序,否则继续4. 获得Directory(数据目录)的个数(每个数据目录信息占8个字节)5. 得到节表其实位置(Directory的偏移地址+数据目录占用的字节数=节表其实位置)6. 得到目前最后节表的末尾便宜(紧接其后用于写入一个新的病毒节)7. 节表起始位置+节的E书*(每个节表占用的字节数28H)=目前最后节表的末尾偏移8. 开始写入节表: (1)写
8、入节名(8字节) (2)写入节的实际字节数(4字节) (3)写入新节在内存中的开始偏移地址(4字节),同时可以计算出病毒入 口位置 上节在内存中的开始偏移地址+(上节大小/节对齐+1)*节对齐=本节在 内存中的开始偏移地址 (4)写入本节(即病毒节)在文件中户对齐后的大小 (5)写入本节在文件中的起始位置9. 修改映像文件头中的节表数目10. 修改AddressOfEntryPoint(即程序入口点指向病毒入口位置),同时保存旧的AddressOfEntryPoint,以便返回HOST继续执行11. 更新SizeOfImage(内存中整个PE映像尺寸=原SizeOfImage+病毒节经过内存节
9、对齐后的大小)12. 写入感染标记13. 写入病毒代码到新添加的节中14. 将当前文件位置设置为文件末尾n 该病毒如何返回HOST? 病毒在修改被感染文件代码开始执行位置(AddressOfEntryPoint)时,已保存原来的值,这样,病毒在执行完病毒代码之后用一个跳转语句跳到这段代码处继续执行即可。 找出该病毒程序存在的一些问题,并解决这些问题。1.在用ollyice单步调试时,发现程序在写入0040109E时异常终止了。2. 用PEVIEW查看代码段节表,观察到其属性为60000020,即可执行可读和“节中包含代码”,而病毒代码要执行,应具有可读可写可执行属性。 3、用ultraedit
10、打开exe,修改对应属性表部分为E000020。然后发现程序可以正常运行 编译教材中的感染例子程序-bookexample-new.rar直接运行main.exe会发现无法运行,会发现该程序和old中的问题一样,要修改代码节表中的权限,使其可读可写可执行。即可编译运行: 使用该感染例子对计算器calc.exe进行感染。将calc.exe文件复制到bookexample-new中,并修改名字为test.exe,将原文件夹中已被感染的test.exe重命名为testt.exe的名字。运行testt.exe,即可感染计算器程序。 手工恢复被感染的calc.exe(需要在xp系统中完成)。用stuPE
11、打开被感染的calc.exe,找出其入口地址,将其改为原addressOfEntryPoint(感染程序中将原起始地址保存在oldEnd中)。改后:保存,计算器即可正常运行:课后习题思考: 编写一个程序,可用来搜索指定目录下的所有exe文件,用MessageBox显示每一个被搜索到的exe文件名。 编写课本中病毒感染程序的病毒清除程序,其可以用来恢复被感染的任何文件。实验体会:通过这次实验,第一次接触到病毒这个东西。在自己动手修改和还原的过程中,对病毒的感染过程有了比较深刻的理解,知道病毒程序修改了原程序的哪些部分,觉得病毒对与我们而言没那么神秘了,原来360弹出一个木马警告,自己还会很紧张,现在360的信任列表里已经有好多程序了。尤其是在重定位的过程中,对重定位过程有了比较深刻的影响,而不仅仅局限于对课本上文字的阅读,而且当城管多弹出一个框时,很有成就感。