Eccovi un tutorial riguardo la spiegazione dell'algoritmo utilizzato dal famoso client mIRC 6.x
Lo scopo di questa guida non è quello di utilizzare il metodo per usi illegali bensì capire passo passo la tecnica e la logica attuata dal programmatore (Khaled Mardam-Bey) ed in contemporanea capire l'utilizzo di alcuni elementi del mirc-scripting.
Per l'occasione infatti, sono state "tirate giù" alcune righe di codice con il solo scopo didattico e divulgativo, sottolineato anche dalla voluta omissione di grosse parti di codice proprio perchè lo scopo non è la frode, bensì la conoscenza.
Dopo questa indispensabile quanto opportuna premessa inizio col dire che diversi sono i metodi utilizzati dai programmatori per "proteggere" i propri software; uno di questi è il classico keygen user\passwd che consiste nel calcolare,dietro preciso algoritmo,il seriale (password) in base all'username immesso dall'utente. La tecnica si basa sull'utilizzo di una "matrice" ovvero una serie di valori,nella stragrande maggioranza dei casi alfanumerici,settati dal programmatore stesso che andranno ad agire col valore specificato dall'utente (username). Nel nostro caso la matrice è composta da 40 elementi (valori) alfanumerici che ovviamente non andrò a specificare visto che il nostro obbiettivo non è quello di andare a crackare il programma.
Esempio di settaggio matrice: set %val.matrice1 0 set %val.matrice2 23 set %val.matrice3 39 set %val.matricen N .. Bene, direi dopo questa piccola introduzione, di andar in fondo sull'algoritmo vero e proprio:
La nostra password è composta da due elementi separati che utilizzano metodi di calcolo differenti (anche se le differenze alla fine son quasi irrisorie):
Password -> parte1-parte2
Calcolo [prima parte] della passwd:
Come già detto l'algoritmo si avvia fornendogli un input (username) di dimensioni maggiori\uguali a 5 caratteri.
.1 alias keygen.6 { .2 if ($len($1) >= 5) { .3 set %mircData1 11 .4 set %mircData2 6 .5 set %mircData3 17 .6 set %mircData4 12 .7 set %mircDataN N .. .8 set %key.user $1 .9 set %primaparte 0 .10 set %secondaparte 0 .11 set %key.user.len $len($1) .12 set %key.cicle 1 .13 while (%key.cicle <= %key.user.len) { .14 set %key.ascii $instok(%key.ascii,$asc($mid(%key.user,%key.cicle,1)),%key.cicle,32) .15 inc %key.cicle } .16 primaparte .17 secondaparte .18 echo -a [Keygen 6.x] Fullname: $+ %key.user $+ S\N: $+ %primaparte $+ - $+ %secondaparte $+ } }
Spiegazione:
.1 Imposto il comando dell'alias che dovrà essere seguito dall'username scelto (Es. /keygen full) .2 Controllo che la lunghezza dell'username inserito sia maggiore o uguale a 5 caratteri .3\4\5\6\7 Setto i valori della matrice .8 Salvo l'username specificato sulla variabile %key.user .9 Inizializzo la prima parte che comporrà il seriale .10 Stesso discorso per la seconda .11 Calcolo la lunghezza della stringa inserita (username) e la salvo sulla variabile %key.user.len .12 Setto la variabile %key.cicle per il ciclo iterativo che andremo a fare .13 Creo un while loop utilizzando la variabile sopra settata che durerà in base alla lunghezza dell'username .14 Calcolo di ciascun carattere il rispettivo valore in ascii e memorizzo sulla variabile %key.ascii .15 Incremento la variabile %key.cicle per permettere la continuazione del ciclo .16 Richiamo lo script a calcolare la prima parte del codice seriale .17 idem per la secondo parte .18 Stampo l'username ed il seriale calcolato (ovviamente prima eseguirà i due calcoli che andrò a spiegare adesso)
.19 alias primaparte { .20 set %cnt 3 .21 set %key.array 0 .22 while (%cnt <= %key.user.len) { .23 set %tmp $calc($gettok(%key.ascii,%cnt,32) * %mircData [ $+ [ %key.array ] ] ) .24 set %primaparte $calc(%primaparte + %tmp) .25 inc %cnt .26 inc %key.array .27 } .28 }
Spiegazione alias "primaparte":
.20 Setto la variabile %cnt per il ciclo iterativo che andremo a fare (Viene settata a 3 perchè l'algoritmo prevede il calcolo del seriale partendo dal TERZO carattere della stringa inserita dall'utente,ignorando quindi le prime tre cifre) .21 Inizializzo la variabile %key.array che utilizzerò per andare a leggere ciascun valore della matrice .22 Imposto il ciclo iterativo sempre in base alla lunghezza dell'username dato .23 Moltiplico ciascun valore numerico ascii dell'username precedentemente settato nella variabile %key.ascii per il primo valore di matrice .24 Calcolo la primaparte del seriale sommando il suo valore corrente col rispettivo calcolo fatto nella riga precedente .25 Incremento la variabile %cnt per permettere la continuazione del ciclo iterativo .26 Incremento la variabile %key.array per permettergli di leggere il valore successivo della matrice
.29 alias secondaparte { .30 set %cnt.two 3 .31 set %key.array 0 .32 while (%cnt.two <= %key.user.len) { .33 set %tmp.two $gettok(%key.ascii,%cnt.two,32) .34 set %tmp.two.second $gettok(%key.ascii,$calc(%cnt.two - 1),32) .35 set %tmp.two $calc($calc(%tmp.two * %tmp.two.second) * %mircData [ $+ [ %key.array ] ] ) .36 set %secondaparte $calc(%secondaparte + %tmp.two) .37 inc %cnt.two .38 inc %key.array .39 } .40 }
Spiegazione alias "secondaparte":
.30\31\32\ Stessa motivazione anche per la seconda parte .33 Prelevo il valore ascii dell'username sempre partendo dal terzo carattere .34 Prelevo il valore ascii dell'username partendo dal SECONDO carattere .35 Ricalcolo il valore %tmp.two moltiplicando il suo valore corrente per %tmp.two.second (Valore numerico in ascii calcolato partendo dal secondo carattere) tra di loro e successivamente per il primo valore di matrice .36 Calcolo la seconda parte del seriale sommando il suo valore corrente per quello della variabile %tmp.two .37 Permetto la continuazione del ciclo iterativo .38 Permetto di leggere il valore successivo della matrice
Spero vivamente di essere stato il più chiaro possibile, alla prossima :)