Keygenner V*M*D*K R*e*c*o*v*e*r*y v4.0

Introduction:


Dans ce tutoriel on parlera brievement de sécu et on va refaire un multikeygen.


Les outils


Pour appliquer ce tutoriel il vous faudra...




I: Démarrage:


Pour commencer, un petit point rapide sur la situation avec ce soft.
Il est distribué au public uniquement en version de démonstration, si vous avez lu mon précédent tutoriel sur les cripplewares (GTPSim) vous savez donc que c'est relativement 'chiant' de manipuler ce genre d'exécutable.
Donc il nous faudrait trouver la version complète, c'est mieux.
On va donc acheter une licence.


1


Voilà!
Ce cours est maintenant terminé, merci au revoir et à un prochain tutoriel!


Bon ok...

Vous pouvez toujours acheter une licence, c'est bien pour le développeur.
Dans mon cas je n'ai pas eu besoin dans acheter une, la page que vous voyer sur le screenshot a été indexée par les moteurs de recherche, je l'ai trouvé simplement comme ça.


1


Je suppose que c'est une page générique ou après le paiement du produit, vous devez être redirigé sur la page de remerciement du produit en question pour pouvoir télécharger la version complète.
Un petit problème, l'indexation n'est pas restreinte si on veut aller sur l'index du répertoire.


1



Le plus gênant arrive si on décide de rejoindre le répertorie parent.
Là aussi nous n'avons pas de page d'index et l'affichage du contenu du répertoire est activé.
Nous connaissons donc désormais tous les chemins pour télécharger les versions complètes de toute leur gamme de produits.
Il n'y a plus qu'à visiter les dossiers pour trouver l'application qui nous intéresse (vmdk).


1


Bon voilà.. C'était juste histoire de parler vite fait sécurité.
En soit on n’a rien fait de mal mais méfiez vous, on se souvient de l'affaire Bluetouff: condamné en appel pour avoir su utiliser Google.

Maintenant qu'on a trouvé un moyen d'obtenir la version full, on n'a plus qu'à l'installer et à l'exécuter..


1


À l'ouverture le programme nous demande un sérial, on rentre n'importe quoi comme d'habitude puis on click sur Activate.


1


Enter valid software authentication code

Pas moyen de démarrer l'application sans l'avoir préalablement activer.
Bon OK on en a assez vu...
On scanne l'exécutable avec Detect It Easy, pour voir si c'est pack.


1


Impec, y'a rien.



II: Trouver la routine d'enregistrement


Chargez l'application dans le débogueur.
On va regarder en premier les strings pour se faire une idée de ce fichier:
Clic droit>Search for>All referenced strings


1


Ctrl+F ou bien Click droit>Search for text, puis on cherche le texte de la messagebox.
On tombe dessus, et on repère aussi un string à peine plus haut "SysInfoVMDKRec.Lic" qui laisse suggérer que l'information de licence et stocker dans un fichier, un "keyfile".


1


On double-clique sur le premier string "Enter valid software authentication code" qui nous amène sur ça position: 003D99D9.
Ensuite on remonte un peut cette procédure, on remarque que l'on retrouve un peu plus haut notre string "SysInfoVMDKRec.Lic" il y sont dans la même procédure, ce qui laisse penser qu'on tient le bon bout...
Aller on remonte toute la routine pour y mettre un breakpoint à sont début.


1


Après on appuie sur F9 pour lancer le programme on rentre un sérial bidon et le débogueur break!
Il n'y a plu qu'a tracer pour voir ce qu'il se passe, allez hop!


III: Comprendre la routine d'enregistrement


On commence à tracer tranquillement à coup de F8 comme d'habitude.
Le programme commence par regarder si notre sérial a une longueur égale à zéro.


1


On arrive ensuite sur un appel a une procédure qui semble lui passer en argument notre serial, ainsi le string "SYSINFOVMDKRECFULL"
Allons voir ce qu'il s'y passe. Arriver en position 003D97C1, on appuie sur F7 pour rentrer dans l'appel de la sous-procédure.


1


On arrive en 00365B40.
On ne le sait pas encore, mais c'est dans cette routine que tout va se passer.
On notera au passage que cette procédure est appelée de 2 endroits, on reviendra là-dessus plus tard.


1


On continue de tracer avec F8 la procédure, puis arriver sur le premier call, on rentre avec F7.

