KALEIDOSCOPE 95.1

HTTP://WWW.SYNTRILLIUM.COM

OUTILS: Soft-Ice, Editeur Héxadécimal

DATE PRG:  24/08/97

TAILLE PRG:  281 Ko


         Kaleidoscope 95.1 est un zoli économiseur d'écran. Mais il affiche pleins de phrases qui gachent toute la beauté des courbes. Il y aurait-il un moyen de passer outre ??? ;-)
Allez, c'est parti, on commence evidemment par installer le programme.
On remarque que le programme nous informe que dans 30 jours il serait conseillé de s'enregistrer.
Ceci consiste en une première piste: Que se passe t-il lorsque la date est dépassée..?

Bon, on lance propriétés / écran de veille / on choisit KALEID95 et enfin paramètres.
Là, il y a un boutton REGISTER. On clique dessus, puis un nom est demandé ainsi qu'un munéro de série.

On rentre n'importe quoi, puis on clique sut OK. Là il ne se passe rien.

DEDUCTIONS: Ceci est important, car le programme ne nous donne pas d'indice/de piste pour chercher (en utilisant un Dead Listing) ce qui se passe quand on rentre un mauvais code. En effet, quand il y a un message du genre:'Votre nom/numéro de série n'est pas bon', avec un listing complet (grâce à WDASM) on pourrait rechercher cette prhase, ce qui nous donnerait un point de départ.

Bon, au tout début, j'ai dit qu'il y avait un petit indice au niveau de la date.

Pour vérifier cela, on avance tout simplement la date du système, puis on relance l'application. Il ne se passe rien. Attention, ceci n'est pas une preuve absolue, car certains prog ont leur propre "compteur de jours", mais cela permet d'avoir une petite vérification.

En effet, il se peut que le programme malgrés qu'il soit enregistré puisse continuer de vérifier la date.
Mais bon, nous avons vérifié en avançant la date du système, et puis quelques petites recherches dans le fichier texte fourni par WDASM avec des mots comme 'Days', 'Date' ne nous indique aucune correspondance. On peut alors supposer qu'il n'y a pas de vérification du nombre de jours.

Bon, continuons....

Pour un prg il y a différents moyens de récupérer les données entrées par un utilisateur, en général les fonctions: GetDlgItemTexta et GetWindowTexta sont assez utilisées.

On pose donc un BreakPpoint sur ces deux API. Il se trouve que seule Getdlgitemtexta est utilisée. On appuie sur F11 afin de retomber sur l'adresse qui suit le call.

Voici le code:

:0040208D  FF15ACE44100 Call GetDlgItemTextA  
:00402093  6A0F push 0000000F <-on arrive ici
:00402095  8D4DF0 lea ecx, dword ptr [ebp-10]  
:00402098  51 push ecx  

On relance le programme en tapant G, F5 ou X...

Puis, Soft-Ice réapparait...On rappuie sur F11 et voilà, le prg a récupéré les deux champs d'informations remplis.
On peut même dire que de manière générale :

NOMBRE DE CHAMPS = NOMBRE D'APPELS DE LA FONCTION

Code après le deuxième CALL :
:004020A1  FF15ACE44100 Call GetDlgItemTextA  
:004020A7  8D4DE0 lea ecx, dword ptr [ebp-20] <-On arrive ici...

Bon, le programme doit stocké les valeurs qu'il vient de récupérer quelque part.
Si vous faites une vérification des adresses mémoires [ebp-10] vous remarquerez qu'il s'agit de l'endroit où est stocké le SERIAL que l'on a rentré.
De même avec [ebp-60] qui représente l'endroit où est stocké le NOM que l'on a rentré.

Bon, un petit peu de logique maintenant à propos des différents call qui suivent...

:004020A7  8D4DE0 lea ecx, dword ptr [ebp-20]  
:004020AA  8D55F0 lea edx, dword ptr [ebp-10] SERIAL
:004020AD  51 push ecx  
:004020AE  8D45A0 lea eax, dword ptr [ebp-60] NOM
:004020B1  52 push edx  
:004020B2  50 push eax  
:004020B3  E89AFDFFFF call 00401E52 <-Premier Call
:004020B8  83C40C add esp, 0000000C  
:004020BB  8D4DE0 lea ecx, dword ptr [ebp-20]  
:004020BE  8D55A0 lea edx, dword ptr [ebp-60] NOM
:004020C1  51 push ecx  
:004020C2  52 push edx  
:004020C3  E885080000 call 0040294D <-Deuxième Call

Donc, on peut en conclure qu'il y a des chances pour que le deuxième call soit necessaire à la vérification du NOM/SERIAL
En effet, il y a deux paramètres passés pour le deuxième call, dont celui du NOM...
Il y a donc de fortes raisons de penser que c'est ce call qu'il va falloir analyser de plus près.
De plus, si vous regardez ce qui se passe pour le premier call, en fait le programme calcul un premier résultat à partir du SERIAL. Ce résultat est placé dans [ebp-20].
Puis comme illustré ci-dessus ce premier résultat ainsi que le NOM sont passés en paramètres pour le deuxième CALL.

