tutorials.de Buch-Aktion 05/2012
  • Bruteforce

    Inhaltsverzeichnis
    • Vorwort
    • Was ist die Bruteforce Technik oder Lösungsmethode
    • Anwendung der Bruteforce Technik oder Lösungsmethode
    • Nachwort

    Vorwort
    Guten Tag,
    in diesem Tutorial möchte ich erklären , wie die Bruteforce Technik oder Lösungsmethode funktioniert und wie man sie anwendet.
    Dazu möchte ich noch sagen , dass dieses Tutorial nicht dazu gedacht ist, Passwörter zu knacken oder sonst in irgendeiner Form Schaden anzurichten.


    Was ist die Bruteforce Technik oder Lösungsmethode
    Bruteforce ( stammend aus dem Englischen , was mit roher Gewalt oder rohe Gewalt bedeutet ) nennt man eine Technik oder Lösungsmethode in der Informatik , Kryptologie und Spieltheorie in der viele verschiedene Kombinationen ausprobiert werden , bis eine richtig ist.
    Oftmals wird der Begriff Bruteforce mit Hackern in Verbindung
    gebracht.
    Die Erklärung ist dafür , dass Hacker oft versuchen mit HIlfe der Bruteforce Technik oder Lösungsmethode Passwörter zu klauen.
    Man sollte dabei aber beachten , dass die Methode oftmals nicht funktioniert , da Captcha Eingaben und Ähnliches das Programm daran hindern seine vielen verschiedenen Kombinationen auszuprobieren.
    Außerdem braucht man auch einen relativ Leistungsstarken Computer der die Kombinationen ausprobieren muss.
    Sollte ein Passwort , welches 10 Zeichen lang ist und nur aus
    Kleinbuchstaben und Zahlen besteht , ausprobiert werden , so gäbe es dafür 3656158440062976 Kombinationen.
    Das bedeutet , dass der Computer maximal 3656158440062976 Kombinationen ausprobieren müsste , bis er das Passwort hat.
    Die Technik oder Lösungsmethode dauert bei mir für ein Passwort , welches 4 Zeichen lang ist , 7 Minuten.
    Der Prozessor des Computers , welcher bei dieser Technik oder Lösungsmethode entscheident ist , ist ein Intel Core Duo T2300.
    Beachtet werden muss bei diesem Experiment , dass nichts ausprobiert , sondern lediglich nur berechnet wurde.
    Das bedeutet das man 2 bis 5 Minuten mit den 7 Minuten addieren müsste.
    Hier erkennt man sofort , dass es mit einem Computer alleine unmöglich wäre , solange das Passwort nicht in irgendeiner Weise primitiv wäre.
    Deshalb benutzen Hacker oftmals auch mehrere Computer.
    Trotzdem muss man ersteinmal auf eine Idee kommen , dass alle Computer nicht die gleiche Kombination ausrechnen.

    Anwendung der Bruteforce Technik oder Lösungsmethode
    Wir werden für dieses Beispiel eine Technik namens Rekursion anwenden.
    Bei dieser Rekursion ruft eine Funktion sich selbst auf.
    Man könnte auch eine Schleife als Hilfe verwenden , jedoch
    wäre dies dann nicht dynamisch ( es würde nur eine feste Anzahl an Stellen zu berechnen geben ).
    Damit wir Text Ausgaben tätigen können benötigen wir den Header iostream.
    Außerdem benötigen wir den Header string , damit das ganze etwas einfacher wird.

    Code :
    1
    2
    
    #include <iostream>
    #include <string>

    Als nächstes kommen unsere Funktionsprototypen.
    Die sind erforderlich , damit die eine Funktion von der Anderen etwas weiß und sie sich gegenseitig aufrufen können.
    Ich weiß , dass man Funktionsprototypen nicht unbedingt brauch , allerdings hab ich es mir angewohnt sie immer hinzuschreiben.

    Code :
    1
    2
    
    int main ( ) ;
    void TryRow ( std::string PhantomPassword , unsigned int Position ) ;

    Damit der Quellcode um einiges kürzer wird , es für uns einfacher wird ihn zu schreiben und wir relativ schnell neue Zeichen hinzufügen können,benötigen wir einen Array , welcher alle Zeichen enthält , die durchprobiret werden.

    Code :
    1
    2
    3
    4
    5
    6
    
    char Characters [ ] = { '0' , '1' , '2' , '3' , '4' , '5' ,
                                      '6' , '7' , '8' , '9' , 'a' , 'b' ,
                                      'c' , 'd' , 'e' , 'f' , 'g' , 'h' ,
                                      'i' , 'j' , 'k' , 'l' , 'm' , 'n' ,
                                      'o' , 'p' , 'q' , 'r' , 's' , 't' ,
                                      'u' , 'v' , 'w' , 'x' , 'y' , 'z' } ;

    Wenn man mehr Zeichen als nur diese zum Ausprobieren verwenden möchte,muss man nur neue Elemente zum Array hinzufügen.
    Jetzt kommt der Funktionsrumpf unserer main Funktion , welche
    , von dem Betriebsystem beim Programmaufruf automatisch aufgerufen wird.

    Code :
    1
    2
    
    int main ( )
    {

    Als erstes benötigen wir eine Variable , welche die Kombinationen speichert , damit wir diese später ausgeben können.
    Das Problem ist nun , dass wenn wir nachher die Elemente von unserem Character Array in den String kopieren , wir nach dem 2. Durchlauf der Schleife einen Runtime Fehler empfangen werden , da wir die größe unseres String Arrays überschreiten haben. Deshalb benötigen wir einen Wert , der die größe des String Arrays vorgibt , der am besten per Eingabe gefordert wird.
    Mit diesem Wert vergrößern wir den String Array.

    Code :
    1
    2
    3
    4
    
        std::string PhantomPassword ;
        unsigned int MaximalCharacters = 1 ;
        std::cin >> MaximalCharacters ;
        PhantomPassword.resize ( MaximalCharacters , 32 ) ;

    Jetzt kommt eine For Schlife , welche nicht nur dafür sorgt das wir die größe des String Array überschreiten , sondern auch die Funktion und ihre Rekursion aufrufen.
    Die Variable Position gibt hierbei an , bei welcher Stelle im String Array die TryRow Funktion das Zeichen ändern soll.

    Code :
    1
    2
    3
    4
    
        for ( unsigned int Position = 0 ; Position < MaximalCharacters ; Position++ )
            {
                TryRow ( PhantomPassword , Position ) ;
            }

    Zum Schluss der main Funktion , erwarten wir noch eine Enter Eingabe der Tastartur und senden dem Betriebsystem einen Rückgabewert.

    Code :
    1
    2
    3
    4
    
        std::cin.get ( ) ;
        std::cin.get ( ) ;
        return 0 ;
    }

    Jetzt kommen wir zu dem Funktionsrumpf der TryRow Funktion.
    Die Variable Position gibt hierbei , wie oben beschrieben , die Position im String Array , an der das Zeichen verändert werden soll.
    Die Referenz PhantomPassword benötigen wir zum kopierne in den String Array , der main Funktion und zum Ausgeben der derzeitigen Kombination.

    Code :
    1
    2
    
    void TryRow ( std::string & PhantomPassword , unsigned int Position )
    {

    Jetzt fehlt uns eine Schleife , welche die Zeichen der derzeitgen Position mit der Position im Character Array kopiert.
    Damit wir keinen Runtime Fehler wegen überschreitung einer Array Größe bekommen , prüft die Schleife ob wir die Array Größen Grenze nicht überschreiten.

    Code :
    1
    2
    
        for ( unsigned int Character = 0 ; Character < sizeof ( Characters ) ; Character++ )
        {

    Hier wird nun lediglich das Zeichen in den String Array kopiert.
    Und danach der String Array ausgegeben,

    Code :
    1
    2
    
            PhantomPassword [ Position ] = Characters [ Character ] ;
            std::cout << PhantomPassword << "\n" ;

    Hier folgt nun die Rekursion , also die Stelle , an der die Funktion sich selbst aufruft.
    Diese erfolgt nur wenn die derzeitige Position im String Array höher als 0 ist.

    Code :
    1
    2
    
            if ( Position > 0 )
                TryRow ( PhantomPassword , Position - 1 ) ;

    Jetzt fehlen nur noch die Klammern

    Code :
    1
    2
    
        }
    }

    Nachwort

    Solltet ihr noch Fragen , Anregungen oder Kritik haben , dann kontaktiert mich bitte per E-Mail , ICQ oder Skype.
    Außerdem geht ein dank an Nachoman11 , der mir dabei geholfen hat die Technik oder Lösungsmethode besser zu verstehen und der mich auf Idee gebracht hat eine Rekursion anzuwenden.
    Ich hoffe ich konnte euch die Technik oder Lösungsmethode näherbringen

    MfG Stazer
    demon1 und Mucalist bedanken sich. 


    Kommentare Kommentar schreiben

    Klicke hier, um dich anzumelden

    Welche Farbe hat eine reife Zitrone?