1


On trace la procédure, le programme récupère le chemin du répertoire Windows (C:\Windows).


1


Ensuite le programme tronque le string pour garder les 3 premiers caractères (C:\)


1


Grâce aux informations récupérées, le programme récupère désormais les informations du volume courant avec l'API GetVolumeInformation.


1


Un peu plus bas, le programme prend notre numéro de série obtenue et le converti en décimale.


1


Puis notre sérial est assemblé avec le string en hard "SYSINFOVMDKRECFULL" pour devenir "SYSINFOVMDKRECFULL81594581"


1


Les appels sur 00366560 continuent d'assembler des bouts de textes en hard, le string final devient:


SYSINFOVMDKRECFULL81594581SYSINFOVMDKRECFULLSYSVMDKRECHSHCONVERT_VMDK_RECOVERY1_HARSHIKA_GSG_HSH_JAIBALAJI

1


On continue doucement de tracer puis on va rentrer dans l'appel de la procédure 003DA340.


1


On continue de tracer, notre string est récupéré puis...
Un œil avisé reconnaitra toute de suite les magic numbers standard du MD5.


1


Notre string est chiffré en MD5, puis converti en majuscule.


1


Ensuite on sort de la routine, pour revenir à la routine principale, on continue puis notre sérial est comparé.


1


Par la suite on arrive sur un saut conditionnel, qui nous envoie sur la procédure de la messagebox que l'on a trouvé dans les strings.


1


On comprend donc que "49A52E2576563AA796651223D094A356" corresponds au bon code d'authentification attendu.
Connaissant maintenant l'algorithme on peut désormais coder un keygen.


Si l'on souhaitait patcher l'application on pourrait patcher le JNZ.
Il nous reste quelque chose à vérifier, vous vous souvenez de la procédure appelée de deux endroits différents.
On va partir du principe qu'au démarrage de l'application il faut aussi vérifier le sérial, le second appel est probablement celui du démarrage.
On va donc aller remonter l'adresse d'appel et poser un breakpoint au début de la procédure, puis on recharge l'appli, on relance avec F9, et ça break direct!


1


On trace avec F8, on passe l'étape de calcul que l'on connaît déjà.
Le programme regarde ensuite dans roaming.


C:\Users\cyber\AppData\Roaming\SysInfo VMDK Recovery

1


Puis il cherche le fichier SysInfoVMDKRec.Lic.
S’il existe, le contenu est récupéré puis comparer au bon sérial calculé.
Après ça on continue de tracer, puis plus loin, on tombe sur un JNE, si celle-ci n'est pas prise, le programme affichera le dialogue d'authentification.
Si celui-ci est pris, l'application s'ouvre.
On peut donc patché le JNE par un JMP pour court-circuité la protection.


1


On en sait plus qu'assez... et si on codait un keygen au fait ?

IV: Faire un Keygen


L'éditeur semble utiliser toujours le même schéma pour ses produits.
L'occasion se présente donc à nouveau de faire un multi-keygen, cette fois-ci on va faire un peu plus propre que celui pour COAA.

base.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

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

include md5.asm

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

.const
IDC_SERIAL              equ 1001
IDC_GROUPBOX            equ 1002
IDB_GENERATE            equ 1003
IDC_DATE_STATIC         equ 1005
CBB_KGLIST              equ 1006
IDC_GROUPBOX2           equ 1007

CHAR_CARRIAGE_RETURN    equ 13
CHAR_COMMA              equ 44
CHAR_DOUBLE_QUOTES      equ 34
CHAR_LINE_FEED          equ 10
CHAR_SLASH_BACKWARD     equ 92

LENGTH_GENERAL          equ 8192
LENGTH_SERIAL_NUMBER    equ 256
MAXSiZE                 equ 256