Bon, il y a autre chose...Regardez la suite...

:004020C8  83C408 add esp, 00000008  
:004020CB  8BC8 mov ecx, eax  
:004020CD  83E103 and ecx, 00000003  
:004020D0  A378814100 mov dword ptr [00418178], eax  
:004020D5  3BC8 cmp ecx, eax  
:004020D7  754A jne 00402123  
:004020D9  85C0 test eax, eax  
:004020DB  7446 je 00402123  

On peut remarquer que EAX est manipulé, et cela juste après le call...Tiens Tiens...
Si vous tracez, vous remarquerez que le prog ne saute pas en 00402123, en revanche le deuxième saut conditionnel lui saute en 00402123.
Bon, on regarde un petit peu en dessous et on trouve des API TRES interessantes...
On va donc tester de changer le cours du programme en changeant ce JE en JNE...Juste pour voir ce qui se passe....Cela veut donc dire que tout ce qui suit est exécuté...

:004020DD  8D45F0 lea eax, dword ptr [ebp-10]  
:004020E0  BF58844100 mov edi, 00418458  
:004020E5  50 push eax  
:004020E6  BE18844100 mov esi, 00418418  
:004020EB  57 push edi  
:004020EC  BBA0B94100 mov ebx, 0041B9A0  
:004020F1  FF159CE34100 Call dword ptr lstrcpyA  
:004020F7  8D4DA0 lea ecx, dword ptr [ebp-60]  
:004020FA  51 push ecx  
:004020FB  56 push esi  
:004020FC  FF159CE34100 Call dword ptr lstrcpyA  
:00402102  53 push ebx  
:00402103  56 push esi  
:00402104  6814864100 push 00418614  
:00402109  BEB8824100 mov esi, 004182B8  
:0040210E  56 push esi  
:0040210F  FF15A0E34100 Call dword ptr WritePrivateProfileStringA  
:00402115  53 push ebx  
:00402116  57 push edi  
:00402117  6808864100 push 00418608  
:0040211C  56 push esi  
:0040211D  FF15A0E34100 Call dword ptr WritePrivateProfileStringA  

Bon, vous devriez vous douter que les API ci-dessus sont assez sympathiques... En effet, si vous regardez les registres qui sont manipulés, vous trouverez:
-Le nom
-Le sérial
-Kaleidoscope 95.1
-control.ini

Cela ne fonctionne pas car le programme n'est pas enregistré. Car le boutton REGISTER est toujours actif, et la case "EDIT MESSAGES" est toujours inactive...
On jette un petit coup d'oeil sur ce fichier control.ini, et comme par magie on trouve une section USERNAME et PASSWORD avec en face les données que l'on a rentré.

DEDUCTION: le passage dans cette partie de programme est obligatoire...Puisque c'est elle qui va se charger d'écrire dans le fichier CONTROL.INI notre USERNAME ainsi que notre PASSWORD.
D'ailleurs, en relancant le prg pour essayer à nouveau de s'enregistrer, vous remarquerez que ce que vous aviez écrit s'y trouve déjà...Plus besoin de retaper le NOM et le SERIAL.

On sait que cela n'a pas fonctionné même si le programme a écrit dans le fichier control.ini le USERNAME et le PASSWORD. Cela veut donc dire que le programme vérifie à chaque fois si ces deux champs suivent bien le schéma de protection, en d'autres mots que le SERIAL correspond bien au NOM....

Revenons en au code qui se trouvaient si dessus...

:004020C3  E885080000 call 0040294D <-deuxième call
:004020C8  83C408 add esp, 00000008  
:004020CB  8BC8 mov ecx, eax  
:004020CD  83E103 and ecx, 00000003  
:004020D0  A378814100 mov dword ptr [00418178], eax  
:004020D5  3BC8 cmp ecx, eax  
:004020D7  754A jne 00402123  
:004020D9  85C0 test eax, eax  
:004020DB  7446 je 00402123  

Inutile de vous dire que le contenu de EAX semble décisif...il est placé dans ECX et c'est lui qui détermine ou non si le PASSWORD et le USERNAME doivent être écrit dans control.ini, c'est donc qu'il a un role important...
On va donc tracer dans ce call...puis voir ce qui se passe pour ce registre (EAX) en particulier...

Voici le code du deuxième call....
On remarquera que cette partie de programme est appelée 4 fois...
Si vous placez un bpx sur cette adresse vous verrez Soft-Ice quand vous passez d'un autre écran
de veille à K95, quand vous cliquez sur Paramètres, quand vous cliquez sur REGISTER et enfin quand vous sortez en cliquant sur OK du menu de K95.

Je n'ai pas mis tous le code du call, car ce qui nous interesse se trouve à la fin.
On cherche les dernières modifications de EAX, celles qui seront encore valides quand le RET sera exécuté.
Et ce sont ces opérations là qui sont interessantes, car ce sont elles qui
conditionnent apparement le reste du prg, du moins l'écriture dans control.ini
Voici le code source fourni grace à WDASM...J'ai écourté le listing of course...

