Crackme Nag Screen Synapsus
par Kharneth
 
Outils utilisésPublicCible
 - OllyDbg 1.09d
 - Papier, Crayon, Cerveau 5.0
 Débutant avancé en Cracking
ayant de bonnes connaissances en programmation
 CrackMe.exe
 
1 - Introduction 

      Il faut supprimer la MessageBox qui apparait au démarrage du programme.

2 - OllyDbg 

      Donc je charge le crackme sous OllyDbg. D'abord, je regarde un peu le code pour voir comment le programme est construit. Où se trouve la boucle de gestion des messages, la WNDProc(), la création de la fenêtre... On remarque toute une partie de code non interprétée par Olly. Pour y voir plus clair, il suffit de faire un click droit puis Binary Copy et Binary Paste.
      Après une brève analyse, on note les évènements gérés: WM_CREATE, WM_DESTROY, WM_PAINT, WM_KEYDOWN, WM_LBUTTONDBLCLK, WM_LBUTTONDOWN.
      Je commence par tracer le programme pas à pas. Rien de particulier si ce n'est une boucle qui décrypte un petit bout de code en 401573. Je continue donc jusqu'à tomber sur une jolie Exception en 401638, gérée par la routine juste au-dessus:

      En traçant pas à pas et avec shift F8 pour passer les exceptions, on remarque que cette routine ainsi que le code décrypté précédemment sont là pour décrypter le début de la WNDProc() correspondant à la gestion du message WM_CREATE. Pour ne pas me prendre la tête, je désactive la gestion des exceptions dans les debugging options.

      Je pose un BP sur CreateWindowExA puis relance le programme pour continuer tranquillement mon étude. Mais là je ne comprend pas pourquoi, le programme plante avant d'arriver sur le BP. Pourtant lorsque je l'ai tracé pas à pas, je n'ai trouvé qu'une seule exception.
      Je pose un nouveau BP sur le JMP en 40156D et après quelques secondes, l'exécution s'arrète sur CreateWindowsExA.
      En survolant le nouveau code décrypté, on voit plusieurs chaines utilisées pour détecter des debuggers ("\\.\NTICE", "\\.\TRW"... Et là je suis content parce que je ne me sens pas du tout concerné!! :p). Je lance le prog et... gros plantage! Donc je me dis que s'il a mis des detect sice, il a surement mis un IsDebuggerPresent. J'active le plugin et là ça passe, la MsgBox s'affiche. En mettant un bpm en 7FFDF002, je tombe sur ces instructions:

      Je ne cherche pas plus à comprendre la suite du code qui n'est surement là que pour nous embrouiller. D'ailleurs en regardant le début de la WNDProc(), on s'aperçoit que seul le code après 4016FD est décrypté. Le CALL juste avant le jmp extrait une image des ressources:

      En étudiant le programme, on remarque dans la fenêtre de dump plusieurs chaines décryptées au fur et à mesure. Entre autres les chaines de la MsgBox mais surtout 2 apis importantes MessageBoxA et ShowWindow.

      On en conclue que cette grande partie de code dans WM_CREATE charge l'image, affiche la MsgBox puis affiche la fenêtre. Donc il faut trouver comment contourner tout ce code. Par exemple en recodant l'évènement WM_CREATE.
      Pour charger l'image, c'est simple il suffit de garder le code en 4016EB qui n'est pas crypté. Là où ça se complique, c'est pour afficher la fenêtre. En effet, l'api ShowWindow ne figure pas dans l'import table ni GetProcAddress. Il existe plusieurs solutions mais je ne vais pas me prendre la tête une fois de plus! :p Je vais simplement ajouter le style WM_VISIBLE à CreateWindowExA pour que la fenêtre s'affiche dès qu'elle est créée.

3 - Patch 

      Je modifie donc en 4016FD le JMP 00402306 pour qu'il sorte de la fonction WNDProc(). Ainsi toute la partie cryptée du code est sautée! Seulement c'est un long JMP donc utilisant 5 octets et non 2. Ce code étant décrypté au début, cela va poser quelques problèmes... Donc je vais également sauter la partie qui décrypte en modifiant le JMP en 40156D pour qu'il saute en 401645 juste après la 1ere exception. Enfin, je modifie le style de CreateWindowExA en WM_POPUP or WM_VISIBLE or WM_SYSMENU (PUSH 90080000).
      Pour finir, click droit --> Copy to Executable puis All Modifications et Save File en CrackMePatched.exe

Kharneth 

The snake is long, seven miles
Ride the snake...he's old, and his skin is cold


Merci à toutes les personnes qui se battent pour que l'Information soit accessible à tous!