Utilisateur: Lucifer48 Ville ou société: Paris Numéro de Licence: 1120294756 Utilisateur: LUCIFER48 Ville ou société: France Numéro de Licence: 352118081 Programme : Taxogyre 95 Cathégorie : Utilitaire PlateForme : Windows 95 Date : 16h, 1 juillet 1998 Version : v4.3 Protection : Registration (numéro de licence et crack) Fichier : Taxogyre.exe Outils : Soft-ice v2.0 et Wdasm8.9 (une fois n'est pas coutume) Ou ça? : CD n°28 de PcTeam Temps passé: Quelques heures (pour la rédaction) Cours : 08 Matos : Bloc-notes en 800*600 ====================================== 1. A la recherche du numéro de licence ====================================== - Je lance le programme, va dans dans "Numéro de Licence", je remplis les cases: Utilisateur: Lucifer48 Ville ou société: Paris Numéro de Licence: 0836681214 /* C'est un faux serial évidemment */ - Comme d'habitude avant de valider, je pose un bpx hmemcpy. - On click et zou me voilà sous soft-ice. J'appuie 3 fois sur F5 (le programme copie les données en mémoires), j'appuis sur F11 (pour sortir de cette fonction; ça nous économise quelques frappes sur F10) - Je désactive mon bp qui ne sert plus à rien. - Je recherche nom numéro en mémoire, je fais: S 0 L FFFFFFFF "0836681214" Je pose un breakpoint (BPM) dessus, j'appuie sur F5 et le programme s'arrête sur mon bp posé il y a quelques secondes. Remarque: si le programme ne s'arrête pas, il se peut qu'il y ait plusieurs occurrances en mémoire, dans ce cas je relance windows pour avoir un espace de travail tout neuf. Sinon essayer les autres occurrances. Soft-ice s'arrête ici: XXXX:00402CD3 8A1E MOV BL,[ESI] XXXX:00402CD5 46 INC ESI <------ merci le BPM XXXX:00402CD6 80FB20 CMP BL,20 Maintenant je peut rien faire d'autre que de balancer toute la routine pour voir comment le programme calcule de code. A tous ceux hermétiques à l'assembleur, passez votre chemin. Initialement BL=30 (soit "0", notre premier chiffre est chargé) ESI pointe vers notre numéro de licence (faire D ESI) XXXX:00402CD5 46 INC ESI XXXX:00402CD6 80FB20 CMP BL,20 ;BL = " " (caractère espace) ? XXXX:00402CD9 74F8 JZ 00402CD3 ;si oui on saute en 00402CD3 XXXX:00402CDB B500 MOV CH,00 ;XOR CH,CH (codé 32ED) c'est fait pour les chiens... XXXX:00402CDD 80FB2D CMP BL,2D ;BL = "-" ? XXXX:00402CE0 7445 JZ 00402D27 ;si oui on saute en 00402D27 XXXX:00402CE2 80FB2B CMP BL,2B ;BL = "+" ? XXXX:00402CE5 7442 JZ 00402D29 ;si oui on saute en 00402D29 XXXX:00402CE7 80FB24 CMP BL,24 ;BL = "$" ? XXXX:00402CEA 7442 JZ 00402D2E ;si oui on saute en 00402D2E XXXX:00402CEC 84DB TEST BL,BL ;si BL est nul... XXXX:00402CEE 7432 JZ 00402D22 ;...alors GOTO CASP LBL1:-----------------------------------;début des calculs XXXX:00402CF0 80EB30 SUB BL,30 ;Rappel: 30..39 => "0".."9" XXXX:00402CF3 80FB09 CMP BL,09 ;On a un résultat plus grand que 9... XXXX:00402CF6 772A JA 00402D22 ;...si oui, alors GOTO CASP XXXX:00402CF8 39F8 CMP EAX,EDI ;si EAX est plus grand que EDI.. XXXX:00402CFA 7726 JA 00402D22 ;...si oui, alors GOTO CASP XXXX:00402CFC 8D0480 LEA EAX,[EAX*4+EAX] ; EAX=EAX*5 XXXX:00402CFF 01C0 ADD EAX,EAX ; EAX= EAX*2 XXXX:00402D01 01D8 ADD EAX,EBX ; EAX= EAX+EBX ----------------------------------------;fin des calculs XXXX:00402D03 8A1E MOV BL,[ESI] ;nouveau caractère XXXX:00402D05 46 INC ESI XXXX:00402D06 84DB TEST BL,BL ;si BL est n'est pas null... XXXX:00402D08 75E6 JNZ 00402CF0 ;alors on recommence le petit calcul (GOTO LBL1) XXXX:00402D0A FECD DEC CH XXXX:00402D0C 7410 JZ 00402D1E XXXX:00402D0E 85C0 TEST EAX,EAX XXXX:00402D10 7C10 JL 00402D22 XXXX:00402D12 59 POP ECX ;adresse du numéro de licence XXXX:00402D13 31F6 XOR ESI,ESI ;ESI=0 XXXX:00402D15 8932 MOV [EDX],ESI XXXX:00402D17 5F POP EDI XXXX:00402D18 5E POP ESI XXXX:00402D19 5B POP EBX XXXX:00402D1A C3 RET ;on sort de la routine CASP:-----------------------------------;On entre dans les cas particuliers. XXXX:00402D1B 46 INC ESI ;Pas très intéressant... XXXX:00402D1C EB04 JMP 00402D22 XXXX:00402D1E F7D8 NEG EAX XXXX:00402D20 7EF0 JLE 00402D12 XXXX:00402D22 5B POP EBX XXXX:00402D23 29DE SUB ESI,EBX ... On en connaît assez pour pouvoir essayer de trouver un bon code d'enregistrement. A la sortie EAX contient donc notre cheksum (pour moi c'est: 31DEBDFE), Remarque: si le numéro de licence comporte des lettres, alors EBX=0. On sort du call, on trace un petit peu, on sort des différents call... Nous somme à présent ici: XXXX:0043D077 CALL 00434ABC XXXX:0043D07C TEST AL,AL XXXX:0043D07E JZ 0043D0B2 <-- Si on saute: mauvais code On va donc rentrer dans ce call, en espérant trouver la comparaison de notre checksum avec un autre checksum. On entre dans le call, on trace, les movs et les call servent pour trifouiller dans la base des registres, on passe, on arrive donc à la comparaison fatale: XXXX:00434BA0 8B55F4 MOV EDX,[ESP-0C] XXXX:00434BA3 8B45F8 MOV EAX,[EBP-08] XXXX:00434BA6 E8A9FEFFFF CALL 00434A54 <---- Checksum de nom+ville XXXX:00434BAB 3BD8 CMP EBX,EAX XXXX:00434BAD 7504 JNZ 00434BB3 <---- Si saut: code incorrect On remarque que EBX contient notre checksum du Numéro de licence. Les deux mov pointent vers le nom et la ville, le call calcule un checksum et va le comparer ensuite. Pour moi EAX=42C65764 Il faut donc trouver la combinaison de chiffres pour laquelle EBX=EAX=42C65764 On prend une calculatrice (les plus perspicaces auront compris laquelle) et on y va: 42C65764_h DIV A_h = 6AD6F23_h reste 6 6AD6F23_h DIV A_h = AAF183_h reste 5 AAF183_h DIV A_h = 111826_h reste 7 111826_h DIV A_h = 1B59D_h reste 4 1B59D_h DIV A_h = 2BC2_h reste 9 2BC2_h DIV A_h = 460_h reste 2 460_h DIV A_h = 70_h reste 0 70_h DIV A_h = B_h reste 2 B_h DIV A_h = 1_h reste 1 1_h DIV A_h = 0_h reste 1 Petite mise au point, j'ai mis "_h" pour signifier la base héxadécimale Rappel pour les neuneus: 7_h = 7_d et A_h = 10_d Mon code est donc 1120294756, j'essaye: youpi! ça marche! Finalement, qu'est-ce qu'on a fait? Une vulguère conversion en base décimale. Car évidemment 42C65764_h = 1120294756_d Eh oui, tout ça pour ça. =========================== 2. NON, MOI JE VEUX CRACKER =========================== Ok, allons-y pour le crack: Ce qui précède va nous aider XXXX:0043D077 CALL 00434ABC XXXX:0043D07C TEST AL,AL XXXX:0043D07E JZ 0043D0B2 <-- Si on saute: mauvais code Si on remplace (on inverse) le test, ça va marcher mais à la prochaine relance, la nag-screen du début va s'afficher. Conclusion, il faut aller dans la vraie routine de test, c'est à dire dans le call. XXXX:00434BA0 8B55F4 MOV EDX,[ESP-0C] XXXX:00434BA3 8B45F8 MOV EAX,[EBP-08] XXXX:00434BA6 E8A9FEFFFF CALL 00434A54 <---- Checksum de nom+ville XXXX:00434BAB 3BD8 CMP EBX,EAX XXXX:00434BAD 7504 JNZ 00434BB3 <---- Si saut: code incorrect Ici, si on inverse le JNZ (nop ou tout ce que vous voulez), là ça va marcher, la nag-screen du début ne vas plus s'afficher. Faisons les modifications sur le disque: Remplacer: 3B D8 75 04 par: -- -- 90 90 (ne me prenez pas la tête avec: "si on fait CMP EAX,EAX, ça fait plus pro...". Je vous mâche déjà pas mal le travail...) On lance le soft, et il nous dit qu'il y a un virus. Il faut donc rechercher l'endroit de cette vérification. Pour cela Wdasm est parfaitement adapté. Vous l'avez sans doute lu 110000 fois, on click sur StringDataReference... On obtient: :00447B5D 8B45F4 mov eax, dword ptr [ebp-0C] :00447B60 E867B7FEFF call 004332CC :00447B65 3305CCC74500 xor eax, dword ptr [0045C7CC] :00447B6B 3BD8 cmp ebx, eax :00447B6D 741F je 00447B8E <--------------- ICI :00447B6F 6A00 push 00000000 :00447B71 668B0DE8814400 mov cx, word ptr [004481E8] :00447B78 33D2 xor edx, edx * Possible StringData Ref from Code Obj ->"Le fichier TAXOGYRE.EXE semble " ->"endommag" | :00447B7A B8F4814400 mov eax, 004481F4 :00447B7F E890ACFEFF call 00432814 :00447B84 A124D64500 mov eax, dword ptr [0045D624] :00447B89 E87AF1FDFF call 00426D08 * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00447B6D(C) | :00447B8E 8D55F4 lea edx, dword ptr [ebp-0C] :00447B91 B894E74500 mov eax, 0045E794 :00447B96 E859FDFDFF call 004278F4 :00447B9B 8B55F4 mov edx, dword ptr [ebp-0C] :00447B9E A124D64500 mov eax, dword ptr [0045D624] :00447BA3 83C030 add eax, 00000030 Si on tranforme le je en jne, plus de probleme... Remplacer: 3B D8 74 1F par: -- -- 75 -- Voilà de quoi faire un vrai bon crack. ================ 3. DERNIERS MOTS ================ Il est à noter que ce principe est très largement répendu: on encode (généralement sur 32bits) le nom (avec parfois la company) d'un quelconque manière et on compare cette valeur (via l'instruction CMP) avec le serial entré par l'utilisateur convertit en héxadécimal (ou via l'appel à User32!GetDlgItemInt ). Beacoup de sharewares utilisent cette méthode, quelques uns: -HyperSnap v2.60 (CMP EDI,EAX) -PicPress v3.81 -Power Browser v1.51 -DLL Show v3.3 -Graphic Vision v97b -ToggleMOUSE v4.2.2 -ToggleDISKSPACE 2.0.3 et plein d'autres...