ScrnSaveSwitch/Plus ver 3.10

Outils: W32dasm89 Temps: 10 minutes

Technique: Dead listing



De l'avantage du Dead Listing

Quand vous aurez passé du temps à chercher dans soft-ice où peut bien se trouver le call test_du_code, le call validité_du_code, ou l'écho d'un code généré par le programme,
rappelez vous de ce schéma de protection...

Voici un exemple de programme doublement intéressant. Premièrement parce qu'il met en valeur l'avantage de Dead Listing, et deuxièmement parce que son schéma de contrôle de la validité du code est à la fois très simple, et assez courant.


1- Soyez curieux

Après avoir découvert ce que peut faire le programme (la phase prise en main), et tenter votre chance par une approche dynamique sous Soft-Ice, vous finirez par lancer W32dasm.

Premier réflexe, " les string data references "

"Congratulations! ScrnSaveSwitch/Plus "
"Sorry. The registration key you "
"SSSwitch+ Registration"
"system.ini"--> tiens, pourquoi donc!

Voici les références que j'ai retenues, et pas des moindres...


2- Soyez malin

Que cherchez-vous?

Un branchement qui pourrait aller en " Congratulations! "

Donc rendez-vous à cette adresse. Double-clic dans la boite des " string data references " sur Congratulations, et vous voilà en 004032A8.

* Possible StringData Ref from Data Obj ->"SSSwitch+ Registration"
                                  |
:004032A3 6844C34000              push 0040C344

* Possible StringData Ref from Data Obj ->"Congratulations!  ScrnSaveSwitch/Plus "
                                        ->"is now registered,"
                                  |
:004032A8 68C8C24000              push 0040C2C8
:004032AD 51                      push ecx 


Maintenant cherchons un peu au dessus si il n'y a pas un branchement qui l'évite...

Et quelques lignes au dessus, des tests et des branchements, vous allez en trouver...

* Reference To: KERNEL32.lstrlenA, Ord:0275h
:0040321C FF1508F44000 Call dword ptr [0040F408]

:00403222 83F805                  cmp eax, 00000005
:00403225 0F8596000000            jne 004032C1
:0040322B 8A0F                    mov cl, byte ptr [edi]
:0040322D 80F932                  cmp cl, 32
:00403230 0F858B000000            jne 004032C1
:00403236 807F0237                cmp byte ptr [edi+02], 37
:0040323A 0F8581000000            jne 004032C1
:00403240 8A4704                  mov al, byte ptr [edi+04]
:00403243 3C36                    cmp al, 36
:00403245 757A                    jne 004032C1
:00403247 384F01                  cmp byte ptr [edi+01], cl
:0040324A 7575                    jne 004032C1
:0040324C 384703                  cmp byte ptr [edi+03], al
:0040324F 7570                    jne 004032C1
:00403251 8D442408                lea eax, dword ptr [esp+08]
:00403255 68EE580000              push 000058EE
:0040325A C7462401000000          mov [esi+24], 00000001


Avez-vous une idée de l'utilité de ces test?

Ca n'est ni plus ni moins que les contrôles de validité de votre numéro de série...

A quoi pouvait-on le reconnaître?

A plusieurs signes:

- le cmp eax, 00000005 --> le nombre de caractères entrés est-il égale à 5

- après la majorité des tests: un jne 004032C1 --> si pas égale va en code invalide

- à la fin des tests: mov [esi+24], 00000001 --> si tout Ok alors [esi+24]=1
c'est le classique si_le_code_est_ok alors met une valeur à 1


Mais quel est le code exactement?

- [edi] contient votre numéro de série. Le premier caractère est mis dans cl, et comparé avec 32
--> avec un convertisseur hexadécimale 32 (héxa) = 2 (décimale)

- le troisième caractère [edi+2] est comparé avec 37 (3 décimale)

- le cinquième caractère [edi+4] est mis dans al, et comparé avec 36 (5 décimale)

- le deuxième caractère est comparé avec cl (qui est sensé valoir [edi]=32h)

- le quatrième caractère est comparé avec al (qui est sensé valoir [edi+4]=36h)

Vous aurez donc un numéro de série égale à 2 2 7 6 6.

Et au final, vous aurez mis 10 minutes à trouver le code, sans Soft-ice, sans modification de l'exécutable. Sympa, non ?
 

Bonne Journée

Christal