|
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 ?
|