Keygenner MD5 C*h*e*c*k*s*u*m V*e*r*i*f*i*e*r v6.1

Introduction:


Dans ce tutoriel nous allons voir du keygenning avec du MD5, on a déjà vu ça avec mon tutoriel sur le keygenning de MBAM, Cette application et un peu moins compliquée dans son algorithme


Les outils:



I: Démarrage


La musique habituelle: installez l'application, scanné la avec DiE, ça ne semble pas compressé, super.
Ouvrez l'application et essayons d'entrer dans un faux numéro de série pour voir sont comportement.

1

Et rien!
Pas de MessageBox, aucun changement de texte pour indiquer un mauvais serial, NADA.
D'accord... Chargeons le fichier dans olly.


II: Trouver la procédure d'enregistrement


Nous allons essayer de chercher une chaîne intéressante et voir avec un peu de bon sens si nous pouvons trouver quelque chose digne d'intérêt pour nous.
Dans la fenêtre du désassembleur: clic droit>Search for>All referenced strings

1

Ensuite, on défile et on regarde..
Nous rencontrons près de la fin quelques chaines de textes comme: "Username" "Info" "code"

1

Nous cliquons dessus pour voir à quoi ressemble la procédure courante.
Nous remontons la procédure à son début pour y mettre un point d'arrêt, en espérant que quelque chose se passe.

1


Maintenant, nous exécutons le programme avec F9 et nous allons entrer un serial bidon.
Et là... Le débogueur break après avoir appuyer sur le bouton de vérification, génial! Il n'y a plus qu'à tracer et voir ce qu'il se passe.


III: Comprendre la routine d'enregistrement


Au début, nous rencontrons une vérification pour voir si le nom d'utilisateur n'est pas vide.
S'il y a zéro caractère, alors nous prenons le saut pour quitter le segment.

1


Après cela, notre serial est récupéré, puis hacher en MD5.

Pour mon sérial bidon: 1337 = E48E13207341B6BFFB7FB1622282247B
Le pointeur pour le hash est ensuite transmis à EAX.
Une ligne après, un pointeur (en hard cette fois-ci) contenant un autre hachage est transmis à EDX. "DFF760119804534A899F55D494DF0ECF"
Nous entrons ensuite dans un CALL et après être sorti, nous avons une condition de saut.


1


À l'intérieur du CALL, notre serial hashé dans EAX est comparé à l'autre hachage contenu dans EDX.


1


Notre hash ne correspond pas, nous sommes donc éjectés.
Après avoir quitté l'appel de comparaison, nous prenons le saut conditionnel qui nous envoie à l'offset 004A5311.
Nous arrivons sur un code similaire, nous constatons un autre CALL qui appelle la même procédure de comparaison précédente.
Avec cette fois une petite différence, le serial n'est pas complètement haché: il prend juste les 7 premières lettres de notre serial bidon, hash ça en md5, puis compare le hash avec CAF5C8456865585C73C24EDFB7402802.
Si le résultat n'est pas bon, nous sommes éjectés du segment.


1


Nous avons donc deux choix:
Cracké DFF760119804534A899F55D494DF0ECF, qui semblerais être un «serial maitre» mais qui peut être n'importe quoi.
Cracké CAF5C8456865585C73C24EDFB7402802, qui fait parti de la routine, donc si on veut le keygenner on n’a pas vraiment le choix enfaite.
On sait par contre que c'est un mot de 7 caractères pour CAF5C8456865585C73C24EDFB7402802.
Eh bien, cela est considéré comme "dur", le cassage du hash pourrait prendre du temps, beaucoup de temps.
Vous pouvez toujours essayer de casser le hash si vous avez une plate-forme dédiée pour calculer des choses, personnellement j'utilise Hashcat qui peut faire du multithread sur mes GPU.


1


