病毒分析与手工查杀
今天又可以上最喜欢的姚老师的实验课了!
先浅浅记录一下理论知识。
有需要实验工具和靶机的可以留言我给你分享~
实验目的:
分析PE文件结构,理解关键字段意义,掌握RVA、VA、FOA地址间转换;分析文件型病毒的原理;了解文件型病毒的发现方法,能利用OD等工具分析PE病毒,并通过手工方式进行病毒查杀;分析病毒专杀工具的基本设计方法。
系统环境及工具:
WinSR虚拟机、病毒样本、OllyDBG、PE Explorer、UltraEdit32
实验原理和PE结构待补充。
用ollyDBG修改病毒感染程序
先感染文件hei0.exe,感染前文件大小是3K,感染后是9k
用OD修改病毒程序
首先要找到最后一个jmp指令,因为病毒的代码是贴在最后一个节,且执行完病毒的代码完成文件感染后要jmp回到程序入口点。然后源程序入口点肯定是不会都一样的,不同的exe文件入口点不一样,若是写死则无法兼容感染其他exe。于是我们可以合理推测,在执行病毒代码之前,病毒把程序的入口点的RVA值保存在某个地址,执行完病毒代码后把地址放在aex中然后jmp aex。(为啥是aex寄存器呢,我也不是特别清楚,但是我发现很多jmp都是把地址放到aex里面然后,jmp aex)
找最后一个jmp aex
直接在od上右键->查找->命令->输入jmp eax,或ctrl F,不要勾选整个块,我们就可以ctrl L一直往下下一条。
然后在指令的地址处下一个断点F2,然后重载
换了一台机器调试,可以看到断点停下时jmp 的值是00401000,也就是源程序的入口点。
按F7运行就回到了程序入口点,然后我们右键,用OD脱壳调试进程。
选择方式2,点击脱壳,也可以选择方式一对比一下,但是这次实验方式一脱壳是没办法运行的。
另存为文件后测试是否还具有传染性,无。
病毒感染机制分析
把感染前和感染后的样本重命名为hei0.exe和hei1.exe后放到一个目录下,对比分析。
使用PE Explorer分别打开两个文件,对比文件入口点(OEP--Address of Entry Point)和镜像大小(Image Base),并记录如下数据。
|
OEP |
ImageBase |
hei0.exe |
00001000 |
00400000 |
hei.exe |
00003200 |
00400000 |
感染前后程序入口点对比,感染前1000,感染后3200
感染前后镜像大小对比,感染前16384byte,感染后18944byte
查看比对Section Header的数据信息并记录到下面表格。
|
Virtual Size |
Virtual Address |
Size of Raw Data |
Point to Raw Data |
hei0.exe的.data |
00000027h |
00403000h |
00000200h |
00000400h |
Hei1.exe的.data |
00001A00h |
00403000h |
00001A00h |
00000800h |
下面对比图可以看到Virtual Size,Size of Raw Data,节属性发生变化
打开Ultra Editor,择“文件”菜单中的“比较文件”功能对hei0.ex_和hei.ex_进行二进制比对,可以发现在hei.exe文件的0xa00处开始的数据块为存储于.data节的病毒代码。
搜索hei0的入口点1000,然后记录数据文件偏移记录21ch,计算该地址在内存虚拟地址为
21ch-800+3000+400000 = 0040481c
Od加载查看对应地址,发现就是jmp eax
用以上方法对几个已感染和未感染的文件对比分析,并作出如下记录
文件 |
原文件的 入口地址 |
感染病毒文件的 入口地址 |
感染病毒文件的最后一个跳转目的地址 |
mspaint.exe |
34CF5 |
53800 |
010345C |
notepad.exe |
73A5 |
13000 |
010073A5 |
wordpad.exe |
119B |
3A00 |
0100119B |
通过以上分析,可以初步判断,病毒的感染方式为:
在最后一个节后添加恶意代码,并修改程序的入口点为恶意代码的入口点,修改对应的节表的大小,和镜像大小,不然在执行时文件会解析出错,在完成感染以后jmp回到源程序的入口点执行程序。
手工查杀
修改思路如下:
(1)查找病毒寄存特征。
入口点在代码节(.text)之外,病毒代码存储于最后一节、且在病毒代码段后的一个双字为原程序代码入口RVA(在.text节范围内)。
文件病毒代码以0xE58BE0FF结尾。
(以上特征是对简化后的病毒特征的总结、实际中的病毒要复杂的多);
(2)查找原程序入口点。在PE头偏移25h字节处取4字节
(3)修改程序入口点为原程序入口点。
(4)修改病毒感染的最后一个节表的SizeOfRawData,使之大小变为去掉病毒代码时的大小。
(5)修改PE文件选项头中的SizeOfImage为去掉病毒代码后的大小。
(6)清除病毒代码数据。
(7)保存清除病毒代码后的文件。
要删除病毒代码,首先查找病毒代码选块。
要先找到程序入口点,因为病毒为了在程序运行时取得cpu控制权,会把源程序入口点改为自己的代码入口点。
根据老师给的参考文件,我明白了,指定程序入口点的位置在PE00后偏移25字节的位置,取4字节。
这里的入口点是RVA,我们需要根据节表进行RVA和FOA的转换。
可以根据虚拟偏移判断3200位于.data节,原始偏移为800,那么程序入口的代码在静态下位于:
3200-3000+800 == A00
(!!!!注意这里是A00不是1000,这些数字都是16进制的)
我第一次算的1000,然后把1000后面的代码块都删掉了,然后那么怎么还是多出一段。
然后我们要选中从A00开始,到结束标志(文件病毒代码以0xE58BE0FF结尾)的代码块,直接按delete删掉。
一个快速选中代码块的办法,记住代码块的开始和结束的地址,编辑->定义选块。
如何找病毒结束的地址呢?
点击搜索->查找hex数值,搜FFE08BE5(我们读数字是大端,winhex是小端存储,低地址低位高地址高位)
删掉选块delete
把入口点由3200修改为1000,我猜为啥是1000,因为代码和数据都放在.text节,.text节的虚拟偏移是1000.
如何看节表开始呢,就看右边的名称,一个节表项开始的八个字节定义的是节表的名称,所以节表名称最多7个字符,因为有一个. ,修改最后一个节表就是.data节。首先找到.data节。
然后修改节表原始大小为00020000(小端),虚拟(真实)大小为27
然后修改size of image,被感染后大小为4A00,我们要改成4000,为啥是4000我也不知道。
然后另存为,然后运行。
运行成功。
实验总结待补充。