PE 病毒感染分析与清除
实验?3????PE?病毒分析与清除(三)
PE 病毒分析与清除
1) ?了解 PE?病毒的基本原理
2) ?熟悉 PE 病毒中的部分关键技术
3) ?学会清除 PE 病毒
第一阶段:
?熟悉 Masm32
1)????安装 masm32v11
2) ???熟悉 masm32 的基本环境
3) ???写一个最简单的 HelloWorld?程序,并编译成功
4) ???对得到的可执行文件进行反汇编, 比较其反汇编代码和最初的汇编代码有 哪些异同?
5) ???查看并理解 masm32\bin?下各个批处理程序,了解它们的大致功能
第二阶段:
?熟悉病毒重定位的基本思路和方法
??在 HelloWorld.exe 中添加一段代码, 该段代码满足以下几个条件:
该段代码弹出一个对话框(标题: 武大信安病毒重定位,内容: 姓 名+学号后四位)
该段代码同时包括代码和字符串数据。
该段代码可以插入到.text??节的任意指令之间,而不需要修改该段代?码中的任何字节。
第三阶段:
?搜索 API?函数地址
??用 ollydbg??打开 HelloWorld.exe?,获取 kernel32.dll??模块基地址,定位到
kernel32.dll 模块。
??从内存中的 kernel32.dll 模块获取函数 LoadLibraryA 和 GetProcAddress 的函
数地址,并实际检验获得的地址是否正确
第四阶段:?PE?病毒感染分析与清除
?编译教材中的感染例子程序-bookexample-old.rar
使用该感染例子对 HelloWorld.exe?进行感染。思考以下问题:
??该病毒在感染文件时具体做了哪些操作?
??该病毒如何返回 HOST?
找出该病毒程序存在的一些问题,并解决这些问题。
编译教材中的感染例子程序-bookexample-new.rar
使用该感染例子对计算器 calc.exe 进行感染。
手工恢复被感染的 calc.exe??(功能恢复)。
课后习题思考:
?对 Win10 下的在?32 位及 64 位程序来说, 如何通过 PEB 获取 kernel32 基地址? 32?位和?64 程序有何差异?
?尝试编写一个程序,可用来搜索指定目录下的所有 exe 文件,用 MessageBox 显示每?一个被搜索到的 exe 文件名。
?编写课本中病毒感染程序的病毒清除程序,其可以用来恢复被感染的任何文件
?课程提供的病毒感染例子程序在 64 位系统中无法正常感染, 请定位其原因, 并给出?解决方案。
?
PE 病毒感染分析与清除
对感染来说,它一方面需要使得对方具备自己的功能,另一方面也不破坏对方程序的功能。所以病毒代码执行完毕之后,它必须要将控制权交给原始程序,从而防止病毒被发现。
使用masm32 编译教材中的感染例子程序-bookexample-old.rar ,使用Stud_PE修改代码段属性为可读可写可执行。
本病毒程序的感染目标是 test.exe ,它没有破坏性,test.exe被感染后,首先执行病毒代码,然后执行自身代码。如下图所示,存在四个文件。其中main.exe是PE病毒程序,它会感染当前目录下名为“test.exe”的文件。
将HelloWolrd.exe 改名,放到同一目录下,运行main.exe 对test.exe进行感染,打开test.exe,发现test.exe 由原来的直接弹出HelloWolrd 弹框变成了先弹出和病毒一样的弹框再弹出HelloWorld。
运行test.exe,首先弹出main.exe的弹窗,然后才弹出HelloWorld弹窗。查看exe文件大小,发现已经从原来的2.5KB增长到了6.5KB,也能说明目标程序已经被成功感染。
该病毒在感染文件时的具体操作如下:
1.先定位kernel32基址
2.定位相关API函数地址
3.打开“test.exe”文件,获得文件大小,创建映射文件,得到映射对象句柄
4.判断MZ-PE标志位确认为PE文件 ,判断感染标志dark,若已被感染则跳出HOST程序,否则继续
5.获得Directory的个数,定位section-header起始位置,在最后一个节区头末尾新添加.hum节区头
6.保存旧的入口点(返回HOST),修改入口点指向病毒代码起始位置
????其中,前三步都是在给病毒进行自我重定位。之所以需要进行自我重定位,是因为根据HOST特征逐一硬编码这种方式不太可取,其繁琐且未必准确,所以采用另一种方法,病毒代码运行过程中自我重定位。首先它计算刚才的差异值,接着调用call delta将下一条语句开始位置压入堆栈,此时堆栈顶端存放的是pop ebp语句,它在内存汇总真实的地址;再后面是sub减法操作,ebp减去offset delta;最后当我们需要重定位时,比如使用varl变量,重定位则为ebp+offset来消除差异,此时eax中存放varl在内存中的真实地址。
病毒首先定位到文件的Number of Data Directories ,可以看到有0x10项, 再从0x128开始偏移0x10*8字节到达0x1A8。
接着查看下一段的首地址进行验证,确实是 0x1A8,说明定位成功。
然后,病毒利用最后一个节区头和代码段之间空闲区域,新写入了一个节区头,在这个节区头里定义了相关的名字,RVA文件大小,将病毒内容进行复制。
但是bookexample-old这个病毒程序存在一定的问题,利用这个已经感染的test.exe去感染计算器exe文件时会报错,因为病毒程序在感染计算器的过程中感染程序用一个变量保存原来的入口点。但是call时保存的不是host的入口点, 而是计算器(即被感染程序)的入口点,所以无法返回。
使用OllyDbg打开原先被感染的test.exe进行查看。
可以看到被感染程序首先call了下一条指令,相当于把程序的入口点的地址保存到了ebp里面,这是病毒用于自我重定位寻址的。
接着通过eax进行循环确定当前文件是PE格式MZ头等信息之后,之后就是定位到kernel32的基地址,会再次循环寻找病毒定义好的api函数地址。
再跟踪进入病毒的感染模块,打开test.exe文件,获取文件大小。获取内存中test.exe的起始地址。
接着病毒对感染标志位进行判断是否感染。如果没有被感染则进行感染, 否则提示已经感染信息。按照注释给出,三个红框中的内容应该是检查MZ、检查PE和检查dark,但是我这里注释没有显示出来,使用吾爱破解版的OllyDbg注释会多一些,但这三处似乎也没有显示出所需要的内容注释。
定位到病毒往源文件写入和保存程序入口点的位置,发现其保存的外壳的程序入口点错误。
这会导致了程序感染完计算器后无法返回到外壳HelloWorld程序,从而产生报错。
修改这个病毒程序的源代码,新加一个入口点oldEipTemp,相当于缓存的作用。
同时修改modipe.asm,修改存入到oldEipTemp偏移的位置,而不是存入到 oldEip中,修改之后就能成功返回正确的外层地址。
使用masm32对new版本的病毒程序进行编译,将calc.exe修改为test.exe,使用main.exe进行感染。打开计算器程序,可以看到计算器也被感染了。先弹出病毒提示框,再显示计算器界面。
下面使用UltraEdit对被感染的计算器进行修复。找到可选头第三部分的入口点地址,位1F2DCH,由于是小端序,反过来查找DC F2 01 00H,这就是病毒进入的地方。
而后面找到的一个就是原来的入口地址,因此将原来的地址修改为75 24 01 00H(这里是计算器应该在的程序入口地址),保存。再次打开计算器,可以看到不再进行弹窗。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!