Bruteforcing von Passwörtern
Aug 21 2020
Vor einem Tag habe ich ein c#-Projekt gestartet, in dem ich Passwörter bruteforce. Passwörter können sowohl Ganzzahlen als auch Zeichenfolgen sein. Im Code überprüfe ich, wie viele Zeichen das Passwort hat. Während dies ein bisschen Betrug ist, würde es zu lange dauern, es sonst zu knacken. Ich poste es hier, um zu sehen, ob es gut genug ist.
using System;
namespace Hacking_Project
{
class Program
{
static void Main()
{
//Console Color
Console.ForegroundColor = ConsoleColor.White;
Console.Clear();
//If password is found
bool done = false;
//If the password is a string, not the best name but ok
bool yes = false;
//If the Guessed password is the same number of characters as the original password
int pass = 0;
//Guessed password
string pass_check = "";
//Possible characters for the password
char[] pos = {'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'};
Console.WriteLine("What is the password?");
//Asking for the password to crack
string password = Console.ReadLine();
//How much characters does the password has. I know that this is kinda cheating, but then the bruteforce would take to much
int digits = password.Length;
//Initialising the random number generator
Random rand = new Random();
//The choices that the calculator will take for the guessed password(int)
int[] choices = new int[digits];
//The choices that the calculator will take for the guessed password(string)
char[] choices1 = new char[digits];
//If the password is a string
for (int i = 0; i < pos.Length; i++)
{
if (password.Contains(pos[i]))
{
password = password.ToLower();
yes = true;
}
}
//The Cracking Part
while (done == false)
{
if (!yes)
{
for (int i = 0; i < digits; i++)
{
choices[i] = rand.Next(0, 9);
pass_check += choices[i];
pass++;
//Console Color
Console.ForegroundColor = ConsoleColor.DarkYellow;
if (pass != digits)
{
Console.Write(choices[i]);
}
else
{
Console.Write(choices[i] + ", ");
}
}
}
else
{
for (int i = 0; i < digits; i++)
{
choices1[i] = pos[rand.Next(pos.Length)];
pass_check += choices1[i];
pass++;
Console.ForegroundColor = ConsoleColor.DarkYellow;
if (pass != digits)
{
Console.Write(choices1[i]);
}
else
{
Console.Write(choices1[i] + ", ");
}
}
}
pass = 0;
if (pass_check == password)
{
Console.ForegroundColor = ConsoleColor.White;
Console.Write("\n\nThe password is: ");
Console.ForegroundColor = ConsoleColor.Green;
Console.Write(pass_check);
Console.ForegroundColor = ConsoleColor.White;
Console.Write("\n\nThe original password is: ");
Console.ForegroundColor = ConsoleColor.Red;
Console.Write(password);
Console.ForegroundColor = ConsoleColor.Blue;
Console.Write("\n\nDo you want to restart?");
Console.ForegroundColor = ConsoleColor.White;
Console.Write(" => ");
string restart = Console.ReadLine();
restart = restart.ToLower();
if (restart == "yes")
{
Main();
}
else if (restart == "no")
{
done = true;
}
}
//If the password is not found, quessed password is set to empty
else
{
pass_check = "";
}
}
}
}
}
Antworten
2 MaLiN2223 Aug 23 2020 at 05:20
Haftungsausschluss: Das Folgende ist nur meine Meinung, bitte behandeln Sie es nicht als Quelle der Wahrheit. Außerdem gehe ich davon aus, dass der Code genau wie erwartet funktioniert - ich werde nicht auf Leistung oder Gültigkeit eingehen.
- Zu viele Kommentare, versuchen Sie stattdessen, den Code so umzugestalten, dass er erklärender ist. Onkel Bob hat es am besten ausgedrückt: „Ein Kommentar ist ein Versäumnis, sich in Code auszudrücken“ (es sei denn, es ist ein „Warum“, das natürlich nicht erklärt werden kann).
- Unterteilen Sie den Code in kleine und einzelne Verantwortungsfunktionen/Klassen, siehe hier für Anleitungen.
- Konsolenbezogene Operationen können an eine separate Klasse (einen Wrapper) delegiert werden, sodass sie in Zukunft einfach erweitert werden kann, um Eingaben/Ausgaben aus anderen Quellen zu verarbeiten. Auch um Duplikate zu vermeiden (z. B.
\n\nkann das Schreiben vor Strings weg abstrahiert werden). - Variablennamen sollten den Inhalt angeben (es sei denn, es ist sehr offensichtlich). Sie haben einen Kommentar geschrieben 'nicht der beste Name, aber ok', ja - es ist nicht der beste Name, aber ich denke nicht, dass er 'ok' ist. Auf halbem Weg durch den Code musste ich nach oben scrollen, um zu überprüfen, was diese Variable bedeutet, das ist nicht richtig. Ähnliches gilt für Variablen wie
choices1,digits,posund andere. while (done == false)könntewhile(!done)es sowohl kürzer als auch erklärender "auf Englisch" sein.- Verwenden Sie ,
Console.WriteLineanstatt hinzuzufügen\n\n(Sie können sogarConsole.WriteLine(""). - Verwenden Sie die While-Schleife anstelle der Rekursion für
Main. Zwei Gründe dafür: Sie können die Stacks überschreiten (was für Menschen unwahrscheinlich ist, aber jeder Bot kann dies problemlos tun) UND es würde von anderen eher erwartet werden, eine Spielschleife als eine rekursive Funktion zu sehen. - Zeigt mögliche Eingabewerte für den Neustart an, der Benutzer könnte versuchen
Y, was nicht funktioniert.