.data
;Products algos
szSerialPart01          db "SYSINFOVMDKRECFULL",0
szSerialPart02          db "SYSINFOVMDKRECFULLSYSVMDKRECHSHCONVERT_VMDK_RECOVERY1_HARSHIKA_GSG_HSH_JAIBALAJI",0
szSerialPart03          db "SYSINFOTOOLSOSTREPFULLV1",0
szSerialPart04          db "SYSINFOTOOLSOSTREPFULLV1SYSOSTREC2912HSH_REPAIR_CORRUPT_OST_FILE_V_1.0_JAI_BALAJI_GOD_IS_GREAT",0
szSerialPart05          db "SYSINFOSQLDECRYPTORFULLV19",0
szSerialPart06          db "SYSINFOSQLDECRYPTORFULLV19SQLDECRYPTORHSHJrwxc5dd7w4E9Y4ALgX8Hu4uUh9daYst2spSnMX9uhSAuwkkXcSUBv9663Sawjp6zGxBYW",0
szSerialPart07          db "SYSINFOXLSXREPV2",0
szSerialPart08          db "SYSINFOXLSXREPV2SYSEXCELREC2912SYSXLSXRECJAIBALAJI",0
szSerialPart09          db "SYSINFOWNDSDATARECFULL",0
szSerialPart10          db "SYSINFOWNDSDATARECFULLSYSWINDOWSDATAREC2912CONVERT_DISK_RECOVERY1_HARSHIKA_GSG_HSH_JAIBALAJI",0
szSerialPart11          db "SYSINFOTOOLSSQLREPAIRPROFULLV1",0
szSerialPart12          db "SYSINFOTOOLSSQLREPAIRPROFULLV1SYSSQLDBPROREC2912HSH2912_REP_CORRUPT_SQL_PRO_FILE_HSH_JAI_BALAJI_GOD_IS_GREAT",0
szSerialPart13          db "SYSINFOSQLBAKRECFULL",0
szSerialPart14          db "SYSINFOSQLBAKRECFULLSYSSQLBAKREC2912CONVERT_SQL_BAK_REC_HARSHIKA_GSG_HSH_JAIBALAJI",0
szSerialPart15          db "SYSINFOSQLLDFRECFULL",0
szSerialPart16          db "SYSINFOSQLLDFRECFULLSYSLDFREC2912HSH2912_LDFREC_CORRUPT_JAI_BALAJI_GOD_IS_GREAT",0
szSerialPart17          db "SYSINFOEDB2PSTCONVFULL",0
szSerialPart18          db "SYSINFOEDB2PSTCONVFULLSYSEDB2PST2912dm6ASe3bxkUZvZwwE9qRADG2barAn9uAdzXW5cQPzGgc7u3kvSeW5CqSszjCkUThVectZP",0
szSerialPart19          db "SYSINFOTOOLSDXL2PSTFULL",0
szSerialPart20          db "SYSINFOTOOLSDXL2PSTFULLSYSDXL2PSTCONVERTER2912HSH_REPAIR_CORRUPT_DXL2PSTCONVERTER_JAI_BALAJI_GOD_IS_GREAT",0
szSerialPart21          db "SYSINFOVDIRECFULL",0
szSerialPart22          db "SYSINFOVDIRECFULLSYSVDIRECHSHCONVERT_VDI_RECOVERY1_HARSHIKA_GSG_HSH_JAIBALAJI",0
szSerialPart23          db "SYSINFOTOOLSSHAREPOINTREPAIRFULLV1",0
szSerialPart24          db "SYSINFOTOOLSSHAREPOINTREPAIRFULLV1SYSHSHSHAREPOINTREC2912HSH2912_CORRUPT_SHAREPOINT_SERVER_REC_V_1_JAI_BALAJI_GOD_IS_GREAT",0
szSerialPart25          db "SYSINFOTOOLSSQLLITEFULLV1",0
szSerialPart26          db "SYSINFOTOOLSSQLLITEFULLV1SYSHSHSQLITEREC2912HSH2912_REP_CORRUPT_SQL_LITE_REC_FILE_V_1_JAI_BALAJI_GOD_IS_GREAT",0
szSerialPart27          db "SYSINFOPDFSPLITFULLV3",0
szSerialPart28          db "SYSINFOPDFSPLITFULLV3SYSHSHPDFSPLIT2912PDFSPLITJAIBALAJIGODISGREAT",0
szSerialPart29          db "SYSINFOTOOLSPDFMERGE",0
szSerialPart30          db "SYSINFOTOOLSPDFMERGESYSHSHPDFMERGE2912HSH2912_MERGE_PDF_FILES_V_1_JAI_BALAJI_GOD_IS_GREAT",0
szSerialPart31          db "SYSINFOTOOLSMBOXCONVERTERFULLV1",0
szSerialPart32          db "SYSINFOTOOLSMBOXCONVERTERFULLV1SYSINFOMBOX2PSTCONV2912HSH_REPAIR_CORRUPT_MBOX-CONVERTER_V_1.0JAI-BALAJI_GOD_IS_GREAT",0
szSerialPart33          db "SYSINFOVHDRECFULL",0
szSerialPart34          db "SYSINFOVHDRECFULLSYSVHDRECHSHCONVERT_VHD_RECOVERY1_HARSHIKA_GSG_HSH_JAIBALAJI",0
szSerialPart35          db "SYSINFOTOOLSNSF2MBOXCONV1",0
szSerialPart36          db "SYSINFOTOOLSNSF2MBOXCONV1SYSNSF2MBOXConv2912HSH_CONV_NSF2MBOX_JAI_BALAJI_GOD_IS_GREAT",0
szSerialPart37          db "SYSINFOTOOLSPST2PDFConvFULL",0
szSerialPart38          db "SYSINFOTOOLSPST2PDFConvFULLSYSHSHPST2PDFCONV29HSH_PST_2_PDF_CONV_FILE_V_18_JAI_BALAJI_GOD_IS_GREAT",0
szSerialPart39          db "SYSINFOTOOLSSQLREPAIRFULLV1",0
szSerialPart40          db "SYSINFOTOOLSSQLREPAIRFULLV1SYSSQLDBREC2912HSH2912-REP_CORRUPT_SQL_FILE_V_1.0_JAI-BALAJI-GOD_IS_GREAT",0
szSerialPart41          db "SYSINFOMYSQLDBTSREPV18",0
szSerialPart42          db "SYSINFOMYSQLDBTSREPV18SYSMYSQLDBREC2912HSH2912_REP_MYSQLDB_FILE_JAI_BALAJI_GOD_IS_GREAT",0
szSerialPart43          db "SYSINFOTOOLSMULTIPSTREPFULLV17",0
szSerialPart44          db "SYSINFOTOOLSMULTIPSTREPFULLV17SYSMULTIPSTREP2912HSH_CONV_REP_MULTIPLEPST_JAI_BALAJI_GOD_IS_GREAT",0

