Reverse engineering : realizzare un keygen

sss

Scopriamo l’algoritmo utilizzato per generare il seriale di un programma e per ultimo creiamo un keygen

Per creare un keygen, dobbiamo trovare e calcolare l’algoritmo che genera il seriale in base al nome che noi andiamo ad inserire all’interno del campo Name nel programma.

Il programma che andiamo ad analizzare e i tools che ci servirano sono reperibili a questo link:Reverse engineering – Come creare una patch per un programma

Andando a disassemblare il programma troviamo due funzioni che si occupano di generare il seriale in base al nome che noi andiamo ad inserire, in particolare queste due funzioni, sono due call:

Steppiamo all’interno della prima funzione con F7 e troviamo questo:

Questa funzione, da come si può vedere, si occupa di trasformare tutte le lettere del nostro Name da minuscolo a maiuscolo e una volta trasformate in maiuscolo fa la somma in esadecimale di tutte le lettere inserite e le mette in EDI, infine una volta terminato fa uno xor con 5678:
004013A2 |. 81F7 78560000 XOR EDI,5678

Per finire salva tutto il contenuto di EDI in EAX.

Continuando a steppare ritorniamo nel immagine di prima delle due funzioni, bene ora dobbiamo entrare nella seconda funzione del seriale e vedere cosa c’è:

In pratica quello che fa questa funzione è:
-Mettere ogni singolo numero del seriale in BL e sottrarlo a 30h
-EDI = EDI * EAX
-EDI = EDI + EBX
-ESI = ESI + 1

E infine EDI viene xorato con 1234 e il contenuto di EDI viene salvato in EBX.

Continuando a steppare si arriva qui:
00401241 . 3BC3 CMP EAX,EBX

Significa che se EAX e EBX sono uguali il seriale è corretto.
Tradotto in linguaggio C:
if (EAX == EBX) printf(“Seriale corretto”);
else printf(“Seriale errato”);

Bene ora vediamo come creare il keygen, in sostanza il software fà questo:
Name XOR 5678h = Serial XOR 1234h

per trovarci il seriale:
Serial = Name XOR 5678h XOR 1234h questo per le proprietà dello XOR

Per chi non sa cosa sia lo XOR ecco una piccola spiegazione:
Lo XOR è un operatore logico detto anche OR esclusivo che restituisce 1 se e solo se la somma degli operandi uguali ad 1 è dispari, mentre restituisce 0 in tutti gli altri casi.

Questa è la tabella della verità dell’operatore XOR:
0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0

Una piccola curiosità per lo XOR: questo operatore è molto usato negli algoritmi crittografici.

Ora che abbiamo capito come ricavare il seriale dobbiamo crearci il Keygen per generare il Serial, io l’ho sviluppato in linguaggio C, si può sviluppare nel linguaggio che piace di più:

#include‹stdio.h›
#include‹ctype.h›
#define MAX 11
#define A 22136 //5678h
#define B 4660 //1234h

int main(void)
{
   char nome[MAX];
   int i = 0;
   int leng = 0;
   int sum = 0;

   printf(“Name: “);
   gets(nome);

   leng = strlen(nome); //Calcolo la lunghezza
   if (leng < MAX)
   {
      for(i = 0; i < leng; i++)
      {
         nome[i] = toupper(nome[i]); //Trasformo in maiuscolo
         sum = sum + nome[i]; //Sommo le lettere
      }

      sum = sum ^ A ^ B;
      printf("Serial = %d\n",sum);
   }

   else printf("Errore - Lunghezza Name eccessivo!\n");

   system("PAUSE");
   return(0);
}

Come avete notato ho dichiarato una costante MAX di valore 11, il motivo è semplice, la TextBox accetta solo 11 caratteri e non di più, se avete fatto attenzione prima mentre che steppavate il programma, quando abbiamo incontrato l’API GetDlgItemText c’era un 11, quel numerino indica proprio il numero di caratteri massimi che si possono inserire in quel campo, stessa cosa per il campo Serial.

Se noi ora proviamo a compilare ed eseguire in nostro keygen ed inseriamo come Name: qwer
Otteniamo Serial = 17779
proviamo ad inserirlo nel software e vedremo che funziona.

25 Comments

  1. afflati_del_vespero 11 aprile 2013
  2. Cristian.Minasola 24 maggio 2014
  3. fra83 1 ottobre 2011
  4. Emanuele 1 ottobre 2011
  5. Fabrizio87 1 ottobre 2011
  6. divivoma 2 ottobre 2011
  7. Piero Boccadoro 2 ottobre 2011
  8. divivoma 3 ottobre 2011
  9. Fabrizio87 3 ottobre 2011
  10. Fabrizio87 3 ottobre 2011
  11. divivoma 3 ottobre 2011
  12. Kino 3 ottobre 2011
  13. Kino 3 ottobre 2011
  14. Fabrizio87 3 ottobre 2011
  15. divivoma 3 ottobre 2011
  16. Fabrizio87 3 ottobre 2011
  17. Kino 3 ottobre 2011
  18. Fabrizio87 3 ottobre 2011
  19. Kino 3 ottobre 2011
  20. Fabrizio87 4 ottobre 2011
  21. stefano88 5 ottobre 2011
  22. Fabrizio87 5 ottobre 2011
  23. divivoma 5 ottobre 2011
  24. stefano88 5 ottobre 2011
  25. Emanuele 5 ottobre 2011

Leave a Reply