Benutzer mit den meisten Antworten
Threading(Parallele Prozesse) klapp nicht

Frage
-
Hallo Leute, mein Ziel ist es, während einer BruteForce-Attacke parallel die CPU-Auslastung zu messen. Allerdings haut das mit der parallelen Ausführung nicht hin. Die Zeit wird erst nach dem Knacken des Passwortes gemesen. Wie programmiere ich das Threading richtig?
using System; using System.Diagnostics; using System.Threading; namespace BruteForce { class Program { public static Object lockvar = ""; // Lock-Variable static void Main(string[] args) { Thread[] ta = new Thread[2]; // Thread-Array ta[0] = new Thread(new ThreadStart(passwort_cracken)); // Threads werden erzeugt ta[1] = new Thread(new ThreadStart(cpu_messen)); // Threads werden erzeugt ta[0].Start(); // Threads werden gestartet ta[1].Start(); // Threads werden gestartet } public static void passwort_cracken() { lock (lockvar) { char[] ascii = new char[94]; string passwort_coincidenece = ""; char[] passwort = new char[10]; Permutationen brute_force = new Permutationen(); Permutationen number = new Permutationen(); int a = 33; //int asciiValue = (int)char.Parse(categoryName[0].ToString()); for (int i = 0; i < ascii.Length; i++) { ascii[i] = (char)a; a++; } for (int i = 0; i < ascii.Length; i++) { Console.WriteLine("Der ASCII-Wert {0} hat den Buchstaben {1}", i + 48, ascii[i]); } Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("Das Passwort wird per Zufallsgenerator aus obigen ASCII-Werten gebildet"); Console.ForegroundColor = ConsoleColor.White; Console.Write("Länges des Passwortes in Zeichen:"); byte anzahl = Convert.ToByte(Console.ReadLine()); for (int i = 0; i < anzahl; i++) { int[] zahl = number.GetRandomNumber(anzahl); passwort[i] += (char)zahl[i]; a++; } for (int i = 0; i <= passwort.Length; i++) { if (i >= anzahl) break; passwort_coincidenece += passwort[i].ToString(); } //Console.WriteLine("Passwort:{0}", passwort_coincidenece); Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("Die BruteForce-Attacke beginnt..."); //Console.ForegroundColor = ConsoleColor.Red; foreach (string permutationen in brute_force.GetPermutation(anzahl, ascii, passwort_coincidenece)) { } } } public static void cpu_messen() { lock (lockvar) { Stopwatch watch = new Stopwatch(); watch.Start(); Permutationen brute_force = new Permutationen(); Console.ForegroundColor = ConsoleColor.Cyan; Console.WriteLine(brute_force.GetCpuProzent()); Console.WriteLine("\nMaximal benötigte Zeit für einen BruteForeangriff:\n{0} Minuten,{1} Sekunden, {2} Mililsekunden ", watch.Elapsed.Minutes, watch.Elapsed.Seconds, watch.Elapsed.Milliseconds); Console.ReadLine(); } } } }
Antworten
-
Hi,
der vorige Thread in meiner Anzeige ist SQL 2016 temp db zu gross . Falls Du nur Deine Eingaben meinst, so kann ich hier im Forum Threads nicht gefiltert nach einem OP und sortiert anzeigen lassen.Du arbeitest mit Arraylist, was äußerst viel Speicherplatz belegt, nicht typsicher ist und deshalb Typkonvertierungen erfordert und damit langsam ist. Was willst Du da sinnvoll messen?
Anstelle mit ArrayList und string[] zu arbeiten, solltest Du den Weg über das IEnumerable-Interface mit Aufbrechen der abgerufenen Schleife mittels yield arbeiten, wie ich bereits gezeigt habe. Warum mein gepostetes Beispiel nicht funktioniert, wenn man es unverändert in eine leere Anwendung kopiert, kann ich wegen fehlender Rückmeldung von Dir nicht sagen.
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 17. November 2017 07:30
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Mittwoch, 29. November 2017 14:52
Alle Antworten
-
Habe die Lösung. So klappt es,zumindest von der Logik her.Verbesserungen sind jedoch immer erwünscht. Störend ist, dass nach dem Knacken des Passwortes die CPU noch für ca. 5 Sekunden bei einer Auslastung von über 25% verweilt. Außerdem verstehe ich nüscht, warum die letzte Konsolenausgabe der Methode cpu_messen() wie folgt lautet:"Momentane CPU-Auslastung:13%". Diese Ausgabe dürfte doch eigentlich gar nüscht mehr angezeigt werden, da die While-Schleife auf >15 prüft...
using System; using System.Diagnostics; using System.Threading; namespace BruteForce { class Program { public static Object lockvar = ""; // Lock-Variable public static Thread[] thread = new Thread[2]; static void Main(string[] args) { char[] ascii = new char[94]; string passwort_coincidenece = ""; char[] passwort = new char[10]; Permutationen brute_force = new Permutationen(); Permutationen number = new Permutationen(); int a = 33; //int asciiValue = (int)char.Parse(categoryName[0].ToString()); for (int i = 0; i < ascii.Length; i++) { ascii[i] = (char)a; a++; } for (int i = 0; i < ascii.Length; i++) { Console.WriteLine("Der ASCII-Wert {0} hat den Buchstaben {1}", i + 48, ascii[i]); } Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("Das Passwort wird per Zufallsgenerator aus obigen ASCII-Werten gebildet"); Console.ForegroundColor = ConsoleColor.White; Console.Write("Länges des Passwortes in Zeichen:"); byte anzahl = Convert.ToByte(Console.ReadLine()); for (int i = 0; i < anzahl; i++) { int[] zahl = number.GetRandomNumber(anzahl); passwort[i] += (char)zahl[i]; } for (int i = 0; i <= passwort.Length; i++) { if (i >= anzahl) break; passwort_coincidenece += passwort[i].ToString(); } Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("Die BruteForce-Attacke beginnt..."); thread[0] = new Thread(new ThreadStart(cpu_messen)); // Threads werden erzeugt thread[0].Start(); // Thread wird gestartet foreach (string permutationen in brute_force.GetPermutation(anzahl, ascii, passwort_coincidenece)) { //tue nix spezielle hier. Lasse die Methoden der Klasse arbeiten... } } private static void cpu_messen() { lock (lockvar) { Permutationen brute_force = new Permutationen(); Stopwatch watch = new Stopwatch(); watch.Start(); Console.ForegroundColor = ConsoleColor.Cyan; while (brute_force.GetCpuProzent() > 20) { Console.WriteLine("Momentane CPU-Auslastung {0}%",brute_force.GetCpuProzent()); } zeit_ausgeben(watch); } } private static void zeit_ausgeben(Stopwatch watch) { Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("\nMaximal benötigte Zeit für einen BruteForeangriff:\n{0} Minuten,{1} Sekunden, {2} Mililsekunden ", watch.Elapsed.Minutes, watch.Elapsed.Seconds, watch.Elapsed.Milliseconds); Console.ReadLine(); } } }
- Bearbeitet tklustig Samstag, 11. November 2017 14:44
-
Hi,
was macht denn brute_force bzw brute_force.GetCpuProzent?--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks -
Dasselbe,wie im vorigen Thread. Da Dein dortiger Lösungsvorschlag nicht funktioniert(e), habe ich nach wie vor folgenden fehlerhaften rekursiven Algorithmus,der nach dem Knacken des Passwortes nicht abbricht:
using System; using System.Collections; using System.Diagnostics; using System.Threading; namespace BruteForce { class Permutationen { /*static Permutationen cpuCounter; // globaler PerformanceCounter public string CategoryName { get; set; } public string CounterName { get; set; } public string InstanceName { get; set; } */ PerformanceCounter CPU_messen = new PerformanceCounter("Processor Information", "% Processor Time", "_Total"); private int auslastung_aktuell; public int GetCpuProzent() { CPU_messen.NextValue(); // Als Referenzwert für den Counter Thread.Sleep(1000); //1 Sekunde Warten, um so ein Update zu ermöglichen auslastung_aktuell = (int)CPU_messen.NextValue(); return auslastung_aktuell; } public int[] GetRandomNumber(byte anzahl) { Random zufall = new Random(); int[] number = new int[anzahl]; for (int i = 0; i < anzahl; i++) { number[i] = zufall.Next(48, 127); } return number; } /*Generiert ein Array, aus Elementen die jeweils aus 'zeichen' unterschiedlichen Zeichen bestehen, mit jeweils 'anzahl' Stellen. Das Array beinhaltet alle möglichen Verknüpfungsmöglichkeiten, die durch Permutation ermittelt werden.*/ public string[] GetPermutation(byte anzahl, char[] zeichen, string passwort) { // Eine neue, leere ArrayList generieren, an die alle Möglichkeiten angehängt werden ArrayList output = new ArrayList(); GetPermutationPerRef(passwort, anzahl, zeichen, ref output); // Das Ergebnis in einen string[] umwandeln und zurückgeben return output.ToArray(typeof(string)) as string[]; } /* Generiert ein Array, aus Elementen die jeweils aus 'zeichen' unterschiedlichen Zeichen bestehen, mit jeweils 'anzahl' Stellen. Das Array beinhaltet alle möglichen Verknüpfungsmöglichkeiten, die durch Permutation ermittelt werden. Das Ergebnis wird in der als Referenz übergebenen ArrayList 'output' gespeichert.*/ public void GetPermutationPerRef(string passwort, int anzahl, char[] zeichen, ref ArrayList output, string outputPart = "") { if (anzahl == 0) { // Wenn die Anzahl der Stellen durchgerechnet wurde, // wird der sich ergebende string (Element) an die Ausgabe angehängt. output.Add(outputPart); //Console.WriteLine(outputPart); } else { // Für die Stelle rechts im Element, werden alle Zeichenmöglichkeiten durchlaufen foreach (char c in zeichen) { // Danach wird für jedes dieser Zeichen, basierend auf der Anzahl der Stellen, wieder ein neuer // foreach-Vorgang begonnen, der alle Zeichen der nächsten Stelle hinzufügt if (outputPart + c == passwort) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Passwort wurde geknackt.Es lautet {0}", outputPart + c); Console.ForegroundColor = ConsoleColor.White; break; } else { output.Clear(); } GetPermutationPerRef(passwort, anzahl - 1, zeichen, // Benötigte Variablen werden ref output, // mitübergeben outputPart + c); } } } } }
- Bearbeitet tklustig Sonntag, 12. November 2017 12:48
-
Hi,
der vorige Thread in meiner Anzeige ist SQL 2016 temp db zu gross . Falls Du nur Deine Eingaben meinst, so kann ich hier im Forum Threads nicht gefiltert nach einem OP und sortiert anzeigen lassen.Du arbeitest mit Arraylist, was äußerst viel Speicherplatz belegt, nicht typsicher ist und deshalb Typkonvertierungen erfordert und damit langsam ist. Was willst Du da sinnvoll messen?
Anstelle mit ArrayList und string[] zu arbeiten, solltest Du den Weg über das IEnumerable-Interface mit Aufbrechen der abgerufenen Schleife mittels yield arbeiten, wie ich bereits gezeigt habe. Warum mein gepostetes Beispiel nicht funktioniert, wenn man es unverändert in eine leere Anwendung kopiert, kann ich wegen fehlender Rückmeldung von Dir nicht sagen.
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 17. November 2017 07:30
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Mittwoch, 29. November 2017 14:52