eigenes Programm PW Abfrage einbinden.

  • VB.NET

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von Ruerte.

    eigenes Programm PW Abfrage einbinden.

    Ich würde gerne bevor man ein Programm von mir öffnet, ein Passwort eingeben muss. Jetzt weiß ich nicht wie ich vorgehen soll, wegen dem speichern des Passworts(denke mal Datenbank).
    Es soll einfach eine PW Abfrage sein, beim ersten öffnen, soll das Passwort direkt gesetzt werden.
    wäre nett wenn mir einer helfen könnte
    Hast Du bedacht, dass sich ein .NET-Programm mit dem IlSpy einfach so lesen lässt?
    Ist Dein Programm so schützenswert?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @iEi:: Aber doch nicht mit einer Passwortabfrage, da gäbe es den Obfuscator.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich meine wenn man mein Programm ganz normal startet soll ein Fenster kommen wo man PW usw eingeben muss, damit man Zugriff auf die normale Funktion des Programms hat! Ging mir nicht darum den Code zu verschlüsseln oder sicher zu machen.
    Ich weiß jetzt nicht wie ich das PW das eingegeben wurde (beim ersten Start) speichern soll.
    (Das PW sollte nicht lokal in einer Datei gespeichert werden, also kein My.settings)

    Eine andere Möglichkeit wäre,
    Mein Programm erstellt eine Textdatei und diese sollen nur wenn man das richtige Passwort eingibt, ausgelesen werden können.
    Nun hab ich 0 Ahnung über Datenbanken, gibt ja verschiedene Arten und welche wäre jetzt für mein Anliegen am besten geeignet?
    @RushDen: Das ist soziemlich unmöglich. Du musst irgendwo im Programm mal eine Abfrage haben, wo Code übersprungen wird (oder eben nicht), der die Funktionen des Programmes aktiviert.
    Das ist im IL-Code meist ein brtrue.s oder brfalse.s.
    Ein Beispiel:

    VB.NET-Quellcode

    1. Sub AmStart()
    2. 'Das Passwort kommt natürlich vom Benutzer und steht nicht so im Code, ist aber nur ein Beispiel.
    3. If PasswordHelper.IsValidPassword("Das soll jetzt nur eine Benutzereingabe darstellen.") Then
    4. EnableStuff()
    5. End If
    6. End Sub

    Wird zu dem hier kompiliert:

    Quellcode

    1. .method public instance void AmStart () cil managed
    2. {
    3. .maxstack 8
    4. IL_0000: ldstr "Das soll jetzt nur eine Benutzereingabe darstellen."
    5. IL_0005: call bool WindowsApplication1.PasswordHelper::IsValidPassword(string)
    6. IL_000a: brfalse.s IL_0012
    7. IL_000c: ldarg.0
    8. IL_000d: callvirt instance void WindowsApplication1.Form1::EnableStuff()
    9. IL_0012: ret
    10. } // end of method Form1::AmStart

    Da wird zuerst der Passwort-String auf den Stack gelegt und dann wird eine Funktion aufgerufen, die True zurückgibt, wenn das Passwort gültig ist und False, wenn nicht. Diese Funktion kann noch so sicher sein, aber das bringt Dir nichts, denn:
    Anschließend befindet sich dieser Boolean, der von der Funktion zurückkommt auf dem Stack. Dann kommt eine brfalse.s -Anweisung. Sollte der Boolean also False sein, wird zum angegebenen Sprungziel gesprungen. Wenn True, wird nicht gesprungen und die EnableStuff-Methode wird aufgerufen. Und hier liegt das Problem. Es gibt genügend Tools, die IL-Code editieren können. Eines davon heißt beispielsweise GrayWolf. Da ändert man die Zeile einfach auf brtrue.s und schon funktionieren alle falschen passwörter (und richtige würden geblockt werden).
    Oder man ändert die Methode so um (Die Adressen stimmen dann natürlich nicht mehr, aber das ignorieren wir mal):

    Quellcode

    1. .method public instance void AmStart () cil managed
    2. {
    3. .maxstack 8
    4. IL_0000: ldstr "Das soll jetzt nur eine Benutzereingabe darstellen."
    5. IL_0005: call bool WindowsApplication1.PasswordHelper::IsValidPassword(string)
    6. pop
    7. ldc.i4.1
    8. IL_000a: brfalse.s IL_0012
    9. IL_000c: ldarg.0
    10. IL_000d: callvirt instance void WindowsApplication1.Form1::EnableStuff()
    11. IL_0012: ret
    12. } // end of method Form1::AmStart

    Dann wird der Boolean, der von der Funktion kommt einfach verworfen, True wird auf den Stack geladen und dann geht's normal weiter. Und natürlich wird dann nie gesprungen, weil immer True auf dem Stack ist.

    Fazit: Mit .Net ist das unmöglich.


    Sogar mit C++ wäre es noch editierbar, aber nativen Code zurück in lesbaren Code zu verwandeln ist nahezu unmöglich. Deshalb ist es relativ (nicht total) sicher.

    Das Problem ist einfach, sobald die Daten auf dem Computer des Clients landen hast Du verloren. Du müsstest den entsprechenden Code auslagern. Das ist aber keine einfache Aufgabe. Denn der Code darf nie auf dem Computer des Clients ankommen (sonst hat er ihn ja).


    Edit aus der Zukunft:
    Siehe auch Post #19
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Niko Ortner“ ()

    hää ich versteh nicht was ihr meint, aber unmöglich ist es bestimmt nicht. Ich schreib mal stichpunktweise was ich versuche^^

    -Ich habe ein Programm welches von MIR geschrieben wurde.
    -Ich erstelle eine zweite Form wo man ein Passwort eingeben muss und das als aller erstes erscheint wenn man das Programm startet. wenn man das Passwort falsch eingibt, dann bleibt sie solange bis man das Programm schliesst oder das richtige Passwort eingibt
    -Wenn man dann das richtige Passwort eingibt erscheint das eigentliche Programm
    -Nun soll der Benutzer beim ersten Start in die Form das Passwort konfigurieren (also bestimmen), aber irgendwo muss es ja gespeichert werden, damits beim nächsten Start noch da ist.
    -Es darf bei der Speicherung keine Datei (lokal) entstehen.
    Speicher das vom User vorgegebene Passwort in den Settings.
    Ein anderer User am selben PC sollte ein anderes LogIn und damit einen anderen Userbereich und damit ein anderes Passwort haben.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RushDen schrieb:

    weil man das PW dann einfach auslesen kann
    Der Benutzer, der sich ordentlich eingeloggt hat.
    Wenn er den Rechner verlässt und ihn nicht sperrt sollte er nicht würdig sein, Dein Programm benutzen zu dürfen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hm naja.., also ich schau mir dann erstmal das PHP tutorial an, wenns nicht anders geht mach ichs dann über My.Settings.

    Die PHP Dateien da im Tutorial müssen ja auf einer Datenbank hochgeladen werden? Wie erstell ich so ne Datenbank überhaupt?
    Ansonsten versteh ich auch nicht wozu der Link im Code ist ? Ich hab keine Webseite wo man sich registrieren soll.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RushDen“ ()

    php ist nur eine etwas abstruse Art, einen Proxi zu erstellen.
    Bessere Proxi-Funktionalität erhälst du, wenn du die zulässigen DB-Abfragen gleich inne MySql-DB anlegst, und dem User nur Rechte auf diese StoredProcs zubilligst.

    Son Proxi ist schonmal ein Stück Sicherheit, die gewährleistet, dass eine gehackte Kommunikation nur einen User blosstellt - nicht die ganze Datenbank.

    Sicher wird eine Kommunikation erst, wenn sie zusätzlich noch über TLS abgewickelt wird.

    Also ehe ich php lernen würde, würde ich das Rechte-Verteilungs-System von MySql studieren, und wie man da StoredProcs anlegen kann.
    Ich bin immer erschüttert über die niederschmetternden Kommentare zum Thema Passwort.
    Wenn das Programm auf einem lokalen PC läuft, nicht mit einem Server oder einer Datenbank kommuniziert und keine
    Daten aus dem Internet holt - für was brauch ich dann PHP, Whatever-Sql, Obfuskation oder sonst etwas?

    Für rein lokale Anwendungen gibt es keinen Schutz, sobald der User Kontrolle über den PC hat.
    Dann stellt sich nur die Frage, wie schwer will ich es dem Naseweis oder mir machen...

    Um 'Daddy' auszusperren oder die Geschwister, reicht es u. U. die Passwörter fest im Code zu verdrahten.
    Für schlauere Väter und Geschwister hashe ich vielleicht mein Passwort und speichere diesen verschlüsselt in einer Datei.
    (Legt MySettings eine Datei an?)
    Oder ich verwende einen Dongle. :thumbsup:

    Vielleicht sollte man sich erst einmal darüber im Klaren sein, wo und wie das Programm läuft und wie sicher es sein muss.
    Für erste Gehversuche reicht doch was einfaches...
    Das Leben ist nicht so kompliziert. Eine süsse Erinnerung tut's.
    Indiana Jocutus - Jäger des Variablen-Schatzes
    Ich erkläre es nochmal.
    Ein für .Net geschriebenes Programm (und ein In Visual Basic 2010 geschriebenes Programm ist ein Programm für .Net) kann man problemlos dekompilieren (Siehe ILSpy) und auch editieren (Siehe GrayWolf). Da kannst Du noch so viel passwortschützen und per PHP auf eine Datenbank zugreifen. Wenn der Code, den Du passwortschützen willst, auf dem Rechner des Clients liegt, kommt er auch dran.

    Schau mal hier:

    Ich hab mal auf meinen WebSpace ein PHP-Script hochgeladen:

    PHP-Quellcode

    1. <?php
    2. if (isset($_GET["pw"]) && $_GET["pw"] === "GanzGeheimesPasswort")
    3. {
    4. echo "True";
    5. }
    6. else
    7. {
    8. echo "False";
    9. }
    10. ?>

    Und hier das Programm:
    mit 'ner hochprofessionellen GUI:

    Und das ist der Code:

    VB.NET-Quellcode

    1. Private Sub Login() Handles Button_Login.Click
    2. Dim WC As New Net.WebClient
    3. If Convert.ToBoolean(WC.DownloadString("http://sendmessageservice.heliohost.org/stuff/vbp/checkpassword.php?pw=" & TextBox_PW.Text)) Then
    4. Button_HackPentagon.Visible = True
    5. Button_Login.Enabled = False
    6. Label_Message.Text = "Eingeloggt"
    7. Else
    8. Label_Message.Text = "Falsches Passwort"
    9. End If
    10. End Sub

    Gibt man das richtige Passwort ein, darf man das Pentagon hacken:

    Gibt man ein falsches Passwort ein, muss man nochmal probieren:


    Jetzt spielen wir mal Angreifer und tun so, als würden wir nichts wissen.
    Schauen wir uns das mal in ILSpy an:

    Ach super, da wird einfach das Passwort gesendet und zurück kommt etwas, was in einen Boolean konvertiert wird. True, wenn's passt und False, wenn nicht.
    Programm in GrayWolf öffnen:

    Super. Bei Offset 38 wird der Boolean geprüft.
    Schnell zwei Zeilen reineditiert:

    (Das sind genau die Zeilen von oben)
    Auf Speichern klicken und die existierende Datei überschreiben.
    Und schon können wir irgend 'nen Blödsinn eingeben und wir dürfen trotzdem das Pentagon hacken:


    .Net-Programme sind nicht sicher!
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    @Niko Ortner

    Bitte lies dir alles durch was hier steht.
    Der Code ist mir egal, den stell ich sogar gern frei zur verfügung, ich will nur dass ich ein Passwort eingeben muss um eine Textdatei entschlüsseln zu können.
    Das Entschlüsseln hierbei ist Teil meines Programms, sowie das Verschlüsseln der Textdatei und das erstellen der Textdatei
    Verstehst du jetzt was ich meine?