ษอออออออออออออออออออออออออออออออออออป บ KeygenMe hccc #5 บ ศอออออออออออออออออออออออออออออออออออผ Au lancement du KeygenMe, une boite " Softice Detected " s'affiche, puis la boite de Dialogue (Name + serial) apparait. Tant que SoftIce sera detecte, le bouton " register " restera grisee (EAX =0). Nous verrons plus tard comment patcher en memoire l'anti XXX. Une rapide recherche dans les Strings Data va nous donner la solution pour contourner ce desagrement : * Possible StringData Ref from Data 0bj ->"Vilain Gar" :0040134A 6804614000 push 00406104 * Possible StringData Ref from Data 0bj ->"Softice Detected ;(" :0040134F 68F0604000 push 004060FO En remontant de quelques lignes, l'anti XXX est l a : :00401317 B443 mov ah, 43 :00401319 CD68 int 68 :0040131B 663D86F3 cmp ax, F386 :0040131F 7405 je 00401326 :00401321 E9CCOOOOOO jmp 004013F2 En double Noppant en 00401319, vous serez debarasse de l'INT 68, et de l'antiSice par la meme occasion. C'est cette solution que je retiendrais pour le Memory Patcher demande par TiPiaX. Dans les autres Strings Data interesaante, il y avait egalement celles ci : * Possible StringData Ref from Data 0bj ->"Bien jou" :004012D6 push 00406040 :004012DB mov eax, dword ptr [ebp+08] :004012DE push eax :004012DF Call MessageBoxA * Referenced by a (C)onditiona1 Jump at 004012CD :004012E7 cmp dword ptr [00406A90], 00000000 :004012EE je 00401308 :004012F0 push 00000000 * Possible StringData Ref from Data 0bj ->"KeyGeNMe" :004012F2 push 004061B4 * Possible StringData Ref from Data 0bj ->"Tu t'es plant" En remmontant a partir des adresses ci dessus, vous trouverez la saisie de champs Name et Serial : :00401091 push 00000032 Nombre maxi de caracteres a saisir :00401093 push 00406A5C adresse buffer du Name :00401098 push 000003E8 identificateur du champ name :0040109D mov eax, dword ptr [ebp+08] handle de la Dialog Box :004010A0 push eax poussee sur la pile :004010A1 Call GetD1gItemTextA appel de l'API :004010A7 push 00000032 Nombre maxi de caracteres a saisir :004010A9 push 00406B04 adresse du buffer de stockage :004010AE push 000003E9 identificateur nIDDlgItem :004010B3 mov ecx, dword ptr [ebp+08] handle de la DialogBox :004010B6 push ecx poussee par ECX :004010B7 Call GetD1gItemTextA appel de l'API :004010BD movsx edx, byte ptr [00406A5C] Recupere un caractere du name :004010C4 test edx, edx test si caractere present :004010C6 jne 004010E3 si OK -> Jump En 004010E3, le programme fera la meme chose pour le serial, avant d'aller en 00401109 si tout va bien. TiPiaX verifie ensuite la presence d'au moins 4 caracteres dans le Name : :00401120 cmp dword ptr [taille du serial], 00000004 :00401127 jge 00401144 -> Jump si Good Ensuite le programme va intercaler le name entre entre les chaines " Hccc " et " KeygenMe " pour donner une string du type HcccNameKeygenMe qui sera la base du calcul de deux serials de 4 digits chacun : * Possible StringData Ref from Data 0bj ->"KeygenMe" :00401144 push 004060E4 :00401149 push 00406A5C * Possible StringData Ref from Data 0bj ->"Hccc" :0040114E push 004060DC :00401165 mov dword ptr [00406A50], 00000000 mise a 0 du compteur :0040116F jmp 00401180 saute incrementation * Referenced by a (U)nconditional or (C)onditiona1 Jump at 004011E5(U) :00401171 mov ecx, dword ptr [00406A50] recupere le compteur :00401177 add ecx, 00000001 incremente le compteur :0040117A mov dword ptr [00406A50], ecx restock valeur du compteur :00401180 mov edx, dword ptr [00406A50] EDX = 0 a fin de la chaine :00401186 movsx eax, byte ptr [edx+00406B38] EAX = un digit de la chaine :0040118D test eax, eax etait-ce le dernier ? :0040118F je 004011E7 oui -> fin de la routine :00401191 mov ecx, dword ptr [00406A50] ECX = compteur :00401197 movsx edx, byte ptr [ecx+00406B38] EDX = 1 caractere du serial :0040119E mov dword ptr [00406A94], edx Stocke dans ad [memoire] temp :004011A4 mov eax, dword ptr [00406A94] recupere dans EAX :004011A9 add eax, 00000009 valeur ASCII du caractere + 9 :004011AC mov dword ptr [00406A94], eax resultat dans ad [memoire] :004011B1 mov ecx, dword ptr [00406A94] recupere par ECX :004011B7 imul ecx, 0000000E multiplie par 15 :004011BA mov dword ptr [00406A94], ecx stocke dans ad [memoire] :004011CO mov eax, dword ptr [00406A94] recupere par EAX :004011C5 cdq mise a 0 de EDX :004011C6 and edx, 00000003 EDX reste a 0 :004011C9 add eax, edx ajout de EDX a EAX :004011CB sar eax, 02 EAX / 4 :004011CE mov dword ptr [00406A94], eax stockage dans ad [memoire] :004011D3 mov edx, dword ptr [00406B00] recupere resultat final :004011D9 add edx, dword ptr [00406A94] ajoute au resultat temporaire :004011DF mov dword ptr [00406BO0], edx restocke dans [memoire] finale :004011E5 jmp 00401171 boucle -> fin de la routine * Referenced by a (U)nconditional or (C)onditiona1 Jump at Address: |:0040118F(C) I :004011E7 mov dword ptr [00406A50], 00000000 remise a zero du compteur :004011F1 jmp 00401200 saute over manip compteur On retrouve le meme schema que precedent, avec comme variante : :00401229 xor edx, 00000009 A la place du Imul ECX, 0E / SAR EAX, 2. En conclusion, la meme chaine est bidouillee par deux routines sensiblement identiques, et qui vont chacunes generer un serial different. A titre d'exemple, la chaine HcccchristalKeygenMe va donner " 1E03 " comme resultat de la premiere routine, et " 07F8 " pour la seconde. Ces deux chaines vont ensuite etre transformees en leurs correspondances decimales (soit 1E03 = 7683 et 07F0 = 2040), place l'un derriere l'autre, separees par un tiret " - ", et pour finir completees par " -69 " : :00401244 mov ecx, dword ptr [00406A98] -> second serial en hexa :0040124A push ecx :0040124B mov edx, dword ptr [00406BO0] -> premier serial en hexa :00401251 push edx * Possible StringData Ref from Data 0bj ->"%d-%d-69" :00401252 push 00406138 -> pousse "%d-%d-69" A la sortie de cette routine, le serial aura cette forme : 7683-2040-69 S'en suivra un test de comparaison avec le serial entre avant de definir si ce serial entre est accepte : :004012A6 mov [ebp-1C], 00000000 serial refuse :004012AD jmp 004012B7 :004012AF sbb eax, eax :004012B1 sbb eax, FFFFFFFF :004012B4 mov dword ptr [ebp-1C], eax serial accepte Les sources commentees du keygen de christal sont dans le zip (Keygen.Hccc.Christal.asm)