第82章 汇编指令与屏显字符

82.1 EICAR

多数反病毒软件都用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的主要功能是:

严格地讲,核心指令的opcode基本都不是屏显字符。EICAR采用“拼凑”指令的方法,把核心指令凑成了可存储在字符串里的屏显字符组合。这项“拼凑”技术还普遍应用于shellcode。

有关“可用屏显字符表示的opcode”,请参见本书附录A.6.5。


[1] 请参见https://en.wikipedia.org/wiki/EICAR\_test\_file。