Habituellement, lorsque les crackers font face à ce genre de problème avec la crypto, nous remplaçons simplement les valeurs inconnues avec nos propres valeurs. (keygen+patch du coup)
Mais dans le cas présent, je n'aurais pas eu à utiliser mon rig, ni a faire cela.
J'ai cherché dans Google des exemples de serial pour des versions précédentes, et j'ai remarqué que la première partie du serial commençait toujours par "LdfMCV-"
Qui fait exactement 7 caractères avec le tiret, et le résultat du hachage MD5 pour ce mot est... Oui: CAF5C8456865585C73C24EDFB7402802
Parfait!
Nous pouvons maintenant aller de l'avant, reprendre l'exécution avec F9 et entrer un nouveau numéro de série bidon, mais cette fois avec les 7 premières bonnes lettres: LdfMCV-123456789
Ensuite, nous nous retrouvons ou nous étions, la comparaison est faite, nous prenons le saut conditionnel qui nous a fait éviter de quitter le segment, c'est bien!.


1


Nous continuons à tracer avec F8 et nous voyons que le code prend notre nom et le hache en MD5 à l'intérieur de l'appel 004A2BF0
Ensuite, il prend notre numéro de série bidon, et nous passons sur les instructions MOV ECX, 2 et MOV EDX, 8 Ceux ci seront ensuite utilisé pour l'appel ci-dessous.
L'appel prendra 2 caractères et commencera à saisir à la position 8 (juste après la partie du serial en hard) une fois terminée, le pointeur est écrit dans la pile.

Ensuite, le pointeur sur notre nom haché réapparaît (dans mon cas: Xylitol = 9F01C4DEFB31F597423AC2E0CAB0FA54)
Ensuite, le hachage est tronqué: vous pouvez voir MOV ECX, 2 et MOV EDX, 0D cette fois-ci.
Nous avons maintenant: F597423AC2E0CAB0FA54, et les 2 premiers caractères du hach "F5" sont saisis.
Une ligne après, nous avons POP EAX, qui restaure le pointeur sur "12", qui est mes deux premiers caractères de mon serial bidon qui ont été attrapés plus tôt.
Et nous nous retrouvons à nouveau dans un CALL de comparaison, la même procédure qu’avant.


1


"12" de mon serial bidon est comparé à "F5"


1


Ce n'est pas bon, alors après avoir quitté l'appel de comparaison, il quitte le segment.
Je sais maintenant que mon serial commence par "LdfMCV-F5"
Il n'y a plus qu'à reprendre l'exécution avec F9 et remettre à jour notre serial bidon avec les nouveaux éléments que l'on a appris.
Pour moi, ce sera quelque chose comme: LdfMCV-F5AAAAAAAAA
Nous passons correctement le saut et nous sommes maintenant proches de la fin, et comme vous pouvez le constater, le code est un peu similaire à ce que nous venons de voir avant.


1


Le hash de mon nom est pris et puis tronqué pour obtenir les 11 premiers caractères à partir de la position 16, le résultat est: 423AC2E0CAB
Après, nous rencontrons à nouveau la procédure d'appel de hachage MD5 qui va hashé en MD5: "423AC2E0CAB"


1


Le résultat est: FF514146D567BF8C0988AF0118E612AE
Le sérial bidon est ensuite tronqué pour obtenir les 3 premiers caractères à partir de la position 10 (après "LdfMCV-F5") et pousse le résultat dans la pile.


1


Une fois cela fait, il prend le nouveau hachage obtenu: FF514146D567BF8C0988AF0118E612AE
Et le tronque à nouveau pour obtenir 3 caractères à partir de la position 20 du hache, le résultat est "8AF"


1


"AAA" de mon serial bidon est alors comparé à "8AF"


1


Si ce n'est pas bon, nous quittons le segment, si c'est bon, nous sommes enfin enregistrés.
Donc, pour Xylitol, mon numéro de série valide est: LdfMCV-F58AF


1


Nous avons atteint la fin de l'algo, nous pouvons maintenant écrire un keygen.



IV: Faire un keygen



Tout ce que nous avons à faire est de construire des hashs MD5 et de faire un peu de troncatures.
Pour cela je vais utiliser le même "md5.asm" que j'avais utilisé pour mon keygen mbam, ce fichier s'utilise comme la cryptolib de drizz.
Cela évite juste d'importé toute la lib pour juste une fonction de md5.