szSerialFinal           dd MAXSiZE dup (0)
Selected_Keygen         dd 00h

; Dialog details
szTitle                 db "SysInfoTools *multikeygen*",0
szIDBExit               db "eXiT",0
szIDBGenerate           db "gENERATE!",0
szIDCgroupbox           db "y0ur AuThENTicATiON cODE:",0
szIDCgroupbox2          db "pR0dUCtZ:",0
szDateStatic            db "o1/o4/2o22",0

szApp_VMDK40            db "VMDK Recovery v4.0",0
szApp_OSTR90            db "OST Recovery v9.0",0
szApp_SQLD19            db "SQL Decryptor v19.0",0
szApp_XLSR30            db "Excel Recovery v3.0",0
szApp_WDDR01            db "Windows Data Recovery v1.0",0
szApp_MDFR18            db "MDF Recovery Pro v18.0",0
szApp_SQLBR2            db "SQL Backup Recovery v20.01",0
szApp_MQLTLR18          db "MS SQL Transaction Log Recovery v18.0",0
szApp_EPCONV19          db "EDB to PST Converter v19.0",0
szApp_DLPSTC02          db "DXL to PST Converter v2.0",0
szApp_VDIRV40           db "VDI Recovery v4.0",0
szApp_SPSRV19           db "SharePoint Server Recovery v19.0",0
szApp_SQLDR22           db "SQLite Database Recovery v2.02",0
szApp_PDFSV30           db "PDF Split v3.0",0
szApp_PDFMV30           db "PDF Merge v3.0",0
szApp_MPSTC7            db "MBOX to PST Converter v7.0",0
szApp_VHDR4             db "VHD Recovery v4.0",0
szApp_NFMBC3            db "NSF to MBOX Converter v3.0",0
szApp_PSTPDFC19         db "PST to PDF Converter v19.0",0
szApp_MQLDR21           db "MS SQL Database Recovery v21.07",0
szApp_MYQLDR21          db "MySQL Database Recovery v21.0",0
szApp_AOR80             db "Advanced Outlook Recovery v8.0",0

