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...
OllyDbg v2.01 (http://Ollydbg.de/)
Detect It Easy (https://github.com/horsicq/DIE-engine/releases)
V*M*D*K R*e*c*o*v*e*r*y v4.0 (a6f867e1428cf0c694001607124bd6f8)
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.
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.
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.
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).
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..
À l'ouverture le programme nous demande un sérial, on rentre n'importe quoi comme d'habitude puis on click sur Activate.
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.
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
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".
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.
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.
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.
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.
On continue de tracer avec F8 la procédure, puis arriver sur le premier call, on rentre avec F7.
On trace la procédure, le programme récupère le chemin du répertoire Windows (C:\Windows).
Ensuite le programme tronque le string pour garder les 3 premiers caractères (C:\)
Grâce aux informations récupérées, le programme récupère désormais les informations du volume courant avec l'API GetVolumeInformation.
Un peu plus bas, le programme prend notre numéro de série obtenue et le converti en décimale.
Puis notre sérial est assemblé avec le string en hard "SYSINFOVMDKRECFULL" pour devenir "SYSINFOVMDKRECFULL81594581"
Les appels sur 00366560 continuent d'assembler des bouts de textes en hard, le string final devient:
SYSINFOVMDKRECFULL81594581SYSINFOVMDKRECFULLSYSVMDKRECHSHCONVERT_VMDK_RECOVERY1_HARSHIKA_GSG_HSH_JAIBALAJI
On continue doucement de tracer puis on va rentrer dans l'appel de la procédure 003DA340.
On continue de tracer, notre string est récupéré puis...
Un œil avisé reconnaitra toute de suite les magic numbers standard du MD5.
Notre string est chiffré en MD5, puis converti en majuscule.
Ensuite on sort de la routine, pour revenir à la routine principale, on continue puis notre sérial est comparé.
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.
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!
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
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.
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:
Un beau +22 qui n'attend que d'être essayé, sans surprise l'application s'ouvre:
Et voilà c'est déjà la fin.
Xylitol, o1/04/2022
Copyright (C)- xtx Team (2022)