SEHPOINJ : SEH Powner - OINJ
Par Baboon le lundi, août 6 2007, 15:39 - General - Lien permanent
Je bosse ces temps ci sur des packers qui ont la très mauvaise habitude d'utiliser des exceptions à tout va pour embéter le monde et effacer nos precieux DR (DebuggRegisters , ce sont eux qui nous permettent de poser des Hardwares BreakPoint).
Mattwood avait fait un plugin pour olly pour eviter que les DR soit ecrasés mais chez moi il ne fonctionnais pas en plus de lui manquer quelques fonctionnalitées.
Tracer un code bourré d'exception devient très vite fastidieux il faut en effet récupérer l'adresse du handler dans la pile , mettre un BP dessus , passer l'exception au programme et quand l'exception a fini d'être traité , il faut encore mettre un BP a l'endroit où le code reprendra son cour normal.
Ca donne une combinaison de touche qui ressemble à ça : ctrl-c / ctrl-g / ctrl-v / entré / F2 / Shift-F9 / F2 (ba oui faut enlever le BP) et ce juste pour arriver au handler....
Mon pitit plugin permet d'arriver aux points clefs beaucoup plus rapidement.
Lorsque vous arrivez à une exception, il vous suffit de faire un petit Shift-F9 et vous arrivez au handler. L'image du Context envoyé au handler a été modifié, les DebuggRegister ont été mis à 0 (MAIS vos HBP sont encore en parfait état de marche, si vous avez mis un HBP dans le handler, ca breakera bien, seule la pile est vraiment modifiée)
Vous pouvez alors tranquillement tracé le handler, arrivé au retn qui signal la fin du handler, vous n'avez plus qu'a appuyer sur F9, les DebuggRegisters sont restaurés et vous atterissez a l'endroit où le code continue, un BreakPoint "OneShot" ayant été posé.
Enfin, le plugin permet de "jongler" entre les HBPs mis par le programme et ceux posés par olly pour par exemple travailler sur tElock sans problemes.
le plugin fonctionne selon ce shema :
- Au démmarrage il patche la fonction KiUserExceptionDispatcher situé dans Ntdll.dll en y mettant une int3 (bon je sais ce n'est pas tres discret ...)
- Quand le programme break sur cette Int3 :
- Le plugin met un BP "OneShot" sur le handler
- Il enregistre les DRs et efface leur copie dans la pile
- Il restaure le code de KiUserExceptionDispatcher
- Et enfin il relance le programme
- Le programme break alors sur le BP "OneShot" et vous n'avez plus qu'a tracer le handler.
- Arrivé a la fin du handler, lorsque vous appuyez sur F9, le programme break sur l'Int3 situé dans ZwContinue et alors :
- Le plugin met un BP "OneShot" a l'endroit où le code reprendra son execution "normale"
- Il restaure les images des DebuggRegisters dans la pile (si des HBP ont ete posés par le handlers, le plugin vous demandera confirmation)
- Il restaure ZwContinue
- Il relance le programme ...
- ... Qui vient breaker sur le BP "OneShot" précedemment mis
voili voilou
LE PLUGIN (+le read-me et tElock)
(je voulais mettre un exe protege par tElock mais toute mes tentatives de packing de messages box ce sont soldées par douloureux z'et cuisant z'echec
Il se peut qu'il y ai des bug, merci de me les signaler
Je prevoit de faire une petite interface qui permette de configurer un peu le plugin mais pas dans l'immediat ...
(greetz : Kaine : pour le nom et en plus il parait que c'est un gage de qualité :p )
[EDIT ECLAIR] Modification de 2-3 choses , maintenant compatible XP SP1
-God Certified-
Commentaires
hihi, toujours à fond mon p'tit baboonet
bisouilles
Mignon tout plein. Ca donne envie de lui faire un bisou :).
congratz
Merci pour ce petit plugin !!!
Pour le bisou, je vous laisse ma place ;o)
salut salut !
Merci pour vos commentaires :p
Sinon je suis en train de completement ameliorer mon code
Il sera alors possible de jongler entre HBPs posés par olly et HBPs posés par le programme (ou un melange des deux)
Le tout avec une interface
Mouais...ya comme une impréssion de déja vu...
???
De quelle impression de deja vu parles tu ?
pourrais tu etre plus precis ?
Il n'y a pas a ma connaissance de plugin qui fait ce que mon plugin fait (a part la partie sauvegarde des DRs)
un truc tout con:
ca serait bien de pouvoir cliquer sur le texte de chaque option et pas juste sur la case...
et ouai, on prend de mauvaises habitudes de faineant ...
en tout cas ca marche bien et c'est sympa.
y a moyen que les breakpoints soient mis sans que les breakpoints sur NTDLL soient pas present dans l'historique (et donc qu'on n'y passe pas via keypad -) .. je pense pas mais a tout hasard ?
ah ouai, que la fenetre se souvienne de sa position, ca serait sympa aussi.
voila, c'est tout pour aujourd'hui :D
merci pour ton plugin
hihi
merci pour ton commentaire
Rendre le texte cliquable , pourquoi pas ...
Sinon j'avais prevu de changer le principe de fonctionnement de mon plugin pour le rendre plus pratique a l'utilisation (en injectant du code et en patchant plutot que de mettre des BPs)
Mais j'avais un peu abandonne suite au peu de retour
Je vais m'y remettre alors
merci pour ce topic, mais faut que les mentalites change!