Date de publication : vendredi 30 juin 2006
Auteur : BeatriX
Voici venu le temps des rires et des chants... nous allons donc nous pencher sur la réalisation d'un keygen avec masm32.
Notre demi-keygen va être le plus simple de tous les keygens de la TERRRREEEE.... voyez plutôt :
Voilà, c'est tout. Un gros bouton va faire l'affaire et tout le travail. Je m'explique. Voici les étapes que notre demi-keygen va accomplir :
Pour bruteforcer le SERIAL, j'ai rippé les routines "utiles" qui calculent les nombres S1, S2 et S3. J'ai opté pour le bruteforce car l'algorithme travaille sur chaque caractère séparément et ne résiste donc absolument pas à une attaque exhaustive. Ceci signifie que le bruteforce se fait en une fraction de seconde. Il est donc bien inutile de vouloir reverser les algorithmes de calcul. Voici une partie du code utile pour calculer S1 :
On voit le code sur fond gris complètement noyé dans du junkcode !
Voici le bruteforce qui calcule la première partie du SERIAL à partir de S1 (vous reconnaitrez la portion utile ci-dessus) :
; ====================================== Partie 1 du serial mov lpNumberOfBytesWritten, 0 push lpNumberOfBytesWritten push 15 push offset CHAINE1 push 4109D0h push hProcess call ReadProcessMemory mov esi, offset CHAINE1 mov edi, offset NUM1 mov compteur, 0 Partie1: .if byte ptr [esi]!=0 mov byte ptr [edi], 41h mov eax,compteur mov compteur,eax mov eax,55555556h imul compteur mov ecx,edx mov eax, compteur sar eax,1Fh sub ecx,eax mov eax,ecx add eax,eax add eax,ecx mov edx, compteur sub edx,eax mov eax,edx .if eax==0 @@: movzx eax, byte ptr [edi] sub al, 41h not al and al, 0Fh add al, 30h cmp al, byte ptr [esi] je @F inc byte ptr [edi] jmp @B @@: inc edi inc esi inc compteur jmp Partie1 .else movzx eax, byte ptr [esi] mov byte ptr [edi], al inc edi inc esi inc compteur jmp Partie1 .endif .endif
Ce gros calcul peut se réduire en C++ comme ceci ( merci à Skirby pour la source ) :
for (i = 0; i < Mylstrlen(pSerial[0]); i++) { if (i % 3 == 0) { pSerial[0][i] = (pSerial[0][i] - 'A') + '0'; pSerial[0][i] = (0x0F & ~(pSerial[0][i] - '0')) + '0'; }
Il s'agit donc d'opérations arithmétiques effectuées sur le SERIAL. Nous n'avons pas vraiment besoin de comprendre le fonctionnement de tels routines pour pouvoir coder le keygen. Je ne vais pas détailler chacune des routines et je vous fournis donc le keygen ICI.
Copyright (C)- FRET (2006)