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 dl,XX ; ecco che dobbiamo definire esattamente la posizione sullo
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 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
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
mov ah,86h ; definiamo il delay tra il spegnimento a l'accensione
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
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
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.
jnc $+5 ; la versione del jump condizionale con il carry flag
loop loop_ ; rifai lo stesso giochetto
mov ah,01 ; funzione 01 del'interrupt 16h verifica se è stato premuto
jz loop_ ; se no conitnua con il loop
int 10h ; ed infine ripristiniamo il modo video
L'effetto plasma
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(?) )
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
lea si, tavolozza(bx) ; carica la tavolozza
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 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
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 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
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 dx, 03d4h
mov ax,4209h ; settiamo la grandezza ( pixels)
mov di, offset fine_tavolozza ; con questo carichiamo l'ultima parte dell
tavolozza, che sarà una variabile (db XXX dup(?) )
rep stosb ; e questo l'abbiamo già conosciuto prima
Ora settiamo la nostra tavolozza vera e propria.
xor al,al ; azzera il registro al
out dx,al ; completa l'operazione
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 eax,eax ;azzera il registro eax, la versione di ax solamente a 32 bit
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 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