Payloads

 

Purtroppo con l'arrivo dell'assembly a 32 bit i payload, specialmente quelli grafici, si sono piùttosto ristretti.Programmare una grafica decente è abbastanza difficile, soprattutto se non si sta operando sotto i 16 bit. Comunque sia,parlando sotto DOS, ci sono un sacco di capolavori veri e propri, considerando anche se si tratta sempre di virus, e non di un demo qualsiasi.Con gli esempi su questa pagina vi voglio dare una base, un idea su tutto cìò, e vedrete che non ci sono assolutamente limiti.

Iniziamo con la visualizzazione di un testo, però questa volta non solamente usando la funzione 9h, ma ci mettiamo anche un pò di colore nella facenda.Per fare ciò utilizzeremo l'interrupt 10h.

mov bp,offset testo ; qui carichiamo la nostra stringa

mov ah,13h ; Funzione 13 dell'interrupt 10h = scrivi stringa

mov al,01h ; Funzione 01: settiamo il text mode

mov bl,X ; qui inseriamo il colore: 0=nero,1=blu,2=verde,4=rosso,

6=marrone,7=bianco + i pseudo colori cyan e magenta al posto 3 e 5

mov cx,XX ; la quantità di bytes da scrivere;dipende ovviamente dal testo

mov dh,XX;

mov dl,XX ;  ecco che dobbiamo definire esattamente la posizione sullo

schermo

int 10h ; esegue tutto ciò.

 

Usando l'interrupt 16h invece, ci possiamo far dare il controllo della tastiera. Per esempio possiamo far "girare" le lucette della tastiera (stampa,caps-lock ecc).

mov bx,0417h ; funzione 86h dell'interrupt 15h

mov cx,0001h ; abbiamo il delay in cx:dx

mov dx,49f0h

mov si,X ;quante vole le vogliamo fare accendere e spegnere

continua: mov (byte bx),32 ; la luce del Num lock

call accendi ; così arriviamo alla parte del codice che dà inizio a tutto ciò

mov (byte bx),64 ; la luce del Caps lock

call accendi ; ora tocca al caps lock

mov (byte bx),16 ; ed infine il scroll lock

call accendi

dec si ; decrementa tutto quanto di 1

jnz continua ; se non abbiamo ancora finito ripeti tutto da capo

mov (byte bx),0 ; altrimenti spegni le luci

accendi: mov ah,01h ; qui troviamo il codice per accendere le luci

int 16h ; ecco fatto

mov ah,86h  ; definiamo il delay tra il spegnimento a l'accensione

int 15h ; eseguito

Altre possibilità sono di usare l'interrupt 17h che dà accesso alla stampante,oppure port 61 che controlla lo speaker interno del vostro PC.

Come vedete ci sono un sacco di possibilità, ma ora diamo uno sguardo a qualche effetto più "elevato", gli effetti grafici.

 

L'effetto pixel

pixel.ren (49959 bytes)

L'effetto pixel veniva, o meglio viene, usato da diversi virus, per esempio lo usa il virus AIDS, dove all'interno delle lettere "AIDS" si manifesta questo effetto.

mov ax,13h ; settiamo il modo video a 13h

int 10h ; ecco fatto

mov bx,0a000h

mov ds,bx ; carichiamo il valore di bx del data segment

loop_: mov (bx),cl ; per il "movimento" dei pixels mi sembra chiaro che ci

vuole un loop continuo, finchè non sarà stato premuto un tasto.

add bx,bx ; nulla di nuovo

jnc $+5 ; la versione del jump condizionale con il carry flag

xor bl,45

loop loop_ ; rifai lo stesso giochetto

mov ah,01 ; funzione 01 del'interrupt 16h verifica se è stato premuto

un tasto

int 16h ; ecco l'interrupt

jz loop_ ; se no conitnua con il loop

mov ax,3 ;

int 10h ; ed infine ripristiniamo il modo video

 

L'effetto plasma

plasma.ren (13416 bytes)

 

L'effetto plasma è un ottimo esempio per dimostrare quanto si possa fare con l'assembly avendo a disposizione solamente qualche centinaia di bytes. Il codice stesso è forse un pochino più lungo e complesso paragonato a quello del pixel, però vi assicuro che è un effetto assai interessante e molto affascinante.

mov ax,13h

int 10h ; settiamo il modo video a 13h

mov di,offset tavolozza ; azzeriamo la tavolozza con il valore inizialiazzato

come (tavolozza db XXXX dup(?) )

xor al,al

mov cx,576 ; copia il valore in cx

rep stosw ; ripete l'esecuzione di stosw (store string(word)

mov ax,3f00h ; ora abbiamo il valore in ax

xor bx,bx ; quindi azzeriamo il registro bx

