/// <summary> /// Obtiene los AllowedChars desde varias cadenas de strings /// </summary> /// <param name="alloweds">Caracteres permitidos</param> public static BruteForceAllowedChars[] SplitAllowed(params string[] alloweds) { BruteForceAllowedChars[] ar = new BruteForceAllowedChars[alloweds.Length]; for (int x = 0; x < ar.Length; x++) { ar[x] = new BruteForceAllowedChars(alloweds[x]); } return(ar); }
/// <summary> /// Separa una palabra en todos los posibles caracteres que puede tener cada caracter /// </summary> /// <param name="word">Palabra a separar</param> public static BruteForceAllowedChars[] SplitWordMixed(string word, EMixCase mixCase) { BruteForceAllowedChars[] ar = new BruteForceAllowedChars[word.Length]; for (int x = 0; x < ar.Length; x++) { ar[x] = new BruteForceAllowedChars(word[x], true, mixCase == EMixCase.All || (mixCase == EMixCase.OnlyFirst && x == 0)); } return(ar); }
public BruteForceAllowedChars[] Get() { if (MixCase == BruteForceAllowedChars.EMixCase.None) { return new BruteForceAllowedChars[] { new BruteForceAllowedChars(Input) } } ; return(BruteForceAllowedChars.SplitWordMixed(Input, MixCase)); } }
static bool Increment(int[] indexes, char[] current, BruteForceAllowedChars[] chars) { int position = indexes.Length - 1; while (position >= 0) { indexes[position]++; BruteForceAllowedChars ch = chars[position]; if (indexes[position] < ch.Allowed.Length) { current[position] = ch.Allowed[indexes[position]]; return(true); } indexes[position] = 0; current[position] = ch.Allowed[0]; position--; } return(false); }
public check(string input, BruteForceAllowedChars.EMixCase mix) { Input = input; MixCase = mix; }
/// <summary> /// Separa una palabra en todos los posibles caracteres que puede tener cada caracter /// </summary> /// <param name="word">Palabra a separar</param> public static BruteForceAllowedChars[] SplitWordMixed(string word, EMixCase mixCase) { BruteForceAllowedChars[] ar = new BruteForceAllowedChars[word.Length]; for (int x = 0; x < ar.Length; x++) { ar[x] = new BruteForceAllowedChars(word[x], true, mixCase == EMixCase.All || (mixCase == EMixCase.OnlyFirst && x == 0)); } return ar; }
/// <summary> /// Obtiene los AllowedChars desde varias cadenas de strings /// </summary> /// <param name="alloweds">Caracteres permitidos</param> public static BruteForceAllowedChars[] SplitAllowed(params string[] alloweds) { BruteForceAllowedChars[] ar = new BruteForceAllowedChars[alloweds.Length]; for (int x = 0; x < ar.Length; x++) ar[x] = new BruteForceAllowedChars(alloweds[x]); return ar; }
static bool Increment(int[] indexes, char[] current, BruteForceAllowedChars[] chars) { int position = indexes.Length - 1; while (position >= 0) { indexes[position]++; BruteForceAllowedChars ch = chars[position]; if (indexes[position] < ch.Allowed.Length) { current[position] = ch.Allowed[indexes[position]]; return true; } indexes[position] = 0; current[position] = ch.Allowed[0]; position--; } return false; }
static IEnumerable<string> GetAllMatches(BruteForceAllowedChars[] chars, string prefix, string suffix) { int length = chars.Length; int[] indexes = new int[length]; char[] current = new char[length]; for (int i = 0; i < length; i++) current[i] = chars[i].Allowed[0]; do { yield return prefix + new string(current) + suffix; } while (Increment(indexes, current, chars)); }
/// <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; }