EXEMPLE DE REVERSE-ENGEENERING SUR UNE DLL - COMMENT RECONFIGURER LE COMPORTEMENT D'EXPLORER.EXE EN MODIFIANT QUELQUES FONCTIONS DANS LA BIBLIOTHÈQUE SHELL32.DLL

Par -NeuRaL_NoiSE




Salut tout le monde!

Combien de fois avez-vous pensé "la vache ce serait super si je pouvais supprimer des fichiers Rom du disque-dur sans avoir à les passer d'abord par la poubelle... Je pourrais mettre l'option 'Move To Recycle' (dans les préférences de la poubelle) mais alors je n'aurais plus une chance de choisir si je veux effacer le fichier ou le déplacer de la poubelle(trashcan) ... ou bien je pourrais appuyer sur 'Shift' et 'Suppr' pour effacer le fichier du disque, mais alors moi pauvre gandin neural_n je n'aurait plus de chance d'écrire ce tutorial...??? Et bien, si vous avez ce problème (hmmm :), lisez ce texte :)

À ce point, laissez-moi expliquer une petite chose et me laisser me dégager de mes responsabilités :

FIRST : Si vous agissez exactement comme je vais vous guider tout au long de ce tut, ne me considérez pas responsable d'aucun problème d'OS qui pourrait se produire sur votre disque dur (La fonction "Suppr" de votre Explorateur Windows ne sera plus aussi sûr que précédemment! :)

SECOND : Ce Tutorial est plus une réversion qu'un véritable Crack... si vous lisez dans l'espoir de découvrir comment déplomber certains jeux ou app(des programmes) je dois vous dire qu'hélas vous ne trouverez rien de tel ici. Si vous êtes à la recherche de ce genre de trucs, référez-vous plutôt aux fantastiques pages qu'on trouve un peu partout sur le Web (essayez tout d'abord les liens à partir du site de +Fravia, fravia.org).

THIRD : J'ai eu un petit problème en écrivant ce Tutorial. Je suis italien et évidemment ma version de Window$ est en Italien... shell32.dll étant une dll système, sa langue sera différente d'un pays à un autre. Donc je ne peux pas vous assurer que ni le VA (l'Adresse Virtuelle: c'est ce qui est pris pour référence quand on mappe un fichier en mémoire. C'est en général 00400000h pour des *.exe mais 0BFF00000h pour Kernel.dll par exemple) ni les offsets que j'écris dans ce tut seront les mêmes sur votre ordinateur (et même je pense que ce ne sera pas le cas)... cependant vous devriez être capables de suivre la manip en imprimant le texte et ensuite suivre votre copie(version) désassemblée à l'écran, ce n'est pas une tâche si difficile. Je dois encore dire deux choses très IMPORTANTES :

* CE TUTORIAL EST UNIQUEMENT ÉCRIT POUR *WINDOWS 95* - JE PENSE VRAIMENT QU'AVEC WINDOWS 98 LE FICHIER SHELL32.DLL EST DIFFÉRENT (MÊME SI je n'en suis pas sûr). MA PROPRE VERSION DE WINDOWS EST LA 4.00.950 b

* POUR SUIVRE CE TUTORIAL, VOUS *DEVEZ* AVOIR MIS L'OPTION 'DÉPLACER LES FICHIERS VERS LA POUBELLE' AU LIEU DE 'EFFACER DU DISQUE CES FICHIERS' (VOUS POUVEZ CONFIGUREZ CA DANS LES PRÉFÉRENCES DE LA POUBELLE). DANS LES VERSIONS ITALIENNES DE WINDOWS, VOUS AVEZ UNE BOÎTE DE DIALOGUE DIFFÉRENTE SELON QUE CETTE OPTION SOIT "ACTIVÉE ou DÉSACTIVÉE". UN AMI M'A DIT QU'EN ANGLAIS ON A TOUJOURS LA MÊME DIALOGBOX, QUE L'OPTION SOIT COCHÉE OU NON. C'EST ASSEZ MYSTÉRIEUX EN RÉALITÉ :)
Pour nous les p'tits Français c'est : "Ne pas déplacer les fichiers vers le Corbeille. Les supprimer en cas d'effacement (Non coché)".

Tout est dit......Let's Go!!!

Donc... comme vous l'avez sûrement remarqué dans l'intro, dans ce tut je vais vous montrer comment créer cette situation dans laquelle lorsque vous choisirez l'option de ne pas passer les fichiers à effacer au dossier de Recyclage (de la corbeille), l'explorateur Window$ EFFACERA physiquement les fichiers de votre HD.
Aimeriez-vous avoir une DialogBox avec les 3 options suivantes, 1=MOVE TO RECYCLED, 2=ERASE FROM DISK et 3=CANCEL OPERATION ?.... je parle de combiner d'une manière assez mystérieuse, ces trois choses sans avoir besoin de jouer avec les préférences de la Corbeille à chaque instant, ou bien devoir taper sur la touche 'Shift' avec d'autres.
Ok, 'assez bavardés'....


Certaines personnes pensent qu'il n'y a qu'explorer.exe qui fasse le boulot de (suppression de machins sur le HD, copier des fichiers et cetera), mais c'est pas tout à fait vrai. Le code que nous allons modifier réside dans la bibliothèque SHELL32.dll ... une dll (Bibliothèque de Liaison Dynamique ou 'Dynamic Link Library') est un ensemble de fonctions qui peuvent êtres mises à disposition de fichiers exécutables (dans notre cas explorer.exe) et qui sont chargées à chaque fois que l'exécutable a besoin d'une de ses fonctions, puis lorsqu'il n'en a plus besoin il décharge cette dll et cetera). La dll est aussi déchargée quand vous fermez le dernier programme qui l'utilisait. Dans notre cas, shell32.dll est toujours présente, dès la première copie d'explorateur (qui est lancé par Windows comme vous le savez) qui est chargé en mémoire et vous ne pouvez pas refermer cette copie d'explorateur, parce que sinon ça fermerait notre session Windows. Shell32.dll est dans le répertoire WINDOWS\SYSTEM de votre PC. Pas besoin de grands moyens, nous traiterons la dll comme un exe tout à fait normal. Les outils que nous allons utiliser sont des classiques :

