/// <summary>
        /// Opens a browser of the given type (if not already open) and with the given settings.
        /// </summary>
        /// <param name="data">The BotData where the settings are stored.</param>
        public static void OpenBrowser(BotData data)
        {
            if (!data.BrowserOpen)
            {
                data.Log(new LogEntry("Opening browser...", Colors.White));

                switch (data.GlobalSettings.Selenium.Browser)
                {
                case BrowserType.Chrome:
                    try
                    {
                        ChromeOptions       chromeop      = new ChromeOptions();
                        ChromeDriverService chromeservice = ChromeDriverService.CreateDefaultService();
                        chromeservice.SuppressInitialDiagnosticInformation = true;
                        chromeservice.HideCommandPromptWindow = true;
                        chromeservice.EnableVerboseLogging    = false;
                        chromeop.AddArgument("--log-level=3");
                        chromeop.BinaryLocation = data.GlobalSettings.Selenium.ChromeBinaryLocation;
                        if (data.GlobalSettings.Selenium.Headless || data.ConfigSettings.ForceHeadless)
                        {
                            chromeop.AddArgument("--headless");
                        }
                        else if (data.GlobalSettings.Selenium.ChromeExtensions.Count > 0)     // This should only be done when not headless
                        {
                            chromeop.AddExtensions(data.GlobalSettings.Selenium.ChromeExtensions
                                                   .Where(ext => ext.EndsWith(".crx"))
                                                   .Select(ext => Directory.GetCurrentDirectory() + "\\ChromeExtensions\\" + ext));
                        }
                        if (data.ConfigSettings.DisableNotifications)
                        {
                            chromeop.AddArgument("--disable-notifications");
                        }
                        if (data.ConfigSettings.CustomCMDArgs != string.Empty)
                        {
                            chromeop.AddArgument(data.ConfigSettings.CustomCMDArgs);
                        }
                        if (data.ConfigSettings.RandomUA)
                        {
                            chromeop.AddArgument("--user-agent=" + SpiceRUA.GetiPhoneUA());
                        }
                        else if (data.ConfigSettings.CustomUserAgent != string.Empty)
                        {
                            chromeop.AddArgument("--user-agent=" + data.ConfigSettings.CustomUserAgent);
                        }

                        if (data.UseProxies)
                        {
                            chromeop.AddArgument("--proxy-server=" + data.Proxy.Type.ToString().ToLower() + "://" + data.Proxy.Proxy);
                        }

                        data.Driver = new ChromeDriver(chromeservice, chromeop);
                    }
                    catch (Exception ex) { data.Log(new LogEntry(ex.ToString(), Colors.White)); return; }

                    break;

                case BrowserType.Firefox:
                    try
                    {
                        FirefoxOptions       fireop      = new FirefoxOptions();
                        FirefoxDriverService fireservice = FirefoxDriverService.CreateDefaultService();
                        FirefoxProfile       fireprofile = new FirefoxProfile();

                        fireservice.SuppressInitialDiagnosticInformation = true;
                        fireservice.HideCommandPromptWindow = true;
                        fireop.AddArgument("--log-level=3");
                        fireop.BrowserExecutableLocation = data.GlobalSettings.Selenium.FirefoxBinaryLocation;
                        if (data.GlobalSettings.Selenium.Headless || data.ConfigSettings.ForceHeadless)
                        {
                            fireop.AddArgument("--headless");
                        }
                        if (data.ConfigSettings.DisableNotifications)
                        {
                            fireprofile.SetPreference("dom.webnotifications.enabled", false);
                        }
                        if (data.ConfigSettings.CustomCMDArgs != string.Empty)
                        {
                            fireop.AddArgument(data.ConfigSettings.CustomCMDArgs);
                        }
                        if (data.ConfigSettings.RandomUA)
                        {
                            fireprofile.SetPreference("general.useragent.override", SpiceRUA.GetiPhoneUA());
                        }
                        else if (data.ConfigSettings.CustomUserAgent != string.Empty)
                        {
                            fireprofile.SetPreference("general.useragent.override", data.ConfigSettings.CustomUserAgent);
                        }

                        if (data.UseProxies)
                        {
                            fireprofile.SetPreference("network.proxy.type", 1);
                            if (data.Proxy.Type == Extreme.Net.ProxyType.Http)
                            {
                                fireprofile.SetPreference("network.proxy.http", data.Proxy.Host);
                                fireprofile.SetPreference("network.proxy.http_port", int.Parse(data.Proxy.Port));
                                fireprofile.SetPreference("network.proxy.ssl", data.Proxy.Host);
                                fireprofile.SetPreference("network.proxy.ssl_port", int.Parse(data.Proxy.Port));
                            }
                            else
                            {
                                fireprofile.SetPreference("network.proxy.socks", data.Proxy.Host);
                                fireprofile.SetPreference("network.proxy.socks_port", int.Parse(data.Proxy.Port));
                                if (data.Proxy.Type == Extreme.Net.ProxyType.Socks4)
                                {
                                    fireprofile.SetPreference("network.proxy.socks_version", 4);
                                }
                                else if (data.Proxy.Type == Extreme.Net.ProxyType.Socks5)
                                {
                                    fireprofile.SetPreference("network.proxy.socks_version", 5);
                                }
                            }
                        }

                        fireop.Profile = fireprofile;
                        data.Driver    = new FirefoxDriver(fireservice, fireop, new TimeSpan(0, 1, 0));
                    }
                    catch (Exception ex) { data.Log(new LogEntry(ex.ToString(), Colors.White)); return; }

                    break;
                }

                data.Driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(data.GlobalSettings.Selenium.PageLoadTimeout);
                data.Log(new LogEntry("Opened!", Colors.White));
                data.BrowserOpen = true;
            }
            else
            {
                try
                {
                    UpdateSeleniumData(data);
                }
                catch { }
            }
        }