.data?
hInstance               dd ?
szSerialTemp            db 100h dup(?)
szSerial_len            dd ?
serialNumber            dd ?
bufferGeneral           dd ?
standardOutput          dd ? ; handle to the standard output
standardInput           dd ? ; handle to the standard input

.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

Gen_VMDK_Recovery_v4 proc
    invoke lstrcat,addr szSerialTemp,addr szSerialPart01
    invoke lstrcat,addr szSerialTemp,addr bufferGeneral
    invoke lstrcat,addr szSerialTemp,addr szSerialPart02
    ret
Gen_VMDK_Recovery_v4 endp

Gen_OST_Recovery_v9 proc
    invoke lstrcat,addr szSerialTemp,addr szSerialPart03
    invoke lstrcat,addr szSerialTemp,addr bufferGeneral
    invoke lstrcat,addr szSerialTemp,addr szSerialPart04
    ret
Gen_OST_Recovery_v9 endp

Gen_SQL_Decryptor_v19 proc
    invoke lstrcat,addr szSerialTemp,addr szSerialPart05
    invoke lstrcat,addr szSerialTemp,addr bufferGeneral
    invoke lstrcat,addr szSerialTemp,addr szSerialPart06
    ret
Gen_SQL_Decryptor_v19 endp

Gen_Excel_Recovery_v3 proc
    invoke lstrcat,addr szSerialTemp,addr szSerialPart07
    invoke lstrcat,addr szSerialTemp,addr bufferGeneral
    invoke lstrcat,addr szSerialTemp,addr szSerialPart08
    ret
Gen_Excel_Recovery_v3 endp

Gen_Windows_Data_Recovery_1 proc
    invoke lstrcat,addr szSerialTemp,addr szSerialPart09
    invoke lstrcat,addr szSerialTemp,addr bufferGeneral
    invoke lstrcat,addr szSerialTemp,addr szSerialPart10
    ret
Gen_Windows_Data_Recovery_1 endp

Gen_MDF_Recovery_Pro_v18 proc
    invoke lstrcat,addr szSerialTemp,addr szSerialPart11
    invoke lstrcat,addr szSerialTemp,addr bufferGeneral
    invoke lstrcat,addr szSerialTemp,addr szSerialPart12
    ret
Gen_MDF_Recovery_Pro_v18 endp

Gen_SQL_Backup_Recovery_v20 proc
    invoke lstrcat,addr szSerialTemp,addr szSerialPart13
    invoke lstrcat,addr szSerialTemp,addr bufferGeneral
    invoke lstrcat,addr szSerialTemp,addr szSerialPart14
    ret
Gen_SQL_Backup_Recovery_v20 endp

Gen_MS_SQL_Transaction_Log_Recovery_v18 proc
    invoke lstrcat,addr szSerialTemp,addr szSerialPart15
    invoke lstrcat,addr szSerialTemp,addr bufferGeneral
    invoke lstrcat,addr szSerialTemp,addr szSerialPart16
    ret
Gen_MS_SQL_Transaction_Log_Recovery_v18 endp

Gen_EDB_to_PST_Converter_v19 proc
    invoke lstrcat,addr szSerialTemp,addr szSerialPart17
    invoke lstrcat,addr szSerialTemp,addr bufferGeneral
    invoke lstrcat,addr szSerialTemp,addr szSerialPart18
    ret
Gen_EDB_to_PST_Converter_v19 endp

Gen_DXL_to_PST_Converter_v2 proc
    invoke lstrcat,addr szSerialTemp,addr szSerialPart19
    invoke lstrcat,addr szSerialTemp,addr bufferGeneral
    invoke lstrcat,addr szSerialTemp,addr szSerialPart20
    ret
Gen_DXL_to_PST_Converter_v2 endp

Gen_VDI_Recovery_v4 proc
    invoke lstrcat,addr szSerialTemp,addr szSerialPart21
    invoke lstrcat,addr szSerialTemp,addr bufferGeneral
    invoke lstrcat,addr szSerialTemp,addr szSerialPart22
    ret
Gen_VDI_Recovery_v4 endp

Gen_SharePoint_Server_Recovery_v19 proc
    invoke lstrcat,addr szSerialTemp,addr szSerialPart23
    invoke lstrcat,addr szSerialTemp,addr bufferGeneral
    invoke lstrcat,addr szSerialTemp,addr szSerialPart24
    ret
Gen_SharePoint_Server_Recovery_v19 endp