* W32Dasm v8.93
* SoftICE v3.24
* HIEW v6.01

Ouvrez Shell32.dll avec W32dasm .... Remaquez bien l'image base... qui n'est pas 00400000h comme d'habitude (comme la plupart de .exe classiques) mais 7FDB0000h. Bon, ouvrez maintenant Explorer.exe et créez un 'Dossier Temporaire', remplissez-le avec des fichiers inutiles copiés dans d'autres Répertoires. SOYEZ ATTENTIF A NE PAS OPERER SUR DES RÉPERTOIRES DÉJÀ PRÉSENTENT SUR VOTRE DISQUE DUR, PARCE QUE LES CHANCES DE PERDRE VOS DONNÉES SONT TRÈS GRANDES!
Ok... prenez maintenant un fichier au hasard dans votre dossier factice et choisissez 'Supprimer' (clique droit sur le FICHIER = menu contextuel qui apparaît quand vous cliquez sur le bouton de la souris juste sur le fichier choisi). Vous obtenez une DialogBox agréable qui vous demande si vous voulez ou non supprimer le fichier... bon, nous avons trouvé notre accroche dans le code. A première vue, l'API à breaker est DialogBoxParamA. Donc c'est ce qu'on va faire... choisissez "NON". Passez à SoftICE et écrivez "BPX DialogBoxParamA". Ressortez de SoftIce.
Choisissez-en un nouveau et "supprimez-le", Sice ressurgit. Appuyer sur F12 et vous verrez que la DialogBox réapparaît de nouveau sur votre écran... choisissez "OUI" et Sice surgira encore une fois et vous serez à la ligne de code du Call de cette DialogBox, qui est le suivant :

