Wie sicher ist ein Passwort im Quellcode



  • Ich wollte mal nachfragen, wie sicher ein Passwort im Quellcode ist.

    Wenn ich z.B. eine Passwortabfrage in ein Programm integriere und dafür einen String verwende, der das Passwort enthält und mit der Eingabe verglichen wird.

    Wie schwierig ist es an das Passwort ranzukommen, wenn man nur die EXE-Datei hat.

    Ich meine damit das Passwort aus der Datei herausfiltern. Kein Brute-Force



  • öffne die .exe doch mal mit 'notepad'
    😉



  • Nimlot schrieb:

    Ich wollte mal nachfragen, wie sicher ein Passwort im Quellcode ist. Wenn ich z.B. eine Passwortabfrage in ein Programm integriere und dafür einen String verwende, der das Passwort enthält und mit der Eingabe verglichen wird.

    Mal ehrlich: Da ist das Passwort absolut irrelevant, weil ein Cracker einfach die if-Bedingung noppen würde (Änderung eines einzigen Bits im Quellcode).

    Lies dir dazu mal den (wirklich guten 👍 ) Artikel von winexec* durch:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-161865.html



  • öffne die .exe doch mal mit 'notepad'

    ...oder es geht sogar noch einfacher: Die meistens Disassemblierer bieten die Funktion an, alle enthaltenen strings zu suchen und anzuzeigen.

    Fazit: (Leider) nicht wirklich sicher....

    MfG mikey.



  • sicher bist du nur wenn vom password grundlegende funktionalitaet abhaeng

    mal als ganz stumpfes beispiel kann ein pwd dafuer genutzt werden irgendwo eine arraygroesse zu errechnen, hackt jemand die abfrage, ist der wert undefiniert und das programm kackt womoeglich irgendwo ab weil ein array das viel zu klein ist benutzt wird, oder weil es zu gross ist um allokiert zu werden.

    das ist nur ein beispiel, es gibt tausende dinge die von einem pwd abhaengen koennen 😉



  • Zur Not halt 'nen Hash vom Passwort speichern.
    Aber wie Reyx schon sagte, könnte ein Cracker das ganze Noppen(0x90?), wenn es nur aus einer einfach gestrickten if-Abfrage besteht.



  • Verschlüssel doch einfach einen Teil der exe mit dem Passwort und zur laufzeit lädst du den teil und er wird mit dem eingegebenen passwort entschlüsselt.

    Ah, whats puzzling you
    Is the nature of my game, oh yeah



  • Nimlot schrieb:

    Ich wollte mal nachfragen, wie sicher ein Passwort im Quellcode ist.

    Wenn ich z.B. eine Passwortabfrage in ein Programm integriere und dafür einen String verwende, der das Passwort enthält und mit der Eingabe verglichen wird.

    Wie schwierig ist es an das Passwort ranzukommen, wenn man nur die EXE-Datei hat.

    Ich meine damit das Passwort aus der Datei herausfiltern. Kein Brute-Force

    Einfache Regel: Passwörter niemals in Klartext speichern. Die Regel gibt es nicht ohne Grund.



  • Na wenn wir schon beim Thema sind, dann konkretisieren wir es mal, oder ? Wie sollte man es lösen ? Es wurde ja schon ein paar Beispiele genannt, aber wie sieht das in der Realität aus ?

    Ein Beispiel:

    Sagen wir mal, ich habe mir ein kleines Programm geschrieben, das Passwörter verschlüsselt in einer Datei ablegt, und bei bedarf aufruft und entschlüsselt. Das Problem dabei ist jedoch, dass dann das entschlüsselte Passwort im Speicher liegt, und mittels ReadProcessMemory ausfindig gemacht werden kann.

    Ausgehend davon, dass es sich um einen durch Umkehrrechnungen auflösbaren Algorithmus handelt, wie kann man es dann verhindern, dass das Passwort nicht in Blankform im Speicher liegt ?

    Schadet mal nicht, über das Thema einbisschen zu diskutieren. 🙂

    MfG mikey.



  • mikey schrieb:

    wie kann man es dann verhindern, dass das Passwort nicht in Blankform im Speicher liegt ?

    Ich denke mal gar nicht.
    Mann muss ja irgendwie Abfragen ob das PW mit der Eingabe übereinstimmt - dazu muss es ja im Speicher sein.



  • mikey schrieb:

    Sagen wir mal, ich habe mir ein kleines Programm geschrieben, das Passwörter verschlüsselt in einer Datei ablegt, und bei bedarf aufruft und entschlüsselt. Das Problem dabei ist jedoch, dass dann das entschlüsselte Passwort im Speicher liegt, und mittels ReadProcessMemory ausfindig gemacht werden kann.

    Ausgehend davon, dass es sich um einen durch Umkehrrechnungen auflösbaren Algorithmus handelt, wie kann man es dann verhindern, dass das Passwort nicht in Blankform im Speicher liegt ?

    Genau aus diesem Grund achten Treiber für verschlüsselte Partitionen oder Festplatten darauf, dass das Passwort nur im Speicherbereich des Treibers steht, den man mit ReadProcessMemory nicht auslesen kann (weil Kernel-Bereich). Dass der Kernel oder ein anderer Treiber das Passwort dann immer noch auslesen kann, lässt sich soweit ich weiß zumindest unter Windows nicht vermeiden.

    Das wichtigste ist: Ein sinnvolles Verschlüsselungsverfahren ist auch dann noch sicher, wenn der verwendete Algorithmus mit all seinen Feinheiten bekannt ist.



  • Bei verschlüsselten Daten, etc. verstehe ich ja, dass man diese entschlüsseln möchten. 😃

    Aber wieso möchte man das bei Passwörtern? AFAIK werden Passwörter nur verschlüsselt und zum Vergleich wird das eingegebene Passwort ebenfalls verschlüsselt und die verschlüsselten Strings miteinander verglichen.

    Oder habe ich jetzt das Problem missverstanden?



  • Ich glaub, er meint sowas wie 'nen Passwort-Safe. Da packt man seine saemtlichen Passwoerter rein, und verschluesselt die dann alle zusammen, so dass man sich nur noch dieses eine Passwort merken muss.



  • mantiz schrieb:

    Bei verschlüsselten Daten, etc. verstehe ich ja, dass man diese entschlüsseln möchten. 😃

    Aber wieso möchte man das bei Passwörtern? AFAIK werden Passwörter nur verschlüsselt und zum Vergleich wird das eingegebene Passwort ebenfalls verschlüsselt und die verschlüsselten Strings miteinander verglichen.

    Oder habe ich jetzt das Problem missverstanden?

    fast, die passwörter werden nicht verschlüsselt abgelegt, sondern nur der hashwert des pw. diese werden dann verglichen. und vom hashwert gibt es keinen weg zurück zum pw



  • Webster schrieb:

    mikey schrieb:

    wie kann man es dann verhindern, dass das Passwort nicht in Blankform im Speicher liegt ?

    Ich denke mal gar nicht.
    Mann muss ja irgendwie Abfragen ob das PW mit der Eingabe übereinstimmt - dazu muss es ja im Speicher sein.

    Hier könnte man evtl. einen Hash speichern und schauen ob der hash des eingegebenen passwortes übereinstimmt...



  • Echo???



  • Aber wieso möchte man das bei Passwörtern? AFAIK werden Passwörter nur verschlüsselt und zum Vergleich wird das eingegebene Passwort ebenfalls verschlüsselt und die verschlüsselten Strings miteinander verglichen.

    Das ist schon richtig. Aber ich habe absichtlich von einem mathematisch durch Umkehrrechnungen aufzulösenden Algorithmus gesprochen. Wäre es ein Hash, dann ist es natürlich viel sicherer.



  • Der Thread ist schon etwas älter, hätte trotzdem ne Frage und wollte keinen neuen Aufmachen....

    Ich würde das Password jetzt z.B. als Hash Code oder dergleichen aspeicher, ABER wie umgehe ich die Sache mit der If Abfrage ? Das mit den Arraygrenzen ist ne gute Idee, allerdings wie setzte ich sowas am besten um ?

    Wie würdet Ihr die If Abfrage ala :

    If (input == pwd){...} gestalten um das ein bisschen sicherer zu machen ?

    Ich muss nur vor ein paar neugierigen Kiddies schüzten, da ist keiner "echter" Hacker dabei, da fehlt das "Hirnschmalz" dafür 🙂



  • pwd_question schrieb:

    Der Thread ist schon etwas älter, hätte trotzdem ne Frage und wollte keinen neuen Aufmachen....

    Ich würde das Password jetzt z.B. als Hash Code oder dergleichen aspeicher, ABER wie umgehe ich die Sache mit der If Abfrage ? Das mit den Arraygrenzen ist ne gute Idee, allerdings wie setzte ich sowas am besten um ?

    Wie würdet Ihr die If Abfrage ala :

    If (input == pwd){...} gestalten um das ein bisschen sicherer zu machen ?

    Ich muss nur vor ein paar neugierigen Kiddies schüzten, da ist keiner "echter" Hacker dabei, da fehlt das "Hirnschmalz" dafür 🙂

    Du möchtest kein if haben? Dann nimm Function Pointer.

    Beispiel:

    #include <stdio.h>
    #include <stddef.h>
    
    // der gespeicherte hashwert
    ptrdiff_t PWDHASH = 0x12345678;
    
    // hier ist das eigentliche programm
    void program (void)
    {
        printf ("hier gehts weiter ...");
    }
    
    // Passworteingabe des Benutzers als hashwert zurückliefern
    ptrdiff_t get_input_hash()
    {
        return 0x12345678;
    }
    
    // ...
    void main()
    {
        ptrdiff_t goodval = ((ptrdiff_t)program) ^ PWDHASH;
        void (*func)(void);
        goodval ^= get_input_hash();
        func = (void (*)(void))goodval;
        func();
    }
    

    Ändere jetzt mal den Rückgabewert von get_input_hash(), dann stürzt es ab.
    get_input_hash() nimmt die Passworteingabe des Users entgegen und liefert einen Hashwert daraus zurück.

    Es wird keine if-Verzweigung benötigt.
    Prinzip verstanden?



  • Leprechaun schrieb:

    Ändere jetzt mal den Rückgabewert von get_input_hash(), dann stürzt es ab.

    lol? Das ist ja viel einfacher zu Hacken als ein if. Musst nur das 0x12345678 mit einem dir bekannten Hash ersetzen.


Log in to reply