/// <summary> /// Create the Mask Table the PayloadMasker will use /// </summary> /// <param name="Seed">The seed will be used to randomize the start position</param> /// <param name="MaxLength">The maximum length in bytes to bruteforce</param> /// <param name="OutStream">The stream for writing the output</param> public static void CreateMaskTable(int Seed, ushort MaxLength, Stream OutStream) { if (!OutStream.CanWrite) { throw new Exception("OutStream does not have Write"); } if (MaxLength <= 0) { throw new Exception("MaxLength should be atleast 1 or higher"); } Stopwatch sw = Stopwatch.StartNew(); ulong Speed = 0; double PrevVal = 0; double MaxVal = 0; List <double> Digits = new List <double>(); DataShuffler dataShuffler = new DataShuffler(Seed); for (double i = 0, h = 8; i < MaxLength; i++, h += 8) { int ByteIndex = (int)i + 1; PrevVal = MaxVal; MaxVal = Math.Pow(2, h); ProgressHelper progressHelper = new ProgressHelper((ulong)(MaxVal - PrevVal)); for (double j = PrevVal; j < MaxVal; j++) { byte[] num = BitConverter.GetBytes((ulong)j); Speed++; Digits.Add(j); progressHelper.Update(1); if (Digits.Count > 10000000) { SaveMaskTable(ref Digits, ref dataShuffler, ByteIndex, ref OutStream); } if (sw.ElapsedMilliseconds >= 1000) { Console.WriteLine(num[0].ToString("X4") + " " + num[1].ToString("X4") + " " + num[2].ToString("X4") + " " + num[3].ToString("X4") + " " + num[4].ToString("X4") + " " + num[5].ToString("X4") + " " + num[6].ToString("X4") + " " + num[7].ToString("X4")); TimeSpan ETA = progressHelper.TimeLeft; Console.WriteLine("Speed " + Speed + " a second, current byte length: " + ByteIndex + ", " + progressHelper.Progress + "% done, Time Left:" + ETA.Hours.ToString("D2") + ":" + ETA.Minutes.ToString("D2") + ":" + ETA.Seconds.ToString("D2")); Speed = 0; sw = Stopwatch.StartNew(); } } SaveMaskTable(ref Digits, ref dataShuffler, ByteIndex, ref OutStream); } }
private static void SaveMaskTable(ref List <double> Digits, ref DataShuffler dataShuffler, int ByteIndex, ref Stream OutStream) { if (Digits.Count == 0) { return; } Console.WriteLine("Digits:" + Digits.Count); PayloadWriter pw = new PayloadWriter(); double[] Shuffled = dataShuffler.Shuffle <double>(Digits.ToArray(), 1, (double progress, TimeSpan TimeLeft, int speed) => { if ((int)progress % 5 == 0.0F) { Console.WriteLine("Shuffle progress:" + progress + ", Speed: " + speed + ", Time Left: " + TimeLeft.Hours.ToString("D2") + ":" + TimeLeft.Minutes.ToString("D2") + ":" + TimeLeft.Seconds.ToString("D2")); } }); for (int k = 0; k < Shuffled.Length; k++) { int Target = (int)Shuffled[k]; pw.WriteByte((byte)ByteIndex); //byte length if (ByteIndex >= 1 || ByteIndex <= 3) //play it safe { pw.WriteUInteger((uint)Target); } else { pw.WriteDecimal(Target); } if (pw.Length >= 65535) { OutStream.Write(pw.GetBuffer(), 0, pw.Length); OutStream.Flush(); pw = new PayloadWriter(); } } if (pw.Length > 0) { OutStream.Write(pw.GetBuffer(), 0, pw.Length); OutStream.Flush(); } pw.Dispose(); Digits.Clear(); }