* Reference To: USER32.DialogBoxParamA, Ord:0084h
                                  |
:7FDE2505 FF15E83DE17F            Call dword ptr [7FE13DE8]
:7FDE250B 83F8FF                  cmp eax, FFFFFFFF        ; <--VOUS TOMBEREZ ICI.

Jetez un coup d'oeil au registre EAX, qui, comme vous le savez, contient la valeur de retour de CHAQUE fonction API. Notez qu'il est à 6. Appuyez sur F5 et votre fichier sera déplacé vers 'Recycled' (la Corbeille). Choisissez maintenant 'Supprimer' de nouveau. Vous remarquerez que si vous répondez "NON", la valeur en retour dans EAX après le Call DialogBoxParamA est 7. Répétez l'opération, mais appuyez cette fois-ci sur la touche 'Echap' de votre clavier. La valeur en retour sera 2. À ce point nous pouvons en tirer un petit tableau :
 VALEUR EN RETOUR DU CALL DialogBoxParamA  |TOUCHE/BOUTON SÉLECTIONNÉ |   ** SIGNIFICATION **
___________________________________________|__________________________|________________________
                                           |                          |
          00000006                         |BOUTON "OUI" DE LA DIALOG | DEPLACE LE FICHIER VERS LA CORBEILLE
___________________________________________|__________________________|________________________
                                           |                          |
          00000007                         |BOUTON "NON" DE LA DIALOG | ABANDONNE L'OPÉRATION 
___________________________________________|__________________________|________________________
                                           |                          |
          00000002                         | TOUCHE "ESC" DU CLAVIER  | ABANDONNE L'OPÉRATION 
___________________________________________|__________________________|________________________


Hmm ..... ici il y a des cases qui sont des répétitions inutiles.... deux valeurs de retour ont la même fonction... Ce serait beaucoup mieux si nous pouvions modifier la fonction du bouton "NON" de la boîte de dialogue ... Peut-être même la réexpédier vers l'ÉLIMINATION PHYSIQUE du fichier du disque.... ainsi, sans énormes changements du code nous obtiendrions une situation beaucoup plus intéressante :
"OUI" déplacerait le fichier vers dossier 'Corbeille',
"Non" l'éliminerait physiquement du disque, et ; <-- Cette situation est plus que dangeureuse en temps normal.
"ESC" annulerait l'opération. On va voir ce qu'on peut faire :) ; <-- il vaudrait mieux faire ça sur 'ESC' à mon avis

Nous tracerons avec F10 dans Sice, avant que nous n'arrivions ici :

* Referenced by a JUMP at Addresses:
|:7FDE24ED(U), :7FDE2519(C), :7FDE2524(U)
|
:7FDE252B 83FE06                  cmp esi, 00000006         ; ESI CONTIENT LA VALEUR EN RETOUR
:7FDE252E 751E                    jne 7FDE254E              ; SI VOUS NE CHOISISSEZ PAS "OUI"
:7FDE2530 8B452C                  mov eax, dword ptr [ebp+2C]  
:7FDE2533 8B00                    mov eax, dword ptr [eax]  ; OBJECT DESCRIPTOR'S INITIAL BYTE
:7FDE2535 A810                    test al, 10               ; VERIFIE SI L'OBJET EST UN REP    
:7FDE2537 7515                    jne 7FDE254E              ; SAUT SI PAS (10=REP, 20=FICHIER)
:7FDE2539 A805                    test al, 05               ; IF C'EST UN FICHIER....
:7FDE253B 7411                    je 7FDE254E               ; SAUT OK :)    

