none
Threading(Parallele Prozesse) klapp nicht RRS feed

  • 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();
                    }
                }
            }
        }

    Samstag, 11. November 2017 13:48

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

    Sonntag, 12. November 2017 13:56

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
    Samstag, 11. November 2017 14:07
  • Hi,
    was macht denn brute_force bzw brute_force.GetCpuProzent?

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Samstag, 11. November 2017 17:10
  • 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
    Sonntag, 12. November 2017 12:46
  • 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

    Sonntag, 12. November 2017 13:56