:0040294D  55 push ebp  
:0040294E  8BEC mov ebp, esp  
.....
:00402BF0  8BC6 mov eax, esi  
:00402BF2  F7D0 not eax  
:00402BF4  2345EC and eax, dword ptr [ebp-14]  
:00402BF7  5F pop edi  
:00402BF8  5E pop esi  
:00402BF9  5B pop ebx  
:00402BFA  8BE5 mov esp, ebp  
:00402BFC  5D pop ebp  
:00402BFD  C3 ret  

Bon, alors voici la fin du call.... Ce qui nous interresse c'est EAX...Donc la dernière instruction qui apparait traitant de ce registre c'est :
:00402BF4  2345EC and eax, dword ptr [ebp-14]  

On peut donc en déduire qu'il y a un lien entre EAX et la valeur qui se trouve en [ebp-14]...
On va donc regarder ce lien qui unit ces deux entités....
On va donc remonter le programme (avec WDASM ou encore le descendre avec Soft-Ice) pour savoir ou se trouve la partie de code qui commence à traiter entre [ebp-14] et EAX...
Voici ce que l'on trouve....

:00402BC6  FF1590E34100 Call dword ptr [0041E390]  
:00402BCC  85C0 test eax, eax  
:00402BCE  7507 jne 00402BD7  
:00402BD0  C745EC02000000 mov [ebp-14], 00000002  


Tiens un call suivi d'un cmp sur EAX !!!!
Et en plus un saut conditionnel qui détermine la valeur de [ebp-14] !!!!
Cela fait bcp de choses tout à coup....

:00402BD7  8D45D4 lea eax, dword ptr [ebp-2C]  
:00402BDA  8D4DF8 lea ecx, dword ptr [ebp-08]  
:00402BDD  50 push eax  
:00402BDE  51 push ecx  
:00402BDF  FF1590E34100 Call dword ptr [0041E390]  
:00402BE5  85C0 test eax, eax  
:00402BE7  7507 jne 00402BF0  
:00402BE9  C745EC01000000 mov [ebp-14], 00000001  


Idem pour ici...un CALL, un cmp et un saut conditionnel qui détermine la valeur de [ebp-14]... Bon...mais quelle est la différence entre 1 et 2 ???
Qu'est que cela change pour le programme??? Est qu'une de ces deux valeurs veut dire 'OK, le SERIAL est bon' ????
Bon...si vous tracez le programme, vous vous rendrez compte qu'aucune de ces deux valeurs n'est placé dans [ebp-14]....
Tiens...Mais alors qu'est-ce qu'il y a dans cet emplacement mémoire??
Un petit D ebp-14 pour en avoir le coeur net...Il y a 0
Mais si vous regardez les parties de code qui concerne [ebp-14] dans le code qui correspond au call étudié, vous ne trouverez que 4 réponses:

:00402BD0  C745EC02000000 mov [ebp-14], 00000002  
ainsi que
:00402BE9  C745EC01000000 mov [ebp-14], 00000001  
ainsi que
:00402BF4  2345EC and eax, dword ptr [ebp-14]  
et enfin....
:00402953  C745EC00000000 mov [ebp-14], 00000000  


Cette dernière correspondance de code se trouve au tout début du call...
Donc [ebp-14] est initialisé au tout début puis modifié si besoin est....
Il ne reste plus qu'à tester avec [ebp-14]=02 pour voir ce que cela fait...
Pour cela on change JNE 00402BD7 en JE 00402bd7 puis on relance le prog....
Et oh!!! cela fonctionne...Votre petit nom apparait en bas à droite de l'écran, on peut taper des messages...et même avoir acces aux options AUDIO...
Bon...mais alors...la valeur [ebp-14]=01 c'est pourquoi????
Pour en avoir le coeur net, on ressort du panneau d'affichage, puis on relance propriétés puis on modifie JNE 00402BF0 en JE 00402bf0...

On relance le prog...Mais là aussi cela fonctionne....Hum...on peut aussi écrire des messages... Ah...Mais quand on appuie sur le boutton AUDIO un petit message nous indique gentillement que le SERIAL que l'on vient de rentrer n'est pas valide pour avoir accès aux fonctions Audio...
C'est EXCELLENT!!!
On sait donc maintenant que lorsque [ebp-14]=01 cela veut dont dire que le programme pense que le SERIAL tapé n'est pas valide pour les options Audio, alors que lorsque [ebp-14]= 02 le SERIAL est valide pour toutes les options....

Voilà, voilà....il ne vous reste plus qu'à faire un patch pour que [ebp-14] soit tout le temps égal à 02...Pour cela, il suffit de s'occuper du fichier Kaleid95.Scr....

Plusieurs méthodes s'offrent à vous:
-Modifiez le début du call du style:
Mov EAX,2
ret / jmp fin

-modifiez pour que [ebp-14]=2 tout le temps en modifiant JNE en JE

-Pour les autres à vous de voir...

Have Phun...
<-[ ALSINDOR ]->

alsindor(arobase)yahoo(point)com