kg.asm:

.486
.model flat, stdcall
option casemap :none ; case sensitive

include		\masm32\include\windows.inc
include		\masm32\include\kernel32.inc
include		\masm32\include\user32.inc
include		\masm32\macros\macros.asm

includelib	\masm32\lib\kernel32.lib
includelib	\masm32\lib\user32.lib

include md5.asm

comment /*
kg for MD5 Checksum Verifier v6.1
MD5ChecksumVerifier.exe - 98ee714c93300c70b54c71c6d32be29e
By Xyl, as usual
/

DlgProc     PROTO :DWORD,:DWORD,:DWORD,:DWORD

.const
IDC_NAME        equ 1001
IDC_SERIAL      equ 1002
IDB_QUIT        equ 1003
IDC_GROUPBOX    equ 1004
IDC_DATE_STATIC equ 1005
MAXSiZE         equ 256

.data
; Keygen details
szNameMD5       dd MAXSiZE dup (0)
szSerialTempMD5 dd MAXSiZE dup (0)
szHardPart      db "LdfMCV-",0

; Dialog details
szTitle         db "MD5 checksum verifier v6.1 *keygen*",0
szGroupBox      db "nAME ^ sERIAL",0
szIDBExit       db "eXiT",0
szEnterName     db "Enter a name buddy!",0
szTooLong       db "Name is too long",0
szDateStatic    db "20/06/2021",0

.data?
hInstance       dd ? ;dd can be written as dword
szBufName       db 265 dup (?)
szName_len      dd ?
szSerial_len    dd ?
szSerialTemp1   db 100h dup(?)
szSerialTemp2   db 100h dup(?)
szSerial        db 100h dup(?)

.code
start:
    invoke GetModuleHandle,NULL
    mov hInstance,eax
    invoke DialogBoxParam,hInstance,101,0,ADDR DlgProc,0
    invoke ExitProcess,eax

HexToChar Proc    HexValue    :DWORD,
                  CharValue   :DWORD,
                  HexLength   :DWORD
    mov esi,[ebp+8]
    mov edi,[ebp+0Ch]
    mov ecx,[ebp+10h]
    @HexToChar:
      lodsb
      mov ah, al
      and ah, 0fh
      shr al, 4
      add al, '0'
      add ah, '0'
       .if al > '9'
          add al, 'A'-'9'-1
       .endif
       .if ah > '9'
          add ah, 'A'-'9'-1
       .endif
      stosw
    loopd @HexToChar
    Ret
HexToChar endp

DlgProc proc    hWin    :DWORD,
                uMsg    :DWORD,
                wParam  :DWORD,
                lParam  :DWORD

    .if uMsg == WM_INITDIALOG
    ; Set the dialog controls texts. Done here in the code instead of resource
    ; file to reduce the required bytes (strings in the rc file are UNICODE not ANSI)
    invoke SetWindowText,hWin,ADDR szTitle ; Set the window title text
    invoke SetDlgItemText,hWin,IDC_GROUPBOX,ADDR szGroupBox
    invoke SetDlgItemText,hWin,IDB_QUIT,ADDR szIDBExit
    invoke SetDlgItemText,hWin,IDC_DATE_STATIC,ADDR szDateStatic
    .elseif uMsg == WM_COMMAND
	    mov eax,wParam
        mov edx,eax
        shr edx,16
        and eax,0FFFFh
          .if edx == EN_CHANGE
              .if eax == IDC_NAME
                  invoke GetDlgItemText,hWin,IDC_NAME,Addr szBufName,MAXSiZE
                      .if eax == 0
                           invoke SetDlgItemText,hWin,IDC_SERIAL,addr szEnterName
                      .elseif eax > 60
                           invoke SetDlgItemText,hWin,IDC_SERIAL,addr szTooLong
                      .elseif
                           invoke lstrlen,addr szBufName
                           mov szName_len,eax
                           ;Compute the MD5 hash for the entered name
                           invoke MD5Init
                           invoke MD5Update,addr szBufName,szName_len
                           invoke MD5Final
                           ;hex to chars the MD5
                           invoke HexToChar,addr MD5Digest,addr szNameMD5,16
                           ;Get 2 chars from the MD5 starting at position 12 
                           invoke lstrcpyn,addr szSerialTemp1,addr szNameMD5+12,3
                           ;Add the hard part to the serial + the 2 chars grabbed.
                           invoke lstrcat,addr szSerial,addr szHardPart
                           invoke lstrcat,addr szSerial,addr szSerialTemp1
                           ;Get 11 chars from the MD5 starting at position 16
                           invoke lstrcpyn,addr szSerialTemp2,addr szNameMD5+16,12
                           invoke lstrlen,addr szSerialTemp2
                           mov szSerial_len,eax
                           ;Compute the MD5 hash for the 11 chars grabbed 
                           invoke MD5Init
                           invoke MD5Update,addr szSerialTemp2,szSerial_len
                           invoke MD5Final
                           invoke HexToChar,addr MD5Digest,addr szSerialTempMD5,16
                           ;Take 3 chars from the md5 starting at position 19
                           invoke lstrcpyn,addr szSerialTemp2,addr szSerialTempMD5+19,4
                           ;Build the final serial
                           invoke lstrcat,addr szSerial,addr szSerialTemp2
                           invoke SetDlgItemText,hWin,IDC_SERIAL,addr szSerial
                           call clean
                      .endif
              .endif
          .endif
        .if wParam == IDB_QUIT
            invoke EndDialog,hWin,0
        .endif
    .elseif	uMsg == WM_CLOSE
        invoke EndDialog,hWin,0
    .endif
    xor eax,eax
    ret
DlgProc	endp

clean proc
    invoke RtlZeroMemory,addr szBufName,sizeof szBufName
    invoke RtlZeroMemory,addr szNameMD5,sizeof szNameMD5
    invoke RtlZeroMemory,addr szSerialTempMD5,sizeof szSerialTempMD5
    invoke RtlZeroMemory,addr szSerialTemp1,sizeof szSerialTemp1
    invoke RtlZeroMemory,addr szSerialTemp2,sizeof szSerialTemp2
    invoke RtlZeroMemory,addr szSerial,sizeof szSerial
    ret
clean endp

end start

md5.asm:

.data?
MD5HashBuf db 64 dup(?)
MD5Digest dd 4 dup(?)
MD5Len dd ?
MD5Index dd ? 
  
.code
MD5FF macro dwA, dwB, dwC, dwD, locX, rolS, constAC
	mov	edi,dwC
	xor	edi,dwD
	and	edi,dwB
	xor	edi,dwD
	add	dwA,[locX]
	lea	dwA,[edi+dwA+constAC]
	rol	dwA,rolS
	add	dwA,dwB
endm

MD5GG macro dwA, dwB, dwC, dwD, locX, rolS, constAC
	mov	edi,dwC
	xor	edi,dwB
	and	edi,dwD
	xor	edi,dwC
	add dwA,[locX]
	lea	dwA,[edi+dwA+constAC]
	rol	dwA,rolS
	add	dwA,dwB
endm

MD5HH macro dwA, dwB, dwC, dwD, locX, rolS, constAC
	mov	edi,dwC
	xor	edi,dwD
	xor	edi,dwB
	add dwA,[locX]
	lea	dwA,[dwA+edi+constAC]
	rol	dwA,rolS
	add	dwA,dwB
endm

MD5II macro dwA, dwB, dwC, dwD, locX, rolS, constAC
	mov edi,dwD
	xor edi,-1
	or edi,dwB
	xor edi,dwC
	add dwA,[locX]
	lea dwA,[edi+dwA+constAC]
	rol dwA,rolS
	add dwA,dwB
endm

align dword
MD5Transform proc
	pushad
	mov esi,offset MD5Digest
	mov edi,offset MD5HashBuf	
	mov eax,[esi+0*4]
	mov ebx,[esi+1*4]
	mov ecx,[esi+2*4]
	mov ebp,edi
	mov edx,[esi+3*4]
	;==============================================================
	MD5FF eax, ebx, ecx, edx, dword ptr [ebp+ 0*4],  7, 0D76AA478H
	MD5FF edx, eax, ebx, ecx, dword ptr [ebp+ 1*4], 12, 0E8C7B756H
	MD5FF ecx, edx, eax, ebx, dword ptr [ebp+ 2*4], 17, 0242070DBH
	MD5FF ebx, ecx, edx, eax, dword ptr [ebp+ 3*4], 22, 0C1BDCEEEH
	MD5FF eax, ebx, ecx, edx, dword ptr [ebp+ 4*4],  7, 0F57C0FAFH
	MD5FF edx, eax, ebx, ecx, dword ptr [ebp+ 5*4], 12, 04787C62AH
	MD5FF ecx, edx, eax, ebx, dword ptr [ebp+ 6*4], 17, 0A8304613H
	MD5FF ebx, ecx, edx, eax, dword ptr [ebp+ 7*4], 22, 0FD469501H
	MD5FF eax, ebx, ecx, edx, dword ptr [ebp+ 8*4],  7, 0698098D8H
	MD5FF edx, eax, ebx, ecx, dword ptr [ebp+ 9*4], 12, 08B44F7AFH
	MD5FF ecx, edx, eax, ebx, dword ptr [ebp+10*4], 17, 0FFFF5BB1H
	MD5FF ebx, ecx, edx, eax, dword ptr [ebp+11*4], 22, 0895CD7BEH
	MD5FF eax, ebx, ecx, edx, dword ptr [ebp+12*4],  7, 06B901122H
	MD5FF edx, eax, ebx, ecx, dword ptr [ebp+13*4], 12, 0FD987193H
	MD5FF ecx, edx, eax, ebx, dword ptr [ebp+14*4], 17, 0A679438EH
	MD5FF ebx, ecx, edx, eax, dword ptr [ebp+15*4], 22, 049B40821H
	;==============================================================
	MD5GG eax, ebx, ecx, edx, dword ptr [ebp+ 1*4],  5, 0F61E2562H
	MD5GG edx, eax, ebx, ecx, dword ptr [ebp+ 6*4],  9, 0C040B340H
	MD5GG ecx, edx, eax, ebx, dword ptr [ebp+11*4], 14, 0265E5A51H
	MD5GG ebx, ecx, edx, eax, dword ptr [ebp+ 0*4], 20, 0E9B6C7AAH
	MD5GG eax, ebx, ecx, edx, dword ptr [ebp+ 5*4],  5, 0D62F105DH
	MD5GG edx, eax, ebx, ecx, dword ptr [ebp+10*4],  9, 002441453H
	MD5GG ecx, edx, eax, ebx, dword ptr [ebp+15*4], 14, 0D8A1E681H
	MD5GG ebx, ecx, edx, eax, dword ptr [ebp+ 4*4], 20, 0E7D3FBC8H
	MD5GG eax, ebx, ecx, edx, dword ptr [ebp+ 9*4],  5, 021E1CDE6H
	MD5GG edx, eax, ebx, ecx, dword ptr [ebp+14*4],  9, 0C33707D6H
	MD5GG ecx, edx, eax, ebx, dword ptr [ebp+ 3*4], 14, 0F4D50D87H
	MD5GG ebx, ecx, edx, eax, dword ptr [ebp+ 8*4], 20, 0455A14EDH
	MD5GG eax, ebx, ecx, edx, dword ptr [ebp+13*4],  5, 0A9E3E905H
	MD5GG edx, eax, ebx, ecx, dword ptr [ebp+ 2*4],  9, 0FCEFA3F8H
	MD5GG ecx, edx, eax, ebx, dword ptr [ebp+ 7*4], 14, 0676F02D9H
	MD5GG ebx, ecx, edx, eax, dword ptr [ebp+12*4], 20, 08D2A4C8AH
	;==============================================================
	MD5HH eax, ebx, ecx, edx, dword ptr [ebp+ 5*4],  4, 0FFFA3942H
	MD5HH edx, eax, ebx, ecx, dword ptr [ebp+ 8*4], 11, 08771F681H
	MD5HH ecx, edx, eax, ebx, dword ptr [ebp+11*4], 16, 06D9D6122H
	MD5HH ebx, ecx, edx, eax, dword ptr [ebp+14*4], 23, 0FDE5380CH
	MD5HH eax, ebx, ecx, edx, dword ptr [ebp+ 1*4],  4, 0A4BEEA44H
	MD5HH edx, eax, ebx, ecx, dword ptr [ebp+ 4*4], 11, 04BDECFA9H
	MD5HH ecx, edx, eax, ebx, dword ptr [ebp+ 7*4], 16, 0F6BB4B60H
	MD5HH ebx, ecx, edx, eax, dword ptr [ebp+10*4], 23, 0BEBFBC70H
	MD5HH eax, ebx, ecx, edx, dword ptr [ebp+13*4],  4, 0289B7EC6H
	MD5HH edx, eax, ebx, ecx, dword ptr [ebp+ 0*4], 11, 0EAA127FAH
	MD5HH ecx, edx, eax, ebx, dword ptr [ebp+ 3*4], 16, 0D4EF3085H
	MD5HH ebx, ecx, edx, eax, dword ptr [ebp+ 6*4], 23, 004881D05H
	MD5HH eax, ebx, ecx, edx, dword ptr [ebp+ 9*4],  4, 0D9D4D039H
	MD5HH edx, eax, ebx, ecx, dword ptr [ebp+12*4], 11, 0E6DB99E5H
	MD5HH ecx, edx, eax, ebx, dword ptr [ebp+15*4], 16, 01FA27CF8H
	MD5HH ebx, ecx, edx, eax, dword ptr [ebp+ 2*4], 23, 0C4AC5665H
	;==============================================================
	MD5II eax, ebx, ecx, edx, dword ptr [ebp+ 0*4],  6, 0F4292244H
	MD5II edx, eax, ebx, ecx, dword ptr [ebp+ 7*4], 10, 0432AFF97H
	MD5II ecx, edx, eax, ebx, dword ptr [ebp+14*4], 15, 0AB9423A7H
	MD5II ebx, ecx, edx, eax, dword ptr [ebp+ 5*4], 21, 0FC93A039H
	MD5II eax, ebx, ecx, edx, dword ptr [ebp+12*4],  6, 0655B59C3H
	MD5II edx, eax, ebx, ecx, dword ptr [ebp+ 3*4], 10, 08F0CCC92H
	MD5II ecx, edx, eax, ebx, dword ptr [ebp+10*4], 15, 0FFEFF47DH
	MD5II ebx, ecx, edx, eax, dword ptr [ebp+ 1*4], 21, 085845DD1H
	MD5II eax, ebx, ecx, edx, dword ptr [ebp+ 8*4],  6, 06FA87E4FH
	MD5II edx, eax, ebx, ecx, dword ptr [ebp+15*4], 10, 0FE2CE6E0H
	MD5II ecx, edx, eax, ebx, dword ptr [ebp+ 6*4], 15, 0A3014314H
	MD5II ebx, ecx, edx, eax, dword ptr [ebp+13*4], 21, 04E0811A1H
	MD5II eax, ebx, ecx, edx, dword ptr [ebp+ 4*4],  6, 0F7537E82H
	MD5II edx, eax, ebx, ecx, dword ptr [ebp+11*4], 10, 0BD3AF235H
	MD5II ecx, edx, eax, ebx, dword ptr [ebp+ 2*4], 15, 02AD7D2BBH
	MD5II ebx, ecx, edx, eax, dword ptr [ebp+ 9*4], 21, 0EB86D391H
	;==============================================================
	add [esi+0*4],eax	; update digest
	add [esi+1*4],ebx
	add [esi+2*4],ecx
	add [esi+3*4],edx
	popad
	retn
MD5Transform endp

MD5BURN macro
	xor eax,eax
	mov MD5Index,eax
	mov edi,Offset MD5HashBuf
	mov ecx,(sizeof MD5HashBuf)/4
	rep stosd
endm

align dword
MD5Init proc uses edi
	xor eax, eax
	mov MD5Len,eax
	MD5BURN
	mov eax,offset MD5Digest
	mov dword ptr [eax+0*4],067452301h
	mov dword ptr [eax+1*4],0EFCDAB89h
	mov dword ptr [eax+2*4],098BADCFEh
	mov dword ptr [eax+3*4],010325476h
	ret
MD5Init endp

align dword
MD5Update proc uses esi edi ebx lpBuffer:dword, dwBufLen:dword
	mov ebx,dwBufLen
	mov esi,lpBuffer
	add MD5Len,ebx
	.while ebx
		mov eax,MD5Index
		mov ecx,64
		sub ecx,eax
		lea edi,[MD5HashBuf+eax]	
		.if ecx <= ebx
			sub ebx,ecx
			rep movsb
			call MD5Transform
			MD5BURN
		.else
			mov ecx,ebx
			rep movsb
			add MD5Index,ebx
			.break
		.endif
	.endw
	ret
MD5Update endp

align dword
MD5Final proc uses esi edi
	mov ecx, MD5Index
	mov byte ptr [MD5HashBuf+ecx],80h
	.if ecx >= 56
		call MD5Transform
		MD5BURN
	.endif
	mov eax,MD5Len
	xor edx,edx
	shld edx,eax,3
	shl eax,3
	mov dword ptr [MD5HashBuf+56],eax
	mov dword ptr [MD5HashBuf+60],edx
	call MD5Transform
	mov eax,offset MD5Digest	
	ret
MD5Final endp

base.rc:

;This Resource Script was generated by WinAsm Studio.

#define IDC_NAME 1001
#define IDC_SERIAL 1002
#define IDB_QUIT 1003
#define IDC_GROUPBOX 1004
#define IDC_DATE_STATIC 1005

101 DIALOGEX 0,0,151,68
CAPTION "Base"
FONT 8,"Tahoma"
STYLE 0x80c80880
EXSTYLE 0x00000000
BEGIN
	CONTROL "",IDC_GROUPBOX,"Button",0x50008007,3,3,144,47,0x00000000
	CONTROL "",IDB_QUIT,"Button",0x10000000,97,52,50,14,0x00000000
	CONTROL "",IDC_NAME,"Edit",0x10000080,10,12,131,12,0x00000200
	CONTROL "",IDC_SERIAL,"Edit",0x10000080,10,31,131,12,0x00000200
	CONTROL "",IDC_DATE_STATIC,"Static",0x58000000,3,58,44,9,0x00000000
END

make.bat:

@echo off
\masm32\bin\rc /v base.rc
\masm32\bin\ml.exe /c /coff /Cp /nologo kg.asm
\masm32\bin\link.exe /SUBSYSTEM:WINDOWS /RELEASE /VERSION:4.0 /OUT:Keygen.exe kg.obj base.res
del base.res
del base.obj
del kg.obj
pause

Une fois compilé, ça ressemble à ça:

1



V: Conclusion


Nous avons vu ici un peu de crypto, également rencontré un problème avec la partie en hard déjà hachée.
Le serial maitre "DFF760119804534A899F55D494DF0ECF" est toujours un inconnu pour nous, mais heureusement, nous avons récupéré l'équivalent en texte de CAF5C8456865585C73C24EDFB7402802, ce qui nous a permis de coder un keygen.
C'était une autre application facile, bien pour se familiariser avec la crypto et comment faire un peu de manipulation de chaîne.

Nous aurions également pu ajouter quelques nombres aléatoires à notre keygen comme anti-ripping/watermark, car le reste du numéro de série n'est pas vérifié après la position 12.
Cela nous permettrait de reconnaître une release plagiarisée si une personne décide de "ressource-hack" le keygen ou de posté en ligne des numéros de série générer a parti de notre Keygen.
Une pratique assez courante sur la scène pour trouver les lamers.


1



Xylitol, 20/06/2021




Copyright (C)- xtx Team (2021)

XHTML valide 1.1 CSS Valide !