Stop! Nous avons assez d'infos pour comprendre que la procédure continuera, si tout est OK (si on a choisit 'OUI'), à l'adresse 7FDE254E... où nous trouvons cette ligne de code :
:7FDE254E 8BC6                    mov eax, esi
La valeur en retour est mise dans eax de nouveau, très bien... nous sommes sur le bon chemin... le contrôle précédent était uniquement nécessaire que pour vérifier la mémoire et les problèmes d'handle... s'il y avait eu un problème, une valeur factice aurait été laissée dans eax et les opérations suivantes n'auraient pas été exécutées. Comme vous le verrez, Shell32.dll est PLEINS de contrôles de ce genre... vous pouvez appeler ça 'le Bon Vieux Code Micro$oft Superflu' (TM) :)

On va continuer à tracer avec SoftICE après avoir exécuté le "ret 028"... nous nous trouverons ici :
:7FDE4093 E810E1FFFF              call 7FDE21A8         ; <-- On 'Revient' de ce CALL
:7FDE4098 8BF8                    mov edi, eax          ; <-- On est ici

* Referenced by a JUMP at Address:
|:7FDE4064(C)
|
:7FDE409A 83FF06                  cmp edi, 00000006        ; ENCORE...VERIF SI ON PRESSE "OUI"     
:7FDE409D 7540                    jne 7FDE40DF             ; SINON ON AGIT EN CONSEQUENCE
:7FDE409F 8B442434                mov eax, dword ptr [esp+34] 
:7FDE40A3 8B08                    mov ecx, dword ptr [eax] ; OBJ. DESCR. INITIAL BYTE IN ECX
:7FDE40A5 F6C110                  test cl, 10              ; AVONS NOUS UN FICHIER ICI??
:7FDE40A8 7435                    je 7FDE40DF              ; OUI! SAUT!
:7FDE40AA 81FD00010000            cmp ebp, 00000100        ; OU UN REPERTOIRE(dossier)?? (100=REPERTOIRE)
:7FDE40B0 7408                    je 7FDE40BA
:7FDE40B2 81FD00030000            cmp ebp, 00000300        ; (300=FILE)
:7FDE40B8 7525                    jne 7FDE40DF

Pfff.... Encore des contrôles... (C'est fatiguant, Nan ?, et y en a d'autres à venir :)... maintenant notre jne 409Dh ne sautera pas si nous avons choisi "OUI", alors que nous prendrons celui du 40A8h pour des raisons évidentes (nous avons choisi un fichier :)... maintenant je dois vous dire une chose. Nous sommes sur le point de faire des trucs VRAIMENT dangereux pour nos données. C'est pourquoi dans ce tut j'ai préféré agir QUE sur des modifications du code qui exécute l'élimination de SIMPLE FICHIER. Si vous voulez supprimer PLUS d'un fichier à la fois, ou un dossier en entier, vous devrez quand même utiliser 'Shift' ou bien passer par la Corbeille, sinon le fichier sera effacé du disque en appuyant SEULEMENT sur "Non" lorsque vous essayerez d'éliminer UN simple fichier. Cependant, si vous pensez quand même modifier le code qui s'occupe des éliminations multiples, je vous donnerai un petit conseil : la boîte de dialogue est différente (au moins ici en Italie :D) quand vous voulez supprimer plusieurs fichiers à la fois... C'est pourquoi, un bpx sur DialogBoxParamA fera surgir SICE dans une autre zone du code et vous trouverez que c'est plutôt simple de faire la même chose (ou un truc similaire) que ce que nous allons faire ici. Un autre petit conseil : quand vous supprimez plus d'un fichier à la fois, vous pouvez être sûr que de 'nopper' le "mov eax, 2" rendra cette routine plus rapide soit quand vous appuyerez sur "NON" soit quand vous appuyez sur "ESC"... En noppant le mov vous aurez toujours une différence entre les deux valeurs en retour et ainsi vous serez capables de les traiter en conséquence dans la procédure de la DialogBox. Le seul problème ici c'est que je ne pense pas qu'il y ait assez d'espace pour insérer votre propre code à cet endroit, comme nous aurons encore une valeur (mon dieu, où est-ce que Bill recrute ses programmeurs ?! :) et la valeur "7" ne sera pas traité. C'est pourquoi, il se pourrait bien que vous soyez obligé d'augmenter la taille de la dernière section du PE Header pour ajouter votre code à cet endroit, mais hé, ça c'est une autre histoire :D - Je pense à l'écriture d'un Tutorial justement pour ça aussi. Enfin bon, j'ai besoin d'un peu de motivation... Pour me bouger un peu il faudrait m'écrire et me dire si je dois ou non :))

