Contournement des anti-debugs
Voici quelques petites informations/techniques sur le contournement des anti-debugs. Les exemples/techniques citées sont non exhaustives et orienté Windows.
Commençons avec l'API IsDebuggerPresent() (Réalisé avec OllyDBG 2.01)
Chargez simplement le binaire dans OllyDBG puis clique droit "Search for" -> "Name".
Dans la nouvelle fenêtre, vous trouverez "KERNEL32.IsDebbugerPresent", cliquez droit puis "Find Reference".
![[Image: 361684Snap2013053120h59m12s004.png]](http://img15.hostingpics.net/pics/361684Snap2013053120h59m12s004.png)
Vous trouverez un JMP sur la DLL et un CALL, mettez un BP sur le CALL.
Retournez sur la vue CPU puis F9. Notre BP nous arrête sur le CALL. Nous avons droit à un TEST EAX, EAX suivi d'un JNZ.
![[Image: 568045Snap2013053120h56m43s001.png]](http://img15.hostingpics.net/pics/568045Snap2013053120h56m43s001.png)
Remplacez JNZ par JZ.
![[Image: 690976Snap2013053120h58m09s002.png]](http://img15.hostingpics.net/pics/690976Snap2013053120h58m09s002.png)
Pressez F9 et profitez.
Je compléterais dans le temps.
Commençons avec l'API IsDebuggerPresent() (Réalisé avec OllyDBG 2.01)
Code C :
#include <windows.h>
int main()
{
if(IsDebuggerPresent())
{
MessageBox(0, "Debugged", "Debugged", MB_OK); //Si un debugger est détecté
}
else
{
MessageBox(0, "Not Debugged", "Not Debugged", MB_OK); //Si aucun debugger n'est détecté
}
return 0;
}
Chargez simplement le binaire dans OllyDBG puis clique droit "Search for" -> "Name".
Dans la nouvelle fenêtre, vous trouverez "KERNEL32.IsDebbugerPresent", cliquez droit puis "Find Reference".
![[Image: 361684Snap2013053120h59m12s004.png]](http://img15.hostingpics.net/pics/361684Snap2013053120h59m12s004.png)
Vous trouverez un JMP sur la DLL et un CALL, mettez un BP sur le CALL.
Retournez sur la vue CPU puis F9. Notre BP nous arrête sur le CALL. Nous avons droit à un TEST EAX, EAX suivi d'un JNZ.
![[Image: 568045Snap2013053120h56m43s001.png]](http://img15.hostingpics.net/pics/568045Snap2013053120h56m43s001.png)
Remplacez JNZ par JZ.
![[Image: 690976Snap2013053120h58m09s002.png]](http://img15.hostingpics.net/pics/690976Snap2013053120h58m09s002.png)
Pressez F9 et profitez.
Je compléterais dans le temps.
Horgh
![]() Membre actif ![]() ![]() Messages : 197 Points: 91 Inscription : Mar 2012 |
RE: Contournement des anti-debugs
Citation :Remplacez JNZ par JZ. Oh le réflexe qui pue. J'en connais qui ferait une syncope à voir des choses pareilles :') Veuillez vous enregistrer pour visualiser l'ensemble du forum en cliquant ici. |
qtkt
![]() Newbie ![]() ![]() Messages : 13 Points: 3 Inscription : May 2013 |
RE: Contournement des anti-debugs
(04-06-2013 20h16)Horgh a écrit : Veuillez vous enregistrer pour visualiser l'ensemble du forum en cliquant ici.Citation :Remplacez JNZ par JZ. C'est sympa de critiquer, mais ce ne serais pas mieux d'expliquer la bonne facon de faire ou d'au moins expliquer ce qui ne va pas ? |
InstinctHack
![]() Posting Freak ![]() ![]() Messages : 1,366 Points: 299 Inscription : Dec 2011 |
RE: Contournement des anti-debugs
@qtkt je pense (je suis pas sûr) que tu fait une inversion de saut, ce qui signifie que tu inverse le comportement du programme à cet endroit, donc si la condition est valide au départ, elle ne l'est plus, ce qui est rarement souhaitable dans les faits.
|
fr0g
![]() NTEuNDI2MzcsLTEuNzc4NDg4 ![]() ![]() ![]() ![]() ![]() ![]() Messages : 348 Points: 56 Inscription : Aug 2011 |
RE: Contournement des anti-debugs
Je vais suivre avec un trick de base sous linux , même méthode que le post précédant pour bypass)
(avec Veuillez vous enregistrer pour visualiser l'ensemble du forum en cliquant ici.) Code C :
Ce main desassemblé donne ça : Code : 0x0804844c <+0>: push %ebp ce qui nous intéresse c'est : Code ASM :
si vous utilisez un programme de debug, (GDB / IDA / ltrace / strace & co) , le registre EAX contiendra -1 après l'appel de ptrace (avec les paramètres utilisés dans le cas présent) Il suffit de break entre l'appel de ptrace et le saut conditionnel, ou le programme compare la valeur renvoyée par ptrace (contenue dans EAX) à 0 . on set EAX à 0 , et le programme va prendre le saut pour continuer vers les autres étapes. (j'ai compile' en 32 bits pour éviter de pourrir le bloc de code avec la taille des adresses ![]() |
0pc0deFR
![]() Membre actif ![]() ![]() Messages : 161 Points: 35 Inscription : May 2013 |
RE: Contournement des anti-debugs
(04-06-2013 20h34)InstinctHack a écrit : Veuillez vous enregistrer pour visualiser l'ensemble du forum en cliquant ici.@qtkt je pense (je suis pas sûr) que tu fait une inversion de saut, ce qui signifie que tu inverse le comportement du programme à cet endroit, donc si la condition est valide au départ, elle ne l'est plus, ce qui est rarement souhaitable dans les faits. C'est tout à fait ça. C'est une inversion de condition. A savoir qu'un malware ou un outil qui va être reverse et qui possède cette fonction va souvent se terminer si la fonction IsDebuggerPresent se valide. En inversant le comportement le programme ne se termine pas. Les conséquences sont assez limitées. Il faut vérifier le comportement du programme après la fonction et juger par soi même. Il y a des manières plus jolies pour contourner ça. Le hook par exemple avec un script Olly pour faire en sorte que la fonction renvoie toujours 0. Pour le coup, j'ai préféré présenter une technique simple qui fonctionne avec tous les outils de debug. Twitter: Veuillez vous enregistrer pour visualiser l'ensemble du forum en cliquant ici. Blog: Veuillez vous enregistrer pour visualiser l'ensemble du forum en cliquant ici. |
supersnail
![]() Éleveur d'ornithorynques ![]() ![]() ![]() ![]() ![]() ![]() Messages : 1,591 Points: 465 Inscription : Jan 2012 |
RE: Contournement des anti-debugs
'Fen bref, le plus simple c'est soit de virer l'instruction en la noppant (0x90 deux fois), soit de la remplacer par un "jmp" (0xEB) au lieu de faire de l'inversion de sauts
![]() Veuillez vous enregistrer pour visualiser l'ensemble du forum en cliquant ici. Code : push esp ; dec eax ; inc ebp ; and [edi+0x41],al ; dec ebp ; inc ebp "VIM est merveilleux" © supersnail |
0pc0deFR
![]() Membre actif ![]() ![]() Messages : 161 Points: 35 Inscription : May 2013 |
RE: Contournement des anti-debugs
(05-06-2013 21h23)supersnail a écrit : Veuillez vous enregistrer pour visualiser l'ensemble du forum en cliquant ici.'Fen bref, le plus simple c'est soit de virer l'instruction en la noppant (0x90 deux fois), soit de la remplacer par un "jmp" (0xEB) au lieu de faire de l'inversion de sauts Effectivement ![]() Twitter: Veuillez vous enregistrer pour visualiser l'ensemble du forum en cliquant ici. Blog: Veuillez vous enregistrer pour visualiser l'ensemble du forum en cliquant ici. |