Esempio n. 2
0
        /// <inheritdoc />
        public override void Process(BotData data)
        {
            base.Process(data);

            var localInputStrings = ReplaceValuesRecursive(inputString, data);
            var outputs           = new List <string>();

            for (int i = 0; i < localInputStrings.Count; i++)
            {
                var localInputString = localInputStrings[i];
                var outputString     = "";

                switch (FunctionType)
                {
                case Function.Constant:
                    outputString = localInputString;
                    break;

                case Function.Base64Encode:
                    outputString = localInputString.ToBase64();
                    break;

                case Function.Base64Decode:
                    outputString = localInputString.FromBase64();
                    break;

                case Function.HTMLEntityEncode:
                    outputString = WebUtility.HtmlEncode(localInputString);
                    break;

                case Function.HTMLEntityDecode:
                    outputString = WebUtility.HtmlDecode(localInputString);
                    break;

                case Function.Hash:
                    outputString = GetHash(localInputString, hashType, InputBase64).ToLower();
                    break;

                case Function.HMAC:
                    outputString = Hmac(localInputString, hashType, ReplaceValues(hmacKey, data), InputBase64, KeyBase64, HmacBase64);
                    break;

                case Function.Translate:
                    outputString = localInputString;
                    foreach (var entry in TranslationDictionary.OrderBy(e => e.Key.Length).Reverse())
                    {
                        if (outputString.Contains(entry.Key))
                        {
                            outputString = outputString.Replace(entry.Key, entry.Value);
                            if (StopAfterFirstMatch)
                            {
                                break;
                            }
                        }
                    }
                    break;

                case Function.DateToUnixTime:
                    outputString = localInputString.ToDateTime(dateFormat).ToUnixTimeSeconds().ToString();
                    break;

                case Function.Length:
                    outputString = localInputString.Length.ToString();
                    break;

                case Function.ToLowercase:
                    outputString = localInputString.ToLower();
                    break;

                case Function.ToUppercase:
                    outputString = localInputString.ToUpper();
                    break;

                case Function.Replace:
                    if (useRegex)
                    {
                        outputString = Regex.Replace(localInputString, ReplaceValues(replaceWhat, data), ReplaceValues(replaceWith, data));
                    }
                    else
                    {
                        outputString = localInputString.Replace(ReplaceValues(replaceWhat, data), ReplaceValues(replaceWith, data));
                    }
                    break;

                case Function.RegexMatch:
                    outputString = Regex.Match(localInputString, ReplaceValues(regexMatch, data)).Value;
                    break;

                case Function.Unescape:
                    outputString = Regex.Unescape(localInputString);
                    break;

                case Function.URLEncode:
                    // The maximum allowed Uri size is 2083 characters, we use 2080 as a precaution
                    outputString = string.Join("", SplitInChunks(localInputString, 2080).Select(s => Uri.EscapeDataString(s)));
                    break;

                case Function.URLDecode:
                    outputString = Uri.UnescapeDataString(localInputString);
                    break;

                case Function.UnixTimeToDate:
                    outputString = double.Parse(localInputString).ToDateTime().ToString(dateFormat);
                    break;

                case Function.CurrentUnixTime:
                    outputString = DateTime.UtcNow.ToUnixTimeSeconds().ToString();
                    break;

                case Function.UnixTimeToISO8601:
                    outputString = double.Parse(localInputString).ToDateTime().ToISO8601();
                    break;

                case Function.RandomNum:
                    var min             = int.Parse(ReplaceValues(randomMin, data));
                    var max             = int.Parse(ReplaceValues(randomMax, data));
                    var randomNumString = data.random.Next(min, max).ToString();
                    outputString = randomZeroPad ? randomNumString.PadLeft(max.ToString().Length, '0') : randomNumString;
                    break;

                case Function.RandomString:
                    outputString = localInputString;
                    outputString = Regex.Replace(outputString, @"\?l", m => _lowercase[data.random.Next(_lowercase.Length)].ToString());
                    outputString = Regex.Replace(outputString, @"\?u", m => _uppercase[data.random.Next(_uppercase.Length)].ToString());
                    outputString = Regex.Replace(outputString, @"\?d", m => _digits[data.random.Next(_digits.Length)].ToString());
                    outputString = Regex.Replace(outputString, @"\?s", m => _symbols[data.random.Next(_symbols.Length)].ToString());
                    outputString = Regex.Replace(outputString, @"\?h", m => _hex[data.random.Next(_hex.Length)].ToString());
                    outputString = Regex.Replace(outputString, @"\?a", m => _allChars[data.random.Next(_allChars.Length)].ToString());
                    outputString = Regex.Replace(outputString, @"\?m", m => _udChars[data.random.Next(_udChars.Length)].ToString());
                    outputString = Regex.Replace(outputString, @"\?n", m => _ldChars[data.random.Next(_ldChars.Length)].ToString());
                    outputString = Regex.Replace(outputString, @"\?i", m => _ludChars[data.random.Next(_ludChars.Length)].ToString());
                    outputString = Regex.Replace(outputString, @"\?f", m => _upperlwr[data.random.Next(_upperlwr.Length)].ToString());
                    break;

                case Function.Ceil:
                    outputString = Math.Ceiling(Decimal.Parse(localInputString, _style, _provider)).ToString();
                    break;

                case Function.Floor:
                    outputString = Math.Floor(Decimal.Parse(localInputString, _style, _provider)).ToString();
                    break;

                case Function.Round:
                    outputString = Math.Round(Decimal.Parse(localInputString, _style, _provider), 0, MidpointRounding.AwayFromZero).ToString();
                    break;

                case Function.Compute:
                    outputString = new DataTable().Compute(localInputString.Replace(',', '.'), null).ToString();
                    break;

                case Function.CountOccurrences:
                    outputString = CountStringOccurrences(localInputString, stringToFind).ToString();
                    break;

                case Function.ClearCookies:
                    data.Cookies.Clear();
                    break;

                case Function.RSAEncrypt:
                    outputString = Crypto.RSAEncrypt(
                        localInputString,
                        ReplaceValues(RsaN, data),
                        ReplaceValues(RsaE, data),
                        RsaOAEP
                        );
                    break;

                /*
                 * case Function.RSADecrypt:
                 * outputString = Crypto.RSADecrypt(
                 *  localInputString,
                 *  ReplaceValues(RsaN, data),
                 *  ReplaceValues(RsaD, data),
                 *  RsaOAEP
                 *  );
                 * break;
                 */

                case Function.RSAPKCS1PAD2:
                    outputString = Crypto.RSAPkcs1Pad2(
                        localInputString,
                        ReplaceValues(RsaN, data),
                        ReplaceValues(RsaE, data)
                        );
                    break;

                case Function.Delay:
                    try { Thread.Sleep(int.Parse(localInputString)); } catch { }
                    break;

                case Function.CharAt:
                    outputString = localInputString.ToCharArray()[int.Parse(ReplaceValues(charIndex, data))].ToString();
                    break;

                case Function.Substring:
                    outputString = localInputString.Substring(int.Parse(ReplaceValues(substringIndex, data)), int.Parse(ReplaceValues(substringLength, data)));
                    break;

                case Function.ReverseString:
                    char[] charArray = localInputString.ToCharArray();
                    Array.Reverse(charArray);
                    outputString = new string(charArray);
                    break;

                case Function.Trim:
                    outputString = localInputString.Trim();
                    break;

                case Function.GetRandomUA:
                    if (UserAgentSpecifyBrowser)
                    {
                        outputString = UserAgent.ForBrowser(UserAgentBrowser);
                    }
                    else
                    {
                        outputString = SpiceRUA.GetiPhoneUA();
                    }
                    break;

                case Function.AESEncrypt:
                    outputString = Crypto.AESEncrypt(localInputString, ReplaceValues(aesKey, data), ReplaceValues(aesIV, data), AesMode, AesPadding);
                    break;

                case Function.AESDecrypt:
                    outputString = Crypto.AESDecrypt(localInputString, ReplaceValues(aesKey, data), ReplaceValues(aesIV, data), AesMode, AesPadding);
                    break;

                case Function.PBKDF2PKCS5:
                    outputString = Crypto.PBKDF2PKCS5(localInputString, ReplaceValues(KdfSalt, data), KdfSaltSize, KdfIterations, KdfKeySize, KdfAlgorithm);
                    break;
                }

                data.Log(new LogEntry(string.Format("Executed function {0} on input {1} with outcome {2}", functionType, localInputString, outputString), Colors.GreenYellow));

                // Add to the outputs
                outputs.Add(outputString);
            }

            var isList = outputs.Count > 1 || InputString.Contains("[*]") || InputString.Contains("(*)") || InputString.Contains("{*}");

            InsertVariable(data, isCapture, isList, outputs, variableName, "", "", false, true);
        }