/// <summary> /// Metoda bežící ve vlákně /// </summary> /// <param name="inf">Informace předávané dovnitř vlákna</param> private void Cracker(object inf) { CrackerInfo Info = (CrackerInfo)inf; // Data z předané struktury short CharsetLength = (short)Info.Charset.Length; int MaximumLength = Info.MaxLength; UInt64 Combinations = (UInt64)Math.Pow((double)CharsetLength, (double)MaximumLength); string Test = String.Empty; for (Progress = 0; Progress < Combinations; Progress++) { // Pokračuj jen v případě, že se podaří získat vlastictví uzamykacího objektu, jinak na něj čekej. lock (LockObject) { Test = String.Empty; int[] Digits = ConvertToBase(Progress, CharsetLength); // Převeď číslo do daného číselného základu // Vytvoř z čísla v daném základu text for (int j = 0; j < Digits.Length; j++) { Test += Info.Charset[Digits[j]]; } // Porovnej zahashovaný text se vstupem if (Info.Hash.ToLower() == Info.F(Test).ToLower()) { FoundPassword = Test; break; } } } }
private void buttonStartStop_Click(object sender, EventArgs e) { if (CrackingThread == null) { // Vytvoř a naplň strukturu CrackerInfo pro vlákno které bude crackovat CrackerInfo Info = new CrackerInfo(); Info.Hash = textHash.Text; Info.Charset = textCharset.Text; Info.MaxLength = (int)numericLength.Value; // Vyber delegát daného hashovacího algoritmu podle toho co uživatel vybral v políčku Algoritmus switch (comboAlgo.SelectedIndex) { case 0: Info.F = new HashFunction(MD5Hash); break; case 1: Info.F = new HashFunction(SHA1Hash); break; case 2: Info.F = new HashFunction(SHA256Hash); break; case 3: Info.F = new HashFunction(RIPEMD160Hash); break; default: Info.F = new HashFunction(MD5Hash); break; } labelResult.Visible = false; FoundPassword = null; // Vytvoř a spusť vlákno CrackingThread = new Thread(new ParameterizedThreadStart(Cracker)); CrackingThread.Start(Info); groupInput.Enabled = false; buttonStartStop.Text = "Pozastavit"; } else if (CrackingThread.ThreadState == ThreadState.Running) { // Získej vlastnictví uzamykacího objektu a pozastav tak vlákno buttonStartStop.Text = "Obnovit"; Monitor.Enter(LockObject); } else if (CrackingThread.ThreadState == ThreadState.WaitSleepJoin) { // Uvolni vlastnictví uzakmykacího objektu a umožni vláknu pokračovat Monitor.Exit(LockObject); buttonStartStop.Text = "Pozastavit"; } }
private void buttonStartStop_Click(object sender, EventArgs e) { if (CrackingThread == null) { // Vytvoř a naplň strukturu CrackerInfo pro vlákno které bude crackovat CrackerInfo Info = new CrackerInfo(); Info.Hash = textHash.Text; Info.Charset = textCharset.Text; Info.MaxLength = (int)numericLength.Value; // Vyber delegát daného hashovacího algoritmu podle toho co uživatel vybral v políčku Algoritmus switch (comboAlgo.SelectedIndex) { case 0: Info.F = new HashFunction(MD5Hash); break; case 1: Info.F = new HashFunction(SHA1Hash); break; case 2: Info.F = new HashFunction(SHA256Hash); break; case 3: Info.F = new HashFunction(RIPEMD160Hash); break; default: Info.F = new HashFunction(MD5Hash); break; } labelResult.Visible = false; FoundPassword = null; // Vytvoř a spusť vlákno CrackingThread = new Thread(new ParameterizedThreadStart(Cracker)); CrackingThread.Start(Info); groupInput.Enabled = false; buttonStartStop.Text = "Pozastavit"; } else if (CrackingThread.ThreadState == ThreadState.Running) { // Získej vlastnictví uzamykacího objektu a pozastav tak vlákno buttonStartStop.Text = "Obnovit"; Monitor.Enter(LockObject); } else if (CrackingThread.ThreadState == ThreadState.WaitSleepJoin) { // Uvolni vlastnictví uzakmykacího objektu a umožni vláknu pokračovat Monitor.Exit(LockObject); buttonStartStop.Text = "Pozastavit"; } }