防病毒程序如何检测EICAR测试病毒?

时间:2009-03-17 08:30:13

标签: antivirus virus heuristics

EICAR测试病毒用于测试反病毒程序的功能。为了将其检测为病毒,

防病毒程序是否应具有测试病毒的病毒定义

OR

启发式检测将其检测为可疑模式并将其检测为病毒。

(我已经看到AV程序在下载时删除文件但没有将病毒识别为EICAR测试病毒的情况。就像一个可疑对象 - >即如果它有定义它应该识别病毒名称,细节等不是吗?)

1 个答案:

答案 0 :(得分:32)

恕我直言,测试病毒的目的是让一些已知无害的东西,并被接受为病毒,以便最终用户可以验证AV软件是否已打开,并可以看到病毒的影响鉴定。想想防火练习,用于AV软件。

我想大多数人都有签名,并直接认出来。

如果实际的EICAR测试的位模式碰巧包含像可疑活动的操作码一样闻到的位模式,我不会感到惊讶,但我不知道是否是这种情况。如果是,那么它可能是一个简单的启发式病毒识别器的有效测试。但是,由于EICAR测试已经存在 long 时间,我还想象任何缓存它的启发式方法都不足以在野外捕获任何东西。

我不希望认识到EICAR证明任何声明强于“AV安装并扫描预期扫描的内容”,如果开发AV系统,我不会尝试做出任何更强烈的声明关于它。

<强>更新

实际的EICAR测试病毒是以下字符串:

X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

经过精心设计(根据Wikipedia article),有一些有趣的属性。

首先,它只包含可打印的ASCII字符。它通常会在末尾包含空格和/或换行符,但这对其识别或功能没有影响。

它引发了第二个属性:它实际上是8086 CPU的可执行程序。它可以保存(例如通过记事本)在扩展名为.COM的文件中,它可以在MSDOS,大多数MSDOS克隆上运行,甚至可以在Windows命令提示符的MSDOS兼容模式下运行(包括在Vista上,但不是在任何64位Windows上,因为他们认为与16位实模式的兼容性不再是优先考虑的事项。)

运行时,它会生成字符串“EICAR-STANDARD-ANTIVIRUS-TEST-FILE!”作为输出。然后退出。

他们为什么要这么努力?显然,研究人员想要一个已知可以安全运行的程序,部分原因是可以测试实时扫描仪而无需捕获真正的病毒并冒着真正的感染风险。他们还希望通过传统和非传统手段轻松分发。由于事实证明x86实模式指令集有一个有用的子集,其中每个字节都满足它也是可打印的ASCII字符的限制,因此它们实现了两个目标。

wiki文章有一个blow-by-blow explanation链接指向程序实际工作方式,这也是一个有趣的读物。增加复杂性的事实是,在DOS实模式下打印到控制台或退出程序的唯一方法是发出软件中断指令,其操作码(0xCD)不是可打印的7位ASCII字符。此外,两个中断每个都需要一个字节的立即参数,其中一个需要是一个空格字符。由于自我强加的规则是不允许空格,所以程序的所有四个最后字节(字符串中的“H + H *”)都会在指令指针到达之前进行修改。

在XP框的命令提示符下使用DEBUG命令反汇编和转储EICAR.COM,我看到了:

0C32:0100 58            POP     AX
0C32:0101 354F21        XOR     AX,214F
0C32:0104 50            PUSH    AX
0C32:0105 254041        AND     AX,4140
0C32:0108 50            PUSH    AX
0C32:0109 5B            POP     BX
0C32:010A 345C          XOR     AL,5C
0C32:010C 50            PUSH    AX
0C32:010D 5A            POP     DX
0C32:010E 58            POP     AX
0C32:010F 353428        XOR     AX,2834
0C32:0112 50            PUSH    AX
0C32:0113 5E            POP     SI
0C32:0114 2937          SUB     [BX],SI
0C32:0116 43            INC     BX
0C32:0117 43            INC     BX
0C32:0118 2937          SUB     [BX],SI
0C32:011A 7D24          JGE     0140

0C32:0110                                      45 49 43 41               EICA
0C32:0120  52 2D 53 54 41 4E 44 41-52 44 2D 41 4E 54 49 56   R-STANDARD-ANTIV
0C32:0130  49 52 55 53 2D 54 45 53-54 2D 46 49 4C 45 21 24   IRUS-TEST-FILE!$

0C32:0140 48            DEC     AX
0C32:0141 2B482A        SUB     CX,[BX+SI+2A]

执行最多JGE 0140的指令后,最后两条指令已被修改为:

0C32:0140 CD21          INT     21
0C32:0142 CD20          INT     20

大多数DOS系统调用都是通过INT 21调度的,AHAX寄存器的值指定要执行的函数。在这种情况下,AH是0x09,这是打印字符串函数,它打印从偏移量0x011C开始的字符串,由美元符号终止。 (你必须在纯DOS中使用不同的技巧打印一个美元符号。)INT 20调用会在超过该点的任何额外字节执行之前终止进程。

自修改代码是一种早期的病毒技巧,但在这里它用于保留可以在字符串中使用的字节值的限制。在现代系统中,如果在运行COM文件的MSDOS兼容模式上强制执行,则数据执行保护功能可能会捕获修改。