Techniques anti-debugging et protection logicielle


Faux désassemblage >>


I°) La méthode ptrace

Explication de la méthode
   Elle est assez simple d'utilisation : sous les systèmes UNIX, un appel système nommé ptrace sert à débogguer les éxécutables (les tracer, les modifier, poser des points d'arrêt, etc..). Il va de soi que cet appel système est utilisé par tous les debuggers sous Unix. L'appel ptrace est déclaré dans la librairie système sys/ptrace.h. Ptrace a la particularité qu'il ne peut être utilisé qu'une seule fois sur un même éxécutable en simultané. En fait, ptrace retourne 0 si le lancement a réussi et -1 si il y a déjà un ptrace en cours sur l'éxécutable.
Il paraît donc naturel qu'il suffit d'appeller ptrace dans le programme : s'il réussit, tout est normal, s'il échoue, il y a un débuggage en cours sur l'éxécutable et cela ne présage rien de bon. Démontrons ceci avec le code suivant.

Illustration
   Pour changer un peu du C, nous allons nous moderniser et passer au C++. Le programme suivant est un programme bateau (comme tous les programmes de cette section) qui permet une authentification préhistorique :
    //test.cpp Test de protection par la méthode ptrace
    #include <sys/ptrace.h>

    #include <iostream>
      using std::cout;
      using std::cin;
      using std::endl;

    #include <string>
      using std::string;

    #define PASS "4xdfeSDE7"

    int main() {

      if (ptrace(PTRACE_TRACEME, 0, 1, 0) < 0)      //Si l'appel ptrace retourne une valeur négative, il a échoué => On quitte
      {
        cout << "Tentative de Crack\nAbandon..." << endl;
        return 1;
      }

      string mdp;

      cout << "Authentification requise\nMot de passe :\t";
      cin >> mdp;      //Capture clavier

      if (mdp == PASS)      //Si la chaîne rentrée au clavier est pareil que la chaîne PASS définie plus tôt
      cout << "Authentification réussie, bienvenue dans la suite du programme" << endl;

      else cout << "Echec de l'authentification\nAbandon..." << endl;      //Sinon

      return 0;
    }
Le but du programme est assez clair, nous allons maintenant le tester :
    $ g++ test.cpp -o test
    $ ./test
    Authentification requise
    Mot de passe : testdepass
    Echec de l'authentification
    Abandon...
    $ ./test
    Authentification requise
    Mot de passe : 4xdfeSDE7
    Authentification réussie, bienvenue dans la suite du programme
    $ gdb -q test
    Using host libthread_db library "/lib/libthread_db.so.1".
    (gdb) r
    Starting program: /home/SeriousHack/test
    Failed to read a valid object file image from memory.
    Tentative de Crack
    Abandon...

    Program exited with code 01.
    (gdb)
Comme prévu, le deuxième ptrace n'a pas pu se lancer, a renvoyé un code d'erreur et a détecté proprement l'utilisation du debugger. Ceci dit, cette protection est primaire, elle est donc couramment cachée par la technique du faux désassemblage que nous nous proposons d'expliquer maintenant.


Faux désassemblage >>



14 Commentaires
Afficher tous


Anonyme 12/04/14 20:52
cool

Anonyme 24/03/14 21:21
Merci

Anonymo 17/02/14 02:44
thx !

Anonyme 15/01/14 22:13
Top




Commentaires désactivés.

Apprendre la base du hacking - Liens sécurité informatique/hacking - Contact

Copyright © Bases-Hacking 2007-2014. All rights reserved.