Ora abbiamo bisogno di un loop per la tavolozza vera e propria.Prima però vediamo come fare a settare la tavolozza prima che andiamo verso il loop.

mov dx,03c8h ; qui si trova l'index port

mov al,1 ; copiamo il valore in al

out dx,al ; trasferisce il valore di al all'index port

inc dx ; incrementa dx di 1

lea si, tavolozza(bx) ; carica la tavolozza

mov cx,576

rep outsb; ripete l'operazione del trasferimento dell'output string (byte)

Ora possiamo settare la tavolozza

mov tavolozza(bx),ah ; adesso seguono i valori della tavolozza

mov tavolozza(bx+2),al

mov word ptr tavolozza(bx+193),ax

mov word ptr tavolozza(bx+384),ax ; ecco fatto

add bx,3 ; ci aggiungiamo il valore 3 che funge come puntatore

inc al ;incrementa al

dec ah ;decrementa ah

jns XXX ;e qui dobbiamo ritornare a fare di nuovo il loop da capo

A questo punto potete implementare un generatore di numeri a caso come volete voi, male che vada non funzionerà.Scherzo, potete usare un generatore qualsiasi, magari usando una piccola procedura.

Ora però ci dedichiamo al movimento dell'intero immagine.Prima carichiamo di nuovo la tavolozza per la rotazione delle figure, o quello che è.

mov si, offset tavolozza

mov di, offset tavolozza+576

mov cx,576 ; ecco che abbiamo finito

rep movsb ; credo che avete capito di che cosa si tratta

A questo puntio potete implementare anche qualche riga che controlla se

è stato premuto un tasto per uscirne dal programma.

in al,dx  ; ecco che continuiamo con le operazione sulla port

test al,8 ; corrisponde ?

jnz XXX ; altrimenti esegui il loop

add bx,3 ;aggiungiamo il valore 3

cmp bx,576 ;e paragoniamo ancora

jne XXX ; e qui dovrebbe esserci il jump che ripete l'intero loop

Qui vi serve una prima calcolazione in base alla generazione dei numeri casuali, e poi potete settare l'intero movimento come vi piace, la grandezza, come va piazzato sullo schermo ecc.Certamente sarà un pò di lavoro,però alla fine si possono raggiungere dei resultati più che buoni.

 

L'effetto fuoco

fire.ren (10889 bytes)

 

Il fuoco è stato da sempre un effetto molto gradito,specialmente per la programmazione di demo.Questa è sicuramente la cause per la quale esistono una mare di effetti diversi, strutture e colori del fuoco completamente differenti.

Per prima cosa settiamo il modo video

mov ax,13h

int 10h ; ecco fatto

mov dx, 03d4h

mov ax,4209h ; settiamo la grandezza ( pixels)

out dx,ax; ora viene eseguito

mov di, offset fine_tavolozza ; con questo carichiamo l'ultima parte dell

tavolozza, che sarà una variabile (db XXX dup(?) )

mov al,03fh

mov cx,XXX

rep stosb ; e questo l'abbiamo già conosciuto prima

Ora settiamo la nostra tavolozza vera e propria.

mov dx,3c8h

xor al,al ; azzera il registro al

out dx,al ; completa l'operazione

inc dx ; incrementa dx di 1

mov cx,XXX

mov si,offset tavolozza ; qui carichiamo la tavolozza, quindi potete usare

la tavolozza che preferite voi.

rep outsb ; ripete l'operazione

Se stiamo lavorando nel campo 32 bit, sarebbe utile usare anche altri segmenti, più preciso gli extra segment.Bene, quindi prepariamo il loro utilizzo.

mov ax,cs ; copiamo il valore del code segment in ax

add ax,XXXXh ; aggiungiamoci la grandezza

mov fs,ax ; e carichiamo tutto quanto in fs, il nostro segmento nuovo

La stessa procedura vale per il nostro secondo extra segment, cioè gs

Ora dobbiamo azzerare(cancellare) il primo frame

push fs ; usando il primo extra segment

pop es ; adesso si trova in es

xor di,di ;azzera di

xor eax,eax ;azzera il registro eax, la versione di ax solamente a 32 bit

mov cx,XXXX

rep stosd ; ripete tutto quanto

Lo stesso vale per il secondo frame, usando il secondo extra segment, cioè "gs".

Quindi inseriamo un piccolo loop che ripete i frames

push fs gs ; salviamo i registri

pop es ds; ora ritroviamo i frames in es e ds

mov di,1 ; ecco il movimento

mov cx,XXXXX ; e ovviamente il numero in cx

Bene, adesso dovete solamente inserire un codice che vi genera i numeri delle pixels e non scordatevi della vostra tavolozza.

 

Indice - VAI