Indépendamment, on va revenir à notre session de réverse :)

Les sauts nous dirigent vers le bout de code suivant, où notre valeur de retour sera analysé, au cas où nous choisissons un fichier (autrement dit, ce à quoi nous nous intéressons :)... ça commence en 7FDE40DF :
:7FDE40DF 83FF02                  cmp edi, 00000002
:7FDE40E2 741A                    je 7FDE40FE
:7FDE40E4 83FF07                  cmp edi, 00000007
:7FDE40E7 7415                    je 7FDE40FE
:7FDE40E9 837C241C00              cmp dword ptr [esp+1C], 00000000
:7FDE40EE 740E                    je 7FDE40FE
:7FDE40F0 FF742424                push [esp+24]
:7FDE40F4 56                      push esi
:7FDE40F5 FF742434                push [esp+34]
:7FDE40F9 E845EEFFFF              call 7FDE2F43

* Referenced by a JUMP at Addresses:
|:7FDE40E2(C), :7FDE40E7(C), :7FDE40EE(C)
|
:7FDE40FE 8BC7                    mov eax, edi
:7FDE4100 5D                      pop ebp
:7FDE4101 5F                      pop edi
:7FDE4102 5E                      pop esi
:7FDE4103 5B                      pop ebx
:7FDE4104 83C418                  add esp, 00000018
:7FDE4107 C22400                  ret 0024

Encore trois contrôles... si nous tapons sur "ESC" ou si on choisi "NON", le programme sortira du Call (avec le ret 024 en 4107), en gardant cette valeur dans le registre, sinon il exécute une autre partie du code, pour avoir les infos nécessaires pour éliminer le fichier (avec le Call qui est en 40F9).
On va continuer à tracer avec SoftICE et retrouver le Caller....

:7FDE4952 E8A3F6FFFF              call 7FDE3FFA    ; <--ON ARRIVE DE CE CALL     
:7FDE4957 83F802                  cmp eax, 00000002 ; A-T-ON PRESSÉ "ESC" ?
:7FDE495A 0F847F080000            je 7FDE51DF        
:7FDE4960 83F806                  cmp eax, 00000006 ; A-T-ON CHOISIT "OUI" ?
:7FDE4963 743F                    je 7FDE49A4
:7FDE4965 83F807                  cmp eax, 00000007 ; A-T-ON CHOISIT "NON" ?
:7FDE4968 0F8486070000            je 7FDE50F4

* Referenced by a JUMP at Addresses:
|:7FDE48D1(U), :7FDE50AF(U)
|
:7FDE496E 8945FC                  mov dword ptr [ebp-04], eax ; DÉSOLÉ, MAIS ON A QQCHOSE DE
                                                              ; FAUX ICI...SI EAX N'EST PAS UNE
                                                              ; DES 3 VALEURS PRÉCÉDANTES, 
                                                              ; ON A UN HANDLE INVALIDE!
                                                              ; ON SE DIRIGE VERS L'AFFICHAGE
                                                              ; DU MESSAGE D'ERREUR!
Wohho! Voici du code intéressant ... le jeu en vaut la chandelle :D La chance est de notre côté... nous avons trois branches pour trois options potentielles... maintenant le problème c'est de suivre le 'je' relatif au bouton "NON" qui part vers une autre partie de code, laquelle ÉLIMINERA le fichier du disque... nous n'avons pas besoin de gaspiller de temps avec la taille brute et virtuelle des sections PE et c'est un gros avantage!

