新书推荐:病毒查杀技术详解

发表时间: 2024-12-13 08:57

如果我们的计算机不幸感染了恶意病毒,通常我们会使用反病毒软件拦截和查杀恶意病毒软件。反病毒软件防护病毒的方法我们在前文已经阐述过,此处不再赘述。接下来我们还是以Win32.Capric.exe的“X病毒”为例,首先使用手工的方法清理病毒,然后再写一个针对该病毒的专杀工具

实验一百一十二:手工破解PE病毒


手工清除helloWorld_virus.exe感染的“X病毒”。由上一小节对病毒源代码的分析我们得知,如果需要彻底修复被感染的目标文件,我们需要将被病毒修改的部分逐一进行修复。

为了直观的获取helloWorld.exe被感染前后的变化,我们使用第十章中开发的工具PECompare.exe对比感染病毒后的两个目标文件,如下所示:

图16-27 比较感染病毒前后的目标文件

图16-27 比较感染病毒前后的目标文件

如果我们对照感染病毒前的目标文件,清理病毒将是一件非常容易的事情。现在让我们假设在没有目标原文件参照的情况下,如何修复。

●第一步:修复程序的入口地址。

思路:当我们运行被感染的目标文件时,会先弹出一个提示信息,然后再跳转到原程序的入口地址处执行。因此,我们可以在虚拟机安全环境下,使用OllyDbg调试器跟踪调试被感染的目标文件。

1.开始调试之前,需要先在helloWorld_virus.exe文件PE头的3BH地址处去掉病毒标记’X’,将58H改为00。

000000B0 50 45 00 00 4C 01 03 00 8C 10 A7 60 00 00 00 00 PE..L...?....

000000C0 00 00 00 00 E0 00 0F 01 0B 01 05 0C 00 02 00 00 ....?..........

000000D0 00 04 00 00 00 00 00 00 00 32 00 00 00 10 00 00 .........2......

000000E0 00 20 00 00 00 00 40 00 00 10 00 58 00 02 00 00 . ....@....X....


1. 将helloWorld_virus.exe拖入调试器,按F8单步跟踪,直到弹出感染病毒提示信息,点击“确定”后,执行下一条语句后,EAX寄存器中的值00001000H就是原程序的入口地址。再下一条语句则是加程序加载基址,如图16-28所示。

图16-28 获取原程序的入口地址

图16-28 获取原程序的入口地址


●第二步:修复最后一个节区对齐后的大。

1. 取PE头的3CH地址处FileAlignment字段(文件中的节的对齐粒度)的值为200H。

2. 观察最后一个节区节表项:

000001F0 2E 64 61 74 61 00 00 00 .data...

00000200 00 0E 00 00 00 30 00 00 00 0E 00 00 00 08 00 00 .....0..........

00000210 00 00 00 00 00 00 00 00 00 00 00 00 60 00 00 E0 ............`..?


由上可知,最后一个节区在文件内的起始地址为00000800H,观察PE文件800H地址处存储的数据:

00000800 48 65 6C 6C 6F 57 6F 72 6C 64 50 45 00 00 00 00 HelloWorldPE....

00000810 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

00000820 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

………

000009F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

00000A00 E8 00 00 00 00 5D 81 ED 05 10 40 00 0B ED 74 21 ?...].?.@..韙!

………

我们会发现A00H地址处之前存在大片的空白区域,有理由相信从A00H开始存储的是感染的恶意病毒代码。因此,我们可以将A00H地址后的所有数据全部删除。原节区文件中对齐后大小(SizeOfRawData)修改为200H

●第三步:修复最后一个节区实际大小VirtualSize 为0DH(800H开始的14个字节)。

●第四步:修复整个映像文件的大小SizeOflmage为00004000H。 最后一个节区内存RVA地址为3000H,文件内对齐后的大小为200H(对应内存空间1000H)。因此,映像文件的大小=3000H+1000H。

至此,修复完成。执行修复后的目标文件如下图所示:

图16-29 修复后的目标文件

实验一百一十三:制作病毒专杀工具


让我们写一个“X病毒”的专杀工具。在开始写代码之前,让我们先分析一下专杀工具的编写思路。

●思路:

1.在PE头3BH地址处病毒特征标记'X'修改为’00’。

2.原文件最后一个节区文件对齐后大小=被感染程序入口地址-最后一个节区的RVA地址。

3.修复原文件的程序入口地址。使用调试器加载被感染文件,从代码中动态获取原程序入口地址。

在病毒文件的入口地址处调用WriteProcessMemory插入一个int3指令,并开始单步执行。当单步执行到从入口地址开始的0x61地址处(第一条PUSH指令的下一条指令地址01013061H)时,从context上下文中取出栈顶stCT.Esp的值(000DFF80H),然后调用ReadProcessMemory函数读取该地址处存储的原程序入口地址。

参见病毒程序源代码:

; 这些在感染过程中会发生变化,因此需要保存

push dword ptr [ebp+tmpep] ;入口地址

pop dword ptr [ebp+oldep]

push dword ptr [ebp+tmpib] ;装载基址

pop dword ptr [ebp+oldib]

当病毒文件加载内存后,如下图所示:

图16-30 从内存中取出原程序入口地址

图16-30 从内存中取出原程序入口地址

0101305BH地址处第一次出现PUSH指令,对应的硬编码为8F85H。执行第一条PUSH指令后,原程序入口地址已经入栈,可以从栈顶取出,保存到临时变量中返回。

4.最后一个节区实际大小VirtualSize = 原文件对齐后大小。

5.原文件映像文件SizeOflmage大小=最后一个节区的RVA地址+原文件对齐后大小(1000H向下取整)。

6.清理后病毒文件的大小=最后一个节区在文件内的起始地址+原文件对齐后大小。