Gen_SQLite_Database_Recovery_v2 proc
    invoke lstrcat,addr szSerialTemp,addr szSerialPart25
    invoke lstrcat,addr szSerialTemp,addr bufferGeneral
    invoke lstrcat,addr szSerialTemp,addr szSerialPart26
    ret
Gen_SQLite_Database_Recovery_v2 endp

Gen_PDF_Split_v3 proc
    invoke lstrcat,addr szSerialTemp,addr szSerialPart27
    invoke lstrcat,addr szSerialTemp,addr bufferGeneral
    invoke lstrcat,addr szSerialTemp,addr szSerialPart28
    ret
Gen_PDF_Split_v3 endp

Gen_PDF_Merge_v3 proc
    invoke lstrcat,addr szSerialTemp,addr szSerialPart29
    invoke lstrcat,addr szSerialTemp,addr bufferGeneral
    invoke lstrcat,addr szSerialTemp,addr szSerialPart30
    ret
Gen_PDF_Merge_v3 endp

Gen_MBOX_to_PST_Converter_v7 proc
    invoke lstrcat,addr szSerialTemp,addr szSerialPart31
    invoke lstrcat,addr szSerialTemp,addr bufferGeneral
    invoke lstrcat,addr szSerialTemp,addr szSerialPart32
    ret
Gen_MBOX_to_PST_Converter_v7 endp

Gen_VHD_Recovery_v4 proc
    invoke lstrcat,addr szSerialTemp,addr szSerialPart33
    invoke lstrcat,addr szSerialTemp,addr bufferGeneral
    invoke lstrcat,addr szSerialTemp,addr szSerialPart34
    ret
Gen_VHD_Recovery_v4 endp

Gen_NSF_to_MBOX_Converter_v3 proc
    invoke lstrcat,addr szSerialTemp,addr szSerialPart35
    invoke lstrcat,addr szSerialTemp,addr bufferGeneral
    invoke lstrcat,addr szSerialTemp,addr szSerialPart36
    ret
Gen_NSF_to_MBOX_Converter_v3 endp

Gen_PST_to_PDF_Converter_v19 proc
    invoke lstrcat,addr szSerialTemp,addr szSerialPart37
    invoke lstrcat,addr szSerialTemp,addr bufferGeneral
    invoke lstrcat,addr szSerialTemp,addr szSerialPart38
    ret
Gen_PST_to_PDF_Converter_v19 endp

Gen_MS_SQL_Database_Recovery_v21 proc
    invoke lstrcat,addr szSerialTemp,addr szSerialPart39
    invoke lstrcat,addr szSerialTemp,addr bufferGeneral
    invoke lstrcat,addr szSerialTemp,addr szSerialPart40
    ret
Gen_MS_SQL_Database_Recovery_v21 endp

Gen_MySQL_Database_Recovery_v21 proc
    invoke lstrcat,addr szSerialTemp,addr szSerialPart41
    invoke lstrcat,addr szSerialTemp,addr bufferGeneral
    invoke lstrcat,addr szSerialTemp,addr szSerialPart42
    ret
Gen_MySQL_Database_Recovery_v21 endp

Gen_Advanced_Outlook_Recovery_v8 proc
    invoke lstrcat,addr szSerialTemp,addr szSerialPart43
    invoke lstrcat,addr szSerialTemp,addr bufferGeneral
    invoke lstrcat,addr szSerialTemp,addr szSerialPart44
    ret