Pour le moment, on va continuer à tracer, juste pour avoir une idée sur la façon dont se déroulent les choses... notre course déviera en 4963 si dans notre cas nous avons choisi "OUI"... Et hop, nous nous retrouverons ici :

:7FDE49A4 8B4DF4                  mov ecx, dword ptr [ebp-0C]
:7FDE49A7 8B01                    mov eax, dword ptr [ecx]
:7FDE49A9 0B45F8                  or eax, dword ptr [ebp-08]
:7FDE49AC 3D01020000              cmp eax, 00000201
:7FDE49B1 7725                    ja 7FDE49D8 ; ON PREND CE CHEMIN SI CE N'EST PAS UN REPERTOIRE(dossier).
:7FDE49B3 0F8402020000            je 7FDE4BBB
:7FDE49B9 3D01010000              cmp eax, 00000101
:7FDE49BE 0F848E000000            je 7FDE4A52
:7FDE49C4 3D02010000              cmp eax, 00000102
:7FDE49C9 0F84FA000000            je 7FDE4AC9
:7FDE49CF 3D03010000              cmp eax, 00000103
:7FDE49D4 7447                    je 7FDE4A1D
:7FDE49D6 EB3E                    jmp 7FDE4A16
Ne soyez pas effrayé par le nombre de sauts, si tout est ok vous prendrez le JA en 49B1 (vous ne le prendrez pas si vous essayez de supprimer un dossier, mais aussitôt qu'il essayera de supprimer le premier fichier de ce dossier, on prendra ce JA), qui vous amènera ici :
:7FDE49D8 3D02020000              cmp eax, 00000202
:7FDE49DD 743E                    je 7FDE4A1D
:7FDE49DF 3D03020000              cmp eax, 00000203
:7FDE49E4 0F84D1010000            je 7FDE4BBB
:7FDE49EA 3D01030000              cmp eax, 00000301
:7FDE49EF 0F84F0030000            je 7FDE4DE5
:7FDE49F5 3D02030000              cmp eax, 00000302
:7FDE49FA 0F843C020000            je 7FDE4C3C
:7FDE4A00 3D03030000              cmp eax, 00000303
:7FDE4A05 0F8444030000            je 7FDE4D4F    ; ON SAUT SI TOUT EST OK (bouton 'OUI').
:7FDE4A0B 3D04030000              cmp eax, 00000304
:7FDE4A10 0F8499030000            je 7FDE4DAF
Hmmm.... On peut être sûr que ceux-ci sont encore plus de contrôles pour les caractéristiques du fichier... on va les laisser... le seul saut que nous prendrons toujours est celui en 4A05. Voici où il nous mène :
:7FDE4D4F 8B4730                  mov eax, dword ptr [edi+30] 
:7FDE4D52 85C0                    test eax, eax
:7FDE4D54 741C                    je 7FDE4D72
:7FDE4D56 53                      push ebx
:7FDE4D57 8D4DFC                  lea ecx, dword ptr [ebp-04]
:7FDE4D5A 6A00                    push 00000000
:7FDE4D5C 8D95E4FDFFFF            lea edx, dword ptr [ebp+FFFFFDE4]
:7FDE4D62 50                      push eax
:7FDE4D63 51                      push ecx
:7FDE4D64 52                      push edx
:7FDE4D65 E815690000              call 7FDEB67F        ; "RECYCLED ON/OFF ?" VERIFIE SI LE EAX DU
:7FDE4D6A 85C0                    test eax, eax        ; CALL EST A *ZERO*, SI LE RECYCLED EST *OFF*
:7FDE4D6C 0F85ABFCFFFF            jne 7FDE4A1D         ; ON OBTIENT RECYCLED "ON", SAUTE ET  
                                                       ; DEPLACE LE FICHIER DEDANS (Recycled, Corbeille)
* Referenced by a JUMP at Address:
|:7FDE4D54(C)
|
:7FDE4D72 8D85E4FDFFFF            lea eax, dword ptr [ebp+FFFFFDE4] ; SINON ON PROCÈDE A 
:7FDE4D78 50                      push eax                          ; L'ÉLIMINATION PHYSIQUE 
* Reference To: SHELL32.Ordinal:00A4                                ; DU FICHIER!    
                                  |
:7FDE4D79 E8C7C3FFFF              call 7FDE1145
:7FDE4D7E 85C0                    test eax, eax
:7FDE4D80 7409                    je 7FDE4D8B
:7FDE4D82 C745FC00000000          mov [ebp-04], 00000000
:7FDE4D89 EB09                    jmp 7FDE4D94

Heh.... On dirait qu'on l'a trouvé :)
Tout dépend de la "vérif des options" appelée en 4D65... Si la valeur en retour du Call (dans eax) est ZÉRO, le fichier sera physiquement enlevé, sinon il sera déplacé dans la Corbeille. Vous pouvez chercher ce que fait ce Call en le traçant... j'ai personnellement noté chaque différence que j'ai trouvée entre les exéctutions de l'option "déplacé-recylé" (dans les préférences réutilisées) activé puis éteinte.... Si ça vous intéresse, la zone de code à laquelle le destin d'eax est décidé est celle des trois sauts en B660, B666 et B66C. Le xor mettera EAX à zéro et nous donnera en retour la valeur zéro, évitant l'exécution de n'importe quel code dans le Call (qui est nécessaire pour préparer l'opération de déplacement du fichier vers la Corbeille). Ainsi, maintenant nous savons que pour ÉLIMINER PHYSIQUEMENT le fichier, notre programme devra exécuter le code qui commence en 4D72... Hé, mais que vois-je ici ?? Un saut qui arrive justement là ?? hmm, on va mettre un bpx sur ce saut (7FDE4D54)... étrange, il ne saute jamais... ni avec 'Recycled' "OFF", ni avec 'Recycled' "ON"... oh! J'avais presque oublié le 'Bon Vieux Code Redondant (TM) de Micro$oft' :)))
Sans plaisanter maintenant, je dois dire que ce saut inutile (qui sautera peut-être une fois sur mille?;) m'a fait penser à quelque chose... S'il y avait un saut qui puisse éviter tout le morceau précédent de code (celui avec les contrôles), alors il n'y aurait plus aucun doute sur la signification du Call en 4D65 et de son inutilité... Ne vous inquiétez pas ni des flags ni du code de vérif APRÈS QUE "le contrôle d'option" ait été appelé... On peut avoir accès au morceau de code qui efface le fichier du disque, même en ÉVITANT totalement le contrôle.... ça a été démontré par la pratique que des programmeurs emmerdants mettent un saut dans le code qui fait exactement que nous allons faire maintenant... la FUITE des contrôles... c'est juste une question de logique et d'intuition....
La solution à ce problème est très simple, on modifie le saut relatif au bouton "NON" vers une partie qui exécute DIRECTEMENT le code 7FDE4D72, au lieu de passer par ses fonctions inutiles! Ainsi, la première étape c'est de FAIRE UNE COPIE DE SECOURS DE VOTRE FICHIER SHELL32.dll, en l'appelant shell32.bak par exemple. Ensuite, on le copiera aussi en un nouveau fichier qu'on patchera physiquement (on ne peut pas patcher shell32.dll si il est déjà utilisé par Windows). Maintenant nous avons 3 fichiers, shell32.dll, shell32.bak et, disons, shell32.new.

