/// <summary> /// Lanza el proceso de fuerza bruta /// </summary> /// <param name="length">Tamaño</param> /// <param name="prefix">Prefijo de la contraseña</param> /// <param name="suffix">Sufijo de la contraseña</param> /// <param name="threads">Hijos a lanzar</param> /// <param name="action">Acción a realizar</param> public static int Run(BruteForceAllowedChars[] length, string prefix, string suffix, int threads, IBruteForceAction action) { CancellationTokenSource cancel = new CancellationTokenSource(); action.CancellationTokenTask = cancel; bool multiple = action.AllowMultiplePasswords; // Calculo total int lleva = 0, total = 1; foreach (BruteForceAllowedChars c in length) { total *= c.Allowed.Length; } // Contraseña IEnumerable <string> passwords = GetAllMatches(length, prefix, suffix); int founds = 0; // Tarea try { ParallelLoopResult res = Parallel.ForEach <string>(passwords, new ParallelOptions() { MaxDegreeOfParallelism = threads, CancellationToken = cancel.Token }, password => { // Progreso aumentado Interlocked.Increment(ref lleva); // Comprobar contraseña if (action.CheckPassword(password)) { if (multiple || Interlocked.Increment(ref founds) == 1) { SystemSounds.Question.Play(); action.Accept(password); if (!multiple) { action.Cancel(true); } } } // Comprobar si se ha cancelado action.CheckIfNeedCancel(); }); } catch (Exception e) { } return(lleva); }
/// <summary> /// Lanza el proceso de fuerza bruta /// </summary> /// <param name="length">Tamaño</param> /// <param name="prefix">Prefijo de la contraseña</param> /// <param name="suffix">Sufijo de la contraseña</param> /// <param name="threads">Hijos a lanzar</param> /// <param name="action">Acción a realizar</param> public static int Run(BruteForceAllowedChars[] length, string prefix, string suffix, int threads, IBruteForceAction action) { CancellationTokenSource cancel = new CancellationTokenSource(); action.CancellationTokenTask = cancel; bool multiple = action.AllowMultiplePasswords; // Calculo total int lleva = 0, total = 1; foreach (BruteForceAllowedChars c in length) { total *= c.Allowed.Length; } // Contraseña IEnumerable<string> passwords = GetAllMatches(length, prefix, suffix); int founds = 0; // Tarea try { ParallelLoopResult res = Parallel.ForEach<string>(passwords, new ParallelOptions() { MaxDegreeOfParallelism = threads, CancellationToken = cancel.Token }, password => { // Progreso aumentado Interlocked.Increment(ref lleva); // Comprobar contraseña if (action.CheckPassword(password)) { if (multiple || Interlocked.Increment(ref founds) == 1) { SystemSounds.Question.Play(); action.Accept(password); if (!multiple) action.Cancel(true); } } // Comprobar si se ha cancelado action.CheckIfNeedCancel(); }); } catch (Exception e) { } return lleva; }