------------> Furb3T <-----------
presenta:
Capire un generatore di seriale: II parte.
Salve giovani amanti dell'assembler, oggi andremo avanti con la lezione sui generatori di chiave e analizzeremo il codice di un programma che usiamo tutti o quasi: il MIRC 5.31. Utilizzeremo come al solito SOFTICE. Lanciamo Mirc, andiamo sotto HELP|REGISTER ed inseriamo il nome e il codice numerico. Ctrl-D e fissiamo un bel BPX MESSAGEBOXA, F5 per ritornare su Mirc, diamo l'OK e...BOOM eccoci su Softice, premiamo F12 e ci ritroviamo su Mirc che ci fa comparire la finestra di messaggio che ci dice che abbiamo sbagliato codice (...ancora per poco), premiamo OK e rieccoci dentro Softice, ed esattamente qui:
:00437E9C push 00000010Bene ora non vi resta che fare un pò di scroll up ovvero far scorrere verso l'alto per vedere quale è la parte di codice che chiama la MessageBox; scorrete scorrete ed arriverete qui:
:00437DE7 push 004C07CC -----------> fate d 4C07CC leggerete il codice che avete scrittoAvrete capito che bisognerà andare a spulciare nella CALL che sta all'indirizzo 00437DF1; facciamo un bel Trace della call:
:004822D0 push ebpNon siamo ancora arrivati al pezzo di codice che ci serve per capire come viene generato il vero codice; dobbiamo fare il Trace della CALL che sta a 004822EE, quindi:
.....................
:004821FC push 0000002D -------->
2D non è altro che il "-" (trattino), ciò vuol dire che il codice vero
:004821FE push esi
da inserire deve contenere il trattino e che quindi sarà composto
:004821FF call 004A400C
da 2 parti. Questa Call verifica l'esistenza del trattino e ritorna 0 in
:00482204 add esp, 00000008 EAX se non c'è.
:00482207 mov ebx, eax
:00482209 test ebx, ebx
:0048220B jne 00482214
....................
....................
Ok, mi sembra abbastanza facile da capire come viene generata la prima parte del codice, l'unica cosa che vi risulterà difficile da capire è cosa avviene nel prodotto tra ESI e [.....]. Allora che vuol dire 4*eax+004BBB44? Ve lo spiego subito. Se scrivete d 004BBB44, vedrete nella finestra una cosa tipo questa:
0B 00 00 00 06 00 00 00 11 00 00 00 0C
0C 00 00 00 0E 00 00 00 05 00 00 00 0C
....................................................
Sapendo che Eax parte da 0, allora nel primo loop il ESI verrà moltiplicato per B, nel secondo loop Esi verrà moltiplicato per 6, nel terzo per 11, nel quarto per C e così via...Capito?!?!? Facile vero!!! Bene ora analizziamo l'altra parte di codice come viene costruita:
...........................
:0048228D add ecx, 00000003 ---------> ancora una volta il nome viene
preso dalla 3 lettera
:00482290 cmp edx, dword ptr [ebp-0C]
:00482293 jge 004822B8
:00482295 movzx esi, byte ptr [ecx] ----> muove in ESI i caratteri ASCii Esadec. del nome dal 3 in poi
:00482298 movzx edi, byte ptr [ecx-01] ---> muove in EDI i caratteri Ascii Esa del nome dal 2 in poi
:0048229C imul esi, edi --------> moltiplica ESI per EDI e il mette il risultato in
ESI
:0048229F imul esi, dword ptr [4*eax+004BBB44] -----> moltiplica ESI per il fattore tra
le [.....]
:004822A7 add ebx, esi
--------> somma ESI a EBX e mette il
risultato in EBX
:004822A9 inc eax
:004822AA cmp eax, 00000026
:004822AD jle 004822B1
:004822AF xor eax, eax
:004822B1 inc edx
-----------> incrementa EDX
:004822B2 inc ecx
----------> incrementa ECX
:004822B3 cmp edx, dword ptr [ebp-0C] ----> ripete il loop se EDX è minore della lunghezza del nome
:004822B6 jl 00482295
Insomma, anche questa seconda parte del codice ora è svelata. Quando creerete il vostro bel programmino di keygen, ricordatevi bene tutti i percorsi dell'algoritmo di calcolo, nonchè del trattino..... inoltre ricordatevi di citarmi nel programma!!!!!
Purtroppo io programmo in VB quindi non vi scriverò il programma keygen, questo toccherà a voi implementarlo con il linguaggio che sapete usare di più. A presto miei fidi!!!!
Ringraziamenti: a tutto il gruppo RingZer0 per il supporto Tecnico e Morale, ed a Insanity perchè pubblica i miei tutorial.