Logiquement on devrait noter les deux offsets (un pour le saut relatif au bouton "NON" et un pour le point où nous souhaitons qu'il saute), et ouvrir HIEW pour le patch comme dans n'importe quel autre cas.... Mais au lieu de cela, la procédure que nous devons suivre est différente. Si vous essayez cette approche, lorsque vous redémarrerez Windows avec le nouveau shell32.dll, en appuyant sur le "Non" de la DialogBox vous aurez l'illusion amère d'un GPF.... Pourquoi?? L'explication est vraiment simple, mais la raison hélas pas (pas pour moi du moins :). J'aimerais que quelqu'un me dise pourquoi ce problème se produit, de toute façon maintenant je vais vous expliquer QUEL est ce problème : lorsqu'on patch shell32.dll avec HIEW, l'offset où on dit qu'il faut sauter est en 34172h. Mais hélas, pendant l'exécution du saut en "situation réelle:)", la dll sautera au code *VIRTUAL ADDRESS* 34172h, et NON PAS à l' *OFFSET* 34172h (qui est relatif à l'adresse virtuelle 7FDE4D72h).... hmmm c'est un problème désagréable vous ne pensez pas ?? ouai, un peu de logique et c'est assez pour résoudre ça... Ce que vous ne devez jamais oublier de la puissance de SoftICE... c'est qu'on peut s'en servir pour insérer du CODE (si vous ne l'avez pas déjà d'origine)... cette option vous permettra de voir les octets de chaque ligne du moindre code que vous tracez. Mettez maintenant un bpx sur 7FDE4968 (le 'je' relatif au bouton "NON")... pour breaker sur le 'je' de la branche 'NON' de notre DialogBoxParamA habituelle. Ensuite on tape F12 pour arriver dans le code de la DLL shell32.dll. Une fois qu'on à mis le bpx, on appuie sur le "NON" de la boîte de dialogue et on reste bloqué sur notre fidèle ligne du 'je' à l'endroit où on a placé le Break Point. Si on continue l'exécution, on cause un GPF. On appuie sur la touche "A" (l'instruction d'assemblage de SoftIce), pour que Sice nous donne un agréable prompt(curseur) avec lequel on va pouvoir insérer l'instruction d'assemblage qu'on souhaite et ça remplacera le code actuel. Écrivez juste "je 7FDE4D72" et vous noterez un changement des octets à gauche de l'instruction. Prenez une feuille et notez ces octets. Sur ma version shell32.dll les octets sont les suivants : 0F8404040000.
Une fois que vous avez fait ça, refermez tout et ouvrez votre fichier provisoire shell32.new avec HIEW... Allez à l'offset 33D68h (F5), appuyez sur F3 et insérez le EXACTEMENT LA MÊME SUITE d'octets que SoftICE vous a donné précédemment.
Sauvegardez le fichier, le redémarrez en mode DOS, allez dans Windows\System et copiez SHELL32.NEW en SHELL32.DLL (qui est maintenant réécrit, et c'est possible cette fois puisque Windows n'est pas exécuté). Redémarrez Windows maintenant... Ouvrez l'explorateur et essayez de "Supprimer" un fichier fictif... Si vous appuyez sur "ESC", le fichier restera là.... Si vous appuyez sur "OUI", il sera déplacé dans la Corbeille... Et si vous appuyez sur "NON", le fichier sera effacé du disque! Ouais! Nous l'avons fait! :D

__________

Avec ce Tutorial j'ai voulu montrer comment il était facile de faire un peu de reverse utile et j'espère vraiment que quelqu'un a trouvé tout ça utile. Si vous avez des problèmes après ce tut (Si vous n'arrivez pas au retrouver vous propres adresses différentes, je veux dire :), ou si vous voulez juste me faire savoir quoi que ce soit, mon email est neural_noise@hotmail.com

Cela dit, je fais signe de la main à tous les amis de #cracking4newbies, #crack-it Et RingZ3r0 (bienvenu au groupe, ALoR! :)... Salutations spéciales à mes chers amis BrahzVooz et ytc (et remerciements pour l'accueil du tut, fella :))

A la prochaine fois......!

-NeuRaL_NoiSE 1999


J'ai vérifié les adresses et la Bibliothèque Shell32.dll Française, elle est identique à celle Italienne. Traduit par Morgatte