Gen_Advanced_Outlook_Recovery_v8 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 szIDCgroupbox
       invoke SetDlgItemText,hWin,IDB_GENERATE,ADDR szIDBGenerate
       invoke SetDlgItemText,hWin,IDC_DATE_STATIC,addr szDateStatic
       invoke SetDlgItemText,hWin,IDC_GROUPBOX2,addr szIDCgroupbox2
       invoke SendDlgItemMessage,hWin,CBB_KGLIST,CB_ADDSTRING,0,addr szApp_VMDK40
       invoke SendDlgItemMessage,hWin,CBB_KGLIST,CB_ADDSTRING,0,addr szApp_OSTR90
       invoke SendDlgItemMessage,hWin,CBB_KGLIST,CB_ADDSTRING,0,addr szApp_SQLD19
       invoke SendDlgItemMessage,hWin,CBB_KGLIST,CB_ADDSTRING,0,addr szApp_XLSR30
       invoke SendDlgItemMessage,hWin,CBB_KGLIST,CB_ADDSTRING,0,addr szApp_WDDR01
       invoke SendDlgItemMessage,hWin,CBB_KGLIST,CB_ADDSTRING,0,addr szApp_MDFR18
       invoke SendDlgItemMessage,hWin,CBB_KGLIST,CB_ADDSTRING,0,addr szApp_SQLBR2
       invoke SendDlgItemMessage,hWin,CBB_KGLIST,CB_ADDSTRING,0,addr szApp_MQLTLR18
       invoke SendDlgItemMessage,hWin,CBB_KGLIST,CB_ADDSTRING,0,addr szApp_EPCONV19
       invoke SendDlgItemMessage,hWin,CBB_KGLIST,CB_ADDSTRING,0,addr szApp_DLPSTC02
       invoke SendDlgItemMessage,hWin,CBB_KGLIST,CB_ADDSTRING,0,addr szApp_VDIRV40
       invoke SendDlgItemMessage,hWin,CBB_KGLIST,CB_ADDSTRING,0,addr szApp_SPSRV19
       invoke SendDlgItemMessage,hWin,CBB_KGLIST,CB_ADDSTRING,0,addr szApp_SQLDR22
       invoke SendDlgItemMessage,hWin,CBB_KGLIST,CB_ADDSTRING,0,addr szApp_PDFSV30
       invoke SendDlgItemMessage,hWin,CBB_KGLIST,CB_ADDSTRING,0,addr szApp_PDFMV30
       invoke SendDlgItemMessage,hWin,CBB_KGLIST,CB_ADDSTRING,0,addr szApp_MPSTC7
       invoke SendDlgItemMessage,hWin,CBB_KGLIST,CB_ADDSTRING,0,addr szApp_VHDR4
       invoke SendDlgItemMessage,hWin,CBB_KGLIST,CB_ADDSTRING,0,addr szApp_NFMBC3
       invoke SendDlgItemMessage,hWin,CBB_KGLIST,CB_ADDSTRING,0,addr szApp_PSTPDFC19
       invoke SendDlgItemMessage,hWin,CBB_KGLIST,CB_ADDSTRING,0,addr szApp_MQLDR21
       invoke SendDlgItemMessage,hWin,CBB_KGLIST,CB_ADDSTRING,0,addr szApp_MYQLDR21
       invoke SendDlgItemMessage,hWin,CBB_KGLIST,CB_ADDSTRING,0,addr szApp_AOR80
       invoke SendDlgItemMessage,hWin,CBB_KGLIST,CB_SETCURSEL,0,0
    .elseif uMsg == WM_COMMAND
           movzx eax, word ptr wParam
           .if eax == CBB_KGLIST
                movzx eax, word ptr wParam+2
                .if eax == CBN_SELCHANGE
                    movzx eax, word ptr wParam
                    invoke SendDlgItemMessage,hWin,eax,CB_GETCURSEL,0,0
                    mov Selected_Keygen,eax
                .endif
           .elseif wParam == IDB_GENERATE
                ;Retrieve serialnumba info
                invoke GetVolumeInformation,NULL,NULL,0,addr serialNumber,NULL,NULL,NULL,0
                ;Convert it to decimal
                invoke WriteDecimal,serialNumber,addr bufferGeneral
                ;User choice for string assemblies following product choosed
                mov eax,Selected_Keygen
                .if eax == 0
                    invoke Gen_VMDK_Recovery_v4
                .elseif eax == 1
                    invoke Gen_OST_Recovery_v9
                .elseif eax == 2
                    invoke Gen_SQL_Decryptor_v19
                .elseif eax == 3
                    invoke Gen_Excel_Recovery_v3
                .elseif eax == 4
                    invoke Gen_Windows_Data_Recovery_1
                .elseif eax == 5
                    invoke Gen_MDF_Recovery_Pro_v18
                .elseif eax == 6
                    invoke Gen_SQL_Backup_Recovery_v20
                .elseif eax == 7
                    invoke Gen_MS_SQL_Transaction_Log_Recovery_v18
                .elseif eax == 8
                    invoke Gen_EDB_to_PST_Converter_v19
                .elseif eax == 9
                    invoke Gen_DXL_to_PST_Converter_v2
                .elseif eax == 10
                    invoke Gen_VDI_Recovery_v4
                .elseif eax == 11
                    invoke Gen_SharePoint_Server_Recovery_v19
                .elseif eax == 12
                    invoke Gen_SQLite_Database_Recovery_v2
                .elseif eax == 13
                    invoke Gen_PDF_Split_v3
                .elseif eax == 14
                    invoke Gen_PDF_Merge_v3
                .elseif eax == 15
                    invoke Gen_MBOX_to_PST_Converter_v7
                .elseif eax == 16
                    invoke Gen_VHD_Recovery_v4
                .elseif eax == 17
                    invoke Gen_NSF_to_MBOX_Converter_v3
                .elseif eax == 18
                    invoke Gen_PST_to_PDF_Converter_v19
                .elseif eax == 19
                    invoke Gen_MS_SQL_Database_Recovery_v21
                .elseif eax == 20
                    invoke Gen_MySQL_Database_Recovery_v21
                .elseif eax == 21
                    invoke Gen_Advanced_Outlook_Recovery_v8
                .endif
                invoke lstrlen,addr szSerialTemp
                mov szSerial_len,eax
                ;MD5
                invoke MD5Init
                invoke MD5Update,addr szSerialTemp,szSerial_len
                invoke MD5Final
                ;hex to chars the MD5 and send to input box.
                invoke HexToChar,addr MD5Digest,addr szSerialFinal,16
                invoke SetDlgItemText,hWin,IDC_SERIAL,addr szSerialFinal
                call clean
           .endif
    .elseif uMsg == WM_CLOSE
           invoke EndDialog,hWin,0
    .endif

    xor eax,eax
    ret
DlgProc    endp

WriteDecimal proc    value    :DWORD,
                     buffer   :DWORD
    push edi
    push esi
    mov esi, buffer
    mov edi, buffer
    mov eax, value
    mov ecx, 10
WriteDecimal_Loop:
    xor edx, edx
    div ecx
    add dl, '0'
    mov [edi], dl
    add edi, 1
    cmp eax, 0
    jnz WriteDecimal_Loop
WriteDecimal_End:
    xor al, al
    mov [edi], al
WriteDecimal_ReverseLoop:
    sub edi, 1
    cmp esi, edi
    jge WriteDecimal_ReverseEnd
    mov al, [esi]
    mov dl, [edi]
    mov [esi], dl
    mov [edi], al
    add esi, 1
    jmp WriteDecimal_ReverseLoop
WriteDecimal_ReverseEnd:
    pop esi
    pop edi
    ret
WriteDecimal endp

clean proc
    invoke RtlZeroMemory,addr szSerialTemp,sizeof szSerialTemp
    invoke RtlZeroMemory,addr szSerial_len,sizeof szSerial_len
    invoke RtlZeroMemory,addr szSerialFinal,sizeof szSerialFinal
    invoke RtlZeroMemory,addr bufferGeneral,sizeof bufferGeneral
    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_SERIAL 1001
#define IDC_GROUPBOX 1002
#define IDB_GENERATE 1003
#define IDC_DATE_STATIC 1005
#define CBB_KGLIST 1006
#define IDC_GROUPBOX2 1007

101 DIALOGEX 0,0,227,78
FONT 8,"Tahoma"
STYLE 0x80c80880
EXSTYLE 0x00000000
BEGIN
    CONTROL "",IDC_GROUPBOX2,"Button",0x50008007,3,3,221,31,0x00000000
    CONTROL "",IDC_GROUPBOX,"Button",0x50008007,3,37,221,38,0x00000000
    CONTROL "",IDB_GENERATE,"Button",0x10000001,170,15,50,12,0x00000000
    CONTROL "",IDC_SERIAL,"Edit",0x10000881,13,49,201,12,0x00000200
    CONTROL "",IDC_DATE_STATIC,"Static",0x58000000,5,65,44,9,0x00000000
    CONTROL "",CBB_KGLIST,"ComboBox",0x10200203,13,15,151,125,0x00000000
END

make.bat:

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

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

1



Un beau +22 qui n'attend que d'être essayé, sans surprise l'application s'ouvre:


1


Et voilà c'est déjà la fin.




Xylitol, o1/04/2022




Copyright (C)- xtx Team (2022)

XHTML valide 1.1 CSS Valide !