IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Technique anti-debug, camouflage IsDebuggerPresent


Sujet :

Windows

  1. #1
    Membre averti
    Inscrit en
    Février 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 31
    Par défaut Technique anti-debug, camouflage IsDebuggerPresent
    Bonjour, j'ai fait une DLL que je souhaite protéger de tentative de reversing, de débogage, j'aurais donc deux questions.

    La première : j'utilise la plus basique (et la plus simple à bypasser), celle du IsDebuggerPresent, cependant, en reversant la DLL on retrouve très facilement l'utilisation de cette API et une modification "on the fly" du binaire permettrait de bypasser cette protection, j'essaie donc de camoufler l'utilisation de cette API, comme je peux, par exemple j'utilise deja GetProcAddress pour une liaison dynamique avec cette API, pour éviter qu'elle n'apparaisse dans la table IAT, et ensuite je n'utilise pas directement la string "IsDebuggerPresent" en paramètre :

    au lieu de procéder ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procCheckDebugger = (MYPROC_2)GetProcAddress(hKernel32, "IsDebuggerPresent");
    j'utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    __asm {
    
    		push 0x00000074
    		push 0x6E657365
    		push 0x72507265
    		push 0x67677562
    		push 0x65447349
    
    		lea eax, [esp]
    		push eax
    
    		push hKernel32
    		call GetProcAddress
    		mov procCheckDebugger, eax
    
    		add esp, 0x14
    	}
    Je ne sais pas si c'est une solution très efficace, mais j'essaie au mieux de cacher la string "IsDebuggerPresent" passée en paramètre. Mais en utilisant cette seconde solution, la DLL ne fonctionne pas, pourtant je restaure la pile comme il faut, c'est là que j'aurais notamment besoin de vous ...


    Seconde question : je pensais également déranger de potentiels débuggueurs en modifiant les DRx, donc en les effaçant, pour cela j'utilise GetThreadContext et SetThreadContext.. mais à quel moment "privilégié" je pourrais effacer ces registres de deug DRx ?? parce que le but est d'empêcher au debugger de placer des breakpoints, donc à quel moment effacer les DRx ??

    J'attends de vos lumières, merci.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    À mon avis, un API Hook sur IsDebuggerPresent reste capable de détecter toute utilisation de la fonction. Ou bien, le debugger peut sûrement aussi hooker le chargement de kernel32.dll et trifouiller sa table d'exportation pour rediriger vers sa propre version de IsDebuggerPresent() (ou patcher la fonction en mémoire)...

    Pour la seconde question, je ne sais pas ce que tu appelles les DRx...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Inscrit en
    Février 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 31
    Par défaut
    Salut, concernant IsDebuggerPresent, je souhaite seulement dissimulmer un peu son utilisation, c'est pour cela que j'ai testé le code asm et qui ne fonctionne pas; ensuite les DRx sont les registres de debug.

    Merci.

  4. #4
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Par défaut
    Bonjour,

    IsDebuggerPresent ne comporte que trois ligne d'asm, tu peux les utiliser plutôt que d'appeler la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    BOOL CheckDebugger(void)
    {
         BOOL IsDebugged = FALSE;
     
         __asm{
         MOV EAX,DWORD PTR FS:[18] ; pointeur sur TEB
         MOV EAX,DWORD PTR DS:[EAX+30]; pointeur sur PEB
         MOVZX EAX,BYTE PTR DS:[EAX+2] ; IsDebugged ?
         MOV IsDebugged, EAX;
         }
    
         return IsDebugged; /*TRUE si debug, FALSE autrement*/
    }
    En ce qui concerne les Drx, ils sont locaux à chaque CONTEXT de thread. Comme on ne peut pas obtenir le Context du thread qui appelle Get/SetThreadContext() il faut créer un thread secondaire qui se chargera de vérifier le context d'un autre thread car le thread dont on doit retrouver le CONTEXT doit expressément être suspendu.
    Si ce thread est le thread principale (généralement le thread responsable de l'UI), ça oblige à bloquer l'UI pendant la vérification des Drx.

    Ceci dit, la vérification du booléen IsDebugged du PEB et la vérification des Drx sont des "tricks" très connus des déplombeurs...

Discussions similaires

  1. Techniques de debug sous SAS/IML
    Par enicnath dans le forum SAS IML
    Réponses: 3
    Dernier message: 12/12/2012, 11h17
  2. protection anti debugging
    Par PastorTroy dans le forum C
    Réponses: 2
    Dernier message: 26/01/2009, 19h16
  3. Chapitre 4 : Debugging Techniques partie 1
    Par Arnaud F. dans le forum Traduction LDD3
    Réponses: 1
    Dernier message: 21/07/2008, 23h12
  4. technique Anti spam
    Par erman_yazid dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 20/05/2008, 13h02
  5. [Technique] Intérêt des index
    Par ddams dans le forum Décisions SGBD
    Réponses: 10
    Dernier message: 04/11/2002, 15h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo