• STATISTIQUES
  • Il y a eu un total de 1 membres et 26628 visiteurs sur le site dans les dernières 24h pour un total de 26 629 personnes!


    Membres: 2 604
    Discussions: 3 579
    Messages: 32 816
    Tutoriels: 78
    Téléchargements: 38
    Sites dans l'annuaire: 58


  • ANNUAIRE
  • [FR] Root-Me
    Notre équipe se base sur un constat : à l'heure actuelle ou l'information tend à devenir...
    Hacking
    [FR] µContest
    µContest est un site de challenges de programmation, c'est à dire qu'il propose des épreu...
    Hacking
    [EN] wechall
    Pour les gens n'étant pas familiers avec les sites de challenges, un site de challenges est un site propos...
    Hacking
    [FR] Kalkulators
    Ce projet a plusieurs buts, le premier étant l’étude de toutes formes cryptographiques, le cot&ea...
    Cryptographie
    [EN] Dare your mind
    JavaScript: 6, Crypto: 44, Stegano: 36, Logic: 13, Special: 27, Science: 11, Realistic: 7, Programming: 10, Crack It: 6,...
    Challenges
    [EN] Big-Daddy
    Big-Daddy est site internet communautaire avec un effectif diversifié, y compris des artistes, des programmeur...
    Hacking
    [EN] Net Force
    Javascript: 9, Java Applets: 6, Cryptography: 16, Exploits: 7, Cracking: 14, Programming: 13, Internet: 15, Steganograph...
    Challenges

  • DONATION
  • Si vous avez trouvé ce site internet utile, nous vous invitons à nous faire un don du montant de votre choix via Paypal. Ce don servira à financer notre hébergement.

    MERCI!




Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
Contournement des anti-debugs
31-05-2013, 21h05
Message : #1
0pc0deFR
Non-enregistré



 
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)

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]
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]
Remplacez JNZ par JZ.
[Image: 690976Snap2013053120h58m09s002.png]
Pressez F9 et profitez.

Je compléterais dans le temps.
positive (2) negative (0) Répondre
04-06-2013, 20h16
Message : #2
Horgh Hors ligne
Membre actif
*



Messages : 197
Sujets : 4
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 :')
+1 (1) -1 (0) Répondre
04-06-2013, 20h19
Message : #3
qtkt Hors ligne
Newbie
*



Messages : 13
Sujets : 1
Points: 3
Inscription : May 2013
RE: Contournement des anti-debugs
(04-06-2013, 20h16)Horgh a écrit :
Citation :Remplacez JNZ par JZ.

Oh le réflexe qui pue. J'en connais qui ferait une syncope à voir des choses pareilles :')

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 ?
+1 (0) -1 (0) Répondre
04-06-2013, 20h34
Message : #4
InstinctHack Hors ligne
Posting Freak
*



Messages : 1,366
Sujets : 184
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.
+1 (1) -1 (0) Répondre
04-06-2013, 20h36 (Modification du message : 04-06-2013, 20h59 par fr0g.)
Message : #5
fr0g Hors ligne
NTEuNDI2MzcsLTEuNzc4NDg4
*****



Messages : 348
Sujets : 22
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 ptrace)

Code C :

#include <stdio.h>
#include <sys/ptrace.h>

int main(int ac, char **av)
{
  if (ptrace(PTRACE_TRACEME, 0, 1, 0) < 0)
    {
      printf("DEBUG DETECTED\n");
      return (1);
    }
  printf("Hello world !!!\n");
  return (0);
}
 


Ce main desassemblé donne ça :

Code :
0x0804844c <+0>:    push   %ebp
   0x0804844d <+1>:    mov    %esp,%ebp
   0x0804844f <+3>:    and    $0xfffffff0,%esp
   0x08048452 <+6>:    sub    $0x10,%esp
   0x08048455 <+9>:    movl   $0x0,0xc(%esp)
   0x0804845d <+17>:    movl   $0x1,0x8(%esp)
   0x08048465 <+25>:    movl   $0x0,0x4(%esp)
   0x0804846d <+33>:    movl   $0x0,(%esp)
   0x08048474 <+40>:    call   0x8048350 <ptrace@plt>
   0x08048479 <+45>:    test   %eax,%eax
   0x0804847b <+47>:    jns    0x8048490 <main+68>
   0x0804847d <+49>:    movl   $0x8048540,(%esp)
   0x08048484 <+56>:    call   0x8048320 <puts@plt>
   0x08048489 <+61>:    mov    $0x1,%eax
   0x0804848e <+66>:    jmp    0x80484a1 <main+85>
   0x08048490 <+68>:    movl   $0x804854f,(%esp)
   0x08048497 <+75>:    call   0x8048320 <puts@plt>
   0x0804849c <+80>:    mov    $0x0,%eax
   0x080484a1 <+85>:    leave  
   0x080484a2 <+86>:    ret


ce qui nous intéresse c'est :

Code ASM :

call   0x8048350 ; appel de ptrace
test   eax,eax
jns    0x8048490 ; (=> printf hello world)
 


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 Smile )
+1 (3) -1 (0) Répondre
05-06-2013, 08h43
Message : #6
0pc0deFR
Non-enregistré



 
RE: Contournement des anti-debugs
(04-06-2013, 20h34)InstinctHack a écrit : @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.
positive (0) negative (0) Répondre
05-06-2013, 21h23 (Modification du message : 05-06-2013, 21h23 par supersnail.)
Message : #7
supersnail Hors ligne
Éleveur d'ornithorynques
*******



Messages : 1,608
Sujets : 71
Points: 466
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 Wink
Mon blog

Code :
push esp ; dec eax ; inc ebp ; and [edi+0x41],al ; dec ebp ; inc ebp

"VIM est merveilleux" © supersnail
+1 (0) -1 (0) Répondre
05-06-2013, 23h40
Message : #8
0pc0deFR
Non-enregistré



 
RE: Contournement des anti-debugs
(05-06-2013, 21h23)supersnail a écrit : '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 Wink

Effectivement Smile
positive (0) negative (0) Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)
N-PN
Accueil | Challenges | Tutoriels | Téléchargements | Forum | Retourner en haut