多数反病毒软件都用EICAR进行自检。EICAR是一个可以在MS-DOS平台上运行的应用程序。它仅在屏幕上显示“EICAR-STANDARD-ANTIVIRUS-TEST-FILE!”这样一个字符串。[1]
EICAR最重要的特点是:它的每个字节都是可以在屏幕上显示出来的ASCII字符串。我们在文本编译器里粘贴下列字符串,即可生成EICAR文件:
X5O!P%@AP[4\PZX54(P^)7CC]7]$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
EICAR文件的汇编指令如下:
; initial conditions: SP=0FFFEh, SS:[SP]=0
0100 58 pop ax
; AX=0, SP=0
0101 35 4F 21 xor ax, 214Fh
; AX = 214Fh and SP = 0
0104 50 push ax
; AX = 214Fh, SP = FFFEh and SS:[FFFE] = 214Fh
0105 25 40 41 and ax, 4140h
; AX = 140h, SP = FFFEh and SS:[FFFE] = 214Fh
0108 50 push ax
; AX = 140h, SP = FFFCh, SS:[FFFC] = 140h and SS:[FFFE] = 214Fh
0109 5B pop bx
; AX = 140h, BX = 140h, SP = FFFEh and SS:[FFFE] = 214Fh
010A 34 5C xor al, 5Ch
; AX = 11Ch, BX = 140h, SP = FFFEh and SS:[FFFE] = 214Fh
010C 50 push ax
010D 5A pop dx
; AX = 11Ch, BX = 140h, DX = 11Ch, SP = FFFEh and SS:[FFFE] = 214Fh
010E 58 pop ax
; AX = 214Fh, BX = 140h, DX = 11Ch and SP = 0
010F 35 34 28 xor ax, 2834h
; AX = 97Bh, BX = 140h, DX = 11Ch and SP = 0
0112 50 push ax
0113 5E pop si
; AX = 97Bh, BX = 140h, DX = 11Ch, SI = 97Bh and SP = 0
0114 29 37 sub [bx], si
0116 43 inc bx
0117 43 inc bx
0118 29 37 sub [bx], si
011A 7D 24 jge short near ptr word_10140
011C 45 49 43 ... db 'EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$'
0140 48 2B word_10140 dw 2B48h ; CD 21 (INT 21) will be here
0142 48 2A dw 2A48h ; CD 20 (INT 20) will be here
0144 0D db 0Dh
0145 0A db 0Ah
笔者在上述代码里追加了各种注释,以介绍执行指令后各寄存器和栈的状态。
本质上说,这个程序的关键指令(下文简称“核心指令”)只有:
B4 09 MOV AH, 9
BA 1C 01 MOV DX, 11Ch
CD 21 INT 21h
CD 20 INT 20h
INT 21的第9号功能(AH寄存器)的作用是显示字符串。系统中断从DS:DX获取字符串的指针,然后把它输出在屏幕上。另外,这种字符串必须以“$”字符结尾。当今的操作系统显然继续兼容了这种指令。不过这种指令属于CP/M(Control Program for Microcomputers),来自比MS-DOS还要古老的磁盘操作系统。
由此可见,EICAR的主要功能是:
向寄存器(AH和DX)传递预定值。
在内存中准备INT 21和INT 20的opcode。
执行INT 21和INT 20。
严格地讲,核心指令的opcode基本都不是屏显字符。EICAR采用“拼凑”指令的方法,把核心指令凑成了可存储在字符串里的屏显字符组合。这项“拼凑”技术还普遍应用于shellcode。
有关“可用屏显字符表示的opcode”,请参见本书附录A.6.5。
[1] 请参见https://en.wikipedia.org/wiki/EICAR\_test\_file。