Nom : Harmony Assistant Version : 6.2.2 Disponibilité :http://www.myriad-online.com Protections : Checksum/nag/Fonctions désactivées Tools : Softice 4.0 Windasm 8.93 Editeur Hexa Brain/ganja/clopes/feuilles Harmony Assistant un soft d'aide à la composition musicale . Il permet entre autre de mettre une partition dans votre scanner et de vous la retranscrire à l'écran . Soit dit en passant, c'est pas mal foutu puisqu'une fois votre partition numérisée, il est tout à fait possible de modifier la portée sur votre écran .Le soft balance un nag à tous les démarrages . De plus, le programmeur de ce soft à entièrement reprogrammé son interface : aucun breakpoint standart (MessageBoxA,Hmemcpy etc...) ne fonctionne ...Et le programmeur a prévu une petite surprise ... Step 1 Bon, comme il n'y avait aucun breakpoint qui ne fonctionnait, j'ai décidé de tracer le prog depuis le débutjusqu'à l'affiche du nag qui dit kon est pas enregistré . Seulement c'est la galère aussi ... En effet,quand vous tracez un prog avec softice, ce dernier vous rend la main, si vous l'avez tracé avec symbol loader, dès que vous fermez votre prog .Normal. Sauf qu'avec Harmony Assistant, softice ne se déclenche pas quand vous quittez le proggy ...Ce qui fait une trace bien galère (les connaisseurs me comprendront).Alors on commence par prendre symbol loader et on ouvre le proggy .On commence à tracer le proggy avec la touche F10 et rapidement on arrive à ceci : 015F:00568067 PUSH 00 015F:00568069 PUSH 00 015F:0056806B CALL [KERNEL32!GetModuleHandleA] 015F:00568071 PUSH EAX 015F:00568072 CALL 00565708------ le 1er call qui ouvre le proggy 015F:00568077 PUSH EAX 015F:00568078 CALL 00554120 Bon, c'est le call 565708 qui initialise le proggy .Il faut donc rentrer dans ce call avec la touche F8 de softice . Et on continue la trace avec F10 .On arrive à ceci : 015F:00565791 PUSH 00 015F:00565793 PUSH 01 015F:00565795 CALL 004C4449------ le 2ème call qui initialise le prog 015F:0056579A POP ECX 015F:0056579B POP ECX 015F:0056579C POP EBX 015F:0056579D XOR EAX,EAX Cette fois c'est le call 4c4449 qui ouvre le prog.Meme opération que tout à l'heure: F8 et on continue la trace avec F10 pour voir ça : 015F:004C4547 MOV DWORD PTR [EAX+08],004C4436 015F:004C454E CALL 004F4B3C 015F:004C4553 CALL 004A6823------ le 3ème call qui ouvre le proggy 015F:004C4558 ADD ESP,00000118 015F:004C455E POP EBP 015F:004C455F POP EBX 015F:004C4560 RET La call 4a6823 ouvre le prog : F8 et F10 pour arriver là : 015F:004A6879 MOV DWORD PTR [005E00D4],004A9ACE 015F:004A6883 MOV DWORD PTR [005E0674],0049D20E 015F:004A688D CALL 004A9A39 015F:004A6892 CALL 004CAF7E 015F:004A6897 CALL 004D51E3------ le 4ème call qui ouvre le proggy 015F:004A689C PUSH 28 015F:004A689E CALL 00499B78 015F:004A68A3 POP ECX Le call 4d51e3 ouvre le proggy : F8 et F10 et on arrive là : 015F:004D51E3 PUSH EBX 015F:004D51E4 SUB ESP,18 015F:004D51E7 CALL 004D511B------ le 5ème call qui ouvre le proggy 015F:004D51EC CALL 004CAE9E 015F:004D51F1 CALL 004CAFCF 015F:004D51F6 PUSH 005ECEE0 015F:004D51FB PUSH 005ECEE4 Et finalement, le call 4d511b ouvre le proggy : F8 et F10 une dernière fois pour arriver à ceci : 015F:004D511B MOV ECX,[005E00A8] 015F:004D5121 PUSH EBX 015F:004D5122 MOV EBX,[ECX] 015F:004D5124 CALL [EBX+08]--- le call qui test si on est enregistré ou pas 015F:004D5127 MOV BL,AL ----- fout le contenu de al dans bl 015F:004D5129 CALL 005395B6 015F:004D512E TEST BL,BL ------- Test BL 015F:004D5130 MOV [00573FCA],EAX 015F:004D5135 JNZ 004D5148--- si utilisateur enregistré,saute le nag 015F:004D5137 CALL 004B6BAC--- le call qui affiche le nag 015F:004D513C TEST AL,AL 015F:004D513E JNZ 004D5148 015F:004D5140 PUSH 00 015F:004D5142 CALL 00554120----- le call qui ferme le proggy 015F:004D5147 POP ECX 015F:004D5148 PUSH 00573FCE Voilà ! En arrivant à l'addresse 4d5137, on a un call 4b6bac qui affiche le nag ... En cliquant sur 'Abandon' (sur le nag), on remarque que le call 554120 à l'addresse 4d5142 ferme le proggy : notez ça dans un coin, ça va nous servir.... Step 2 Bon juste avant notre call qui affiche le nag, on a deux calls : en 4d5129 et en 4d5124 . Celui situé en 4d5129 n'est pas interressant .Par contre le CALL [EBX+08] en 4D5124 est beaucoup plus interressant ... On met un Breakpoint à l'addresse 4D5124 : sous sofitce , BPX 4D5124 . On quitte le prog et on le relance desuite . Il se bloque bien en 4D5124 . On appuie sur F8 pour voir ce qui se passe à l'intérieur et on tombe sur ceci : 015F:004B6AA2 CMP BYTE PTR [005739E8],00 015F:004B6AA9 JZ 004B6AB4 015F:004B6AAB CMP BYTE PTR [00573AB1],00 015F:004B6AB2 JNZ 004B6AB8 015F:004B6AB4 XOR AL,AL --------- non enregistré , on met al à 0 015F:004B6AB6 JMP 004B6AC3 015F:004B6AB8 PUSH 00573AB1 015F:004B6ABD CALL 004B7158 015F:004B6AC2 POP ECX 015F:004B6AC3 RET En traçant la routine avec F10, on s'apperçoit que les deux sauts conditionnels situés en 4b6aa9 et 4b6ab2 ne sont pas effectués . On remark le joli xor al,al en 4b6ab2 ... Si vous vous souvenez du step 1, la sortie de ce call est suivi d'un mov BL,AL (on me le contenu de al dans bl) et ensuite on test bl . Et bien c'est très simple non ? si al=0 alors bl=0 et donc le saut conditionnel qui suit le test bl,bl n'est pas effectué : utilisateur non enregistré ! Et si on remplaçait le XOR AL,AL en 4b6ab4 par un MOV AL,1 ? En plus mov al,1 = xor al,al donc on meme pas besoin d'équilibrer le code...XOR AL,AL=30,00 et MOV AL,1 = B0,01... Execellent ...Relancez le prog et faite la modif avec l'éditeur ASM de softice .Sous softice : A 4B6AB4 .Et on entre MOV AL,1 .Escape pour sortir de l'éditeur ASM de softice et F5 pour continuer . Bingo !Le nag ne s'est pas affiché !Et quand vous allez dans 'option' vous remarquerez que le soft ne vous donne plus la possibilité de rentrer unserial pour débrider le soft (c'est grisé) ... Prenez votre éditeur héxa et faites la modif .Relancez le proggy et là, surprise ... Le soft vous signale qu'il a peut etre été infecté par un virus (héhéhé) !... Putain,'y a un checksum ... Step 3 Bon on panique poa..Quand le prog détecte que son code a été patché, il vous affiche un beau message et le prog se ferme . Comme je l'ai dit plus haut, pas la peine d'essayer de mettre un breakpoint sur MessageBoxA,ça marchera pas ... Par contre dans le step 1, on avait remarqué quelque chose de très interressant : le call qui fermait le prog . CALL 00554120 à l'addresse 4D5142 (voir dernier desassemblage du step 1) .Bon,et ben on va mettre un breakpoint la dessus ... On reprend symbol loader et on rouvre Harmony . Sous softice on tape :BPX 554120.Et on relance avec F5 . De nouveau le message à la con s'affiche, et on click sur 'ok' et softice se déclenche.On a ceci sous les yeux : 015F:00554120 PUSH ESI 015F:00554121 PUSH EDI 015F:00554122 SUB ESP,18 015F:00554125 LEA EDI,[ESP+08] 015F:00554129 MOV ESI,006077F8 015F:0055412E MOVSD 015F:0055412F MOVSD 015F:00554130 MOVSD La routine n'est pas interressante en elle-meme ...Ce qui est interressant,c'est de savoir d'ou elle vient cette routine...Pour ça,c'est très simple.Quand vous êtes à l'addresse 554120, Vous tapez A sous softice pour etre dans l'éditeur Asm . Et on entre RET à la place du push esi . Et on quitte l'éditeur ASm avec escape . Le RET va nous faire sortir de la routine et on va tomber juste derrière le Call 554120 . De cette façon, on va voir où dans le programme cette routine est appellée . Donc on appuie sur F10 pour exécuter le RET et on arrive à ceci : 015F:0054BC68 PUSH 00 015F:0054BC6A CALL 00554120 015F:0054BC6F POP ECX----- on tombe ici en exécutant le RET 015F:0054BC70 RET On continue la trace avec la touche F10 pour finalement arriver la : 015F:0049CD10 PUSH EBX 015F:0049CD11 PUSH ESI 015F:0049CD12 PUSH EBP 015F:0049CD13 SUB ESP,10 015F:0049CD16 MOV EBP,[ESP+20] 015F:0049CD1A CALL 004A85F2 015F:0049CD1F MOV EBX,EAX 015F:0049CD21 MOV EAX,[005E0044]------ On met dans Eax le checksum 1 015F:0049CD26 CMP EAX,[005E009C]------ On compare le checksum 1 avec le checksum calculé now 015F:0049CD2C JNZ 0049CD3B------------ c bon,on saute... 015F:0049CD2E MOV EAX,[005E0130]------ met dans Eax le checksum 2(2ème vérif) 015F:0049CD33 CMP EAX,[005E06C8]------ On compare le checksum 2 avec le checksum calculé now 015F:0049CD39 JZ 0049CD4B------------ c bon,on saute... 015F:0049CD3B PUSH 000000D4 015F:0049CD40 CALL 004A36BD------------ sinon... 015F:0049CD45 POP ECX 015F:0049CD46 CALL 0054BC68-------- le call qui ferme le proggy 015F:0049CD4B PUSH EBX------------- on est arrivé ici . 015F:0049CD4C CALL 004A5E43 015F:0049CD51 TEST AL,AL Bon finalement on a attérit en 49CD4B . Juste en remontant légérement dans le code on voit plein de trucs cools ...En 49CD21 on met le contenu de 5e0044 dans eax . Ensuite on compare eax avec le contenu d'une autre addresse memoire : 5E009C . Cherchez poa plus loin, il est là votre checksum ... On remarque aussi le meme type de routine en 49CD2E : MOV EAX,[005E0130], suivit de CMP EAX,[005E06C8] . Deux routines similaires avec des addresses différentes, donc deux checksums ... Step 4 Pour trouver ou sont calculés les checksum , j'ai utilisé Windasm . On sait que les deux checksums calculés sont stockés en 5E009C et 5E06C8 . Et bien on va cherchez avec Windasm tous les endroits du code où sont appelées ces deux addresses . On va dans l'option 'Search' et on rentre notre chaine hexa A L'ENVERS ! Je rappelle qu'en hexa on met le bit de poids faible devant . Donc 5E009C = 9C005E . On trouve plusieurs références à cette addresse mais une a retenue mon attention : :004D527E 6A04 push 00000004 :004D5280 6A01 push 00000001 :004D5282 689C005E00 push 005E009C---- le premier checksum :004D5287 E894D90600 call 00542C20---- le call qui le calcul :004D528C 83C410 add esp, 00000010 :004D528F 53 push ebx :004D5290 6A04 push 00000004 :004D5292 6A01 push 00000001 :004D5294 68C8065E00 push 005E06C8---- le second checksum :004D5299 E882D90600 call 00542C20---- et le meme call :004D529E 83C410 add esp, 00000010 :004D52A1 6A00 push 00000000 Bon, c'est pas très dur à comprendre : En 4d5280 on sauvegarde le premier checksum. A cet instant 5e009c=0000000000.Une fois le call 542C20, la case mémoire 5e009c calcul du deuxième checksum , c'est le meme call 542C20 ... Et si on vire ces deux calls,les valeurs dans 5e009c et 5e06c8 seront toujours égales à 0, non ? Il ne nous reste plus qu'a trouver l'autre endroit où sont recalculés les checksums ... On fait comme prédemment,on recherche avec windasm 5E0044 (A L'ENVERS !)et on tombe sur ceci : :004D51AE E8EB5CFFFF call 004CAE9E :004D51B3 E8C65DFFFF call 004CAF7E :004D51B8 6830015E00 push 005E0130------le premier checksum :004D51BD 6844005E00 push 005E0044------Et le second ... :004D51C2 E8632AFDFF call 004A7C2A------le call qui crée les checksums Et ben voilà!on y est...Cette fois c'est le call 4a7c2a qui génère les checksums... Il suffit de virer ce call 4a7c2a pour que 5e0130 et 5e0044 soient égals à 0,nan? De cette façon, le prog aura beau comparer les addresses mémoires entre elles, elles seront toujours égales à 0,donc le checksum sera bon...Faites les modifs avec votre éditeur hexa et lancez Harmony ...BiNGo! Y work ... Pour ce crack, prendre son éditeur hexa et se rendre aux offsets suivants: B5EB4 et mettre B0,01 D45C2 et mettre 90,90,90,90,90 D4687 et mettre 90,90,90,90,90 D4699 et mettre 90,90,90,90,90 TaMaMBoLo/CC/SML/SNT