BruteForceAttack

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ihave2WinKeys
User
Beiträge: 1
Registriert: Samstag 15. Mai 2021, 11:54

Hallo, ich bedanke mich bereits im voraus für eure Hilfe.

Mein Wunsch ist es ein BruteForce Script/Programm zu erstellen. Das Grundprinzip habe ich bereits. Mein Wunsch ist es aber ein PDF auswählen zu können (im Gui) und danach das Passwort zu knacken.

Wichtig: es ist für ein Schulprojekt

Mein Code bisher:

import random
import string
import pyautogui

chars = string.printable
chars_list = list(chars)

password = pyautogui.password("Enter a password: ")

guess_password = ""

while(guess_password != password):
guess_password = random.choices(chars_list, k=len(password))

print(str(guess_password))

if(guess_password == list(password)):
print("Your password is: "+ "".join(guess_password))
break
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ihave2WinKeys: ``while`` und ``if`` sind keine Funktionen, das sollte man also auch nicht so schreiben das es so aussieht als wären es welche. Die Klammern gehören da nicht um die Bedingungen.

`chars` ist nur ein anderer Name für `string.printable` und macht hier nicht wirklich Sinn. `chars` wird auch nur einmal verwendet.

Grunddatentypen haben nichts in Namen verloren. Man ändert gerade Containertypen gerne mal im Laufe der Programmentwicklung, und dann hat man entweder falsche, irreführende Namen im Programm, oder muss überall die betroffenen Namen anpassen. `chars_list` wäre also einfach `chars`. Oder `characters` wenn man sich die etwas kryptische Abkürzung verkneift.

Allerdings ist das auch gar nicht nötig die Zeichenkette in eine Liste umzuwandeln, denn `random.choices()` kommt mit beliebigen Sequenzen als erstem Argument klar. Also alles was eine Länge mit `len()` liefert und per Indexzugriff Elemente liefert. Das tun Zeichenketten auch.

Der Code geht nicht richtig mit dem Fall um das der Benutzer bei der Eingabe des Passworts den Dialog auch einfach abbrechen kann.

Es wird auch nicht geprüft ob der Benutzer sich bei der Eingabe auf die Zeichen in `string.printable` beschränkt hat. Wenn der beispielsweise einen Umlaut eingibt, oder das €-Zeichen, oder §, oder… — dann läuft das Problem endlos.

Muss das überhaupt ein Dialog sein, wenn die Ausgabe via `print()` erfolgt? In der Standardbibliothek gibt es das `getpass`-Modul.

`guess_password` heisst „rate passwort“, wäre also ein guter Name für eine Funktion, aber nicht fpr ein „geratenes password“.

Es werden an diesen Namen auch unterschiedliche Datentypen gebunden, was verwirrend ist. Es sorgt zum Beispiel dafür, dass die Bedingung der ``while``-Schleife *immer* wahr ist, denn da nach dem ersten Schleifendurchlauf Listen mit Zeichenketten verglichen und die sind *immer* ungleich, selbst wenn die Liste die gleichen Zeichen enthält aus der auch die Zeichenkette besteht ist diese Bedingung wahr.

Selbst wenn das nicht der Fall wäre, ist das ungünstig bis falsch vor einer ``while``-Schleife eine Variable mit einem Dummywert zu belegen, damit die Schleifenbedingung am Anfang wahr ergibt. Das sind in aller Regel ``while True:``-Schleifen, die im Schleifenkörper dann entsprechend mit einer Prüfung und ``break`` verlassen werden. Das steht da ja sogar in der Schleife.

`print()` wandelt die auszugebenden Objekte in Zeichenketten um. Das muss man nicht selbst machen. Der `str()`-Aufruf dort ist überflüssig.

Statt das eingegebene Passwort für jeden Vergleich in eine Liste umzuwandeln und das geratene Passwort im Erfolgsfall in eine Zeichenkette, wäre es sinnvoller das geratene Passwort gleich beim erzeugen in einer Zeichenkette umzuwandeln, denn das ist ja letztlich der ”natürliche” Datentyp für ein Passwort.

Da im Passwort auch Leerzeichen vorkommen können, sollte man die Ausgabe des gefundenen Passwortes durch eindeutige Zeichen begrenzen, denn sonst kann der Benutzer "foo" und "foo " nicht voneinander unterscheiden.

Zwischenstand (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python3
import random
import string
from getpass import getpass


def main():
    password = getpass("Enter a password: ")
    if password:
        while True:
            guessed_password = "".join(
                random.choices(string.printable, k=len(password))
            )
            print(guessed_password)
            if guessed_password == password:
                print(f"Your password is: {guessed_password!r}")
                break


if __name__ == "__main__":
    main()
So wirklich die Definition von „brute force“ trifft das aber nicht. Das wäre wenn man systematisch alle Möglichkeiten durchprobiert, und nicht Zufällige.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten