예제 #1
0
 /// <summary>
 /// Constructor.
 /// </summary>
 /// <param name="ScanProvider">Instanciated implementation of an IScanProvider.</param>
 /// <param name="dorkToScan">A DorkDone, which represents the Dork to scan.</param>
 public Scanner(IScanProvider ScanProvider, DorkDone dorkToScan)
 {
     scanProvider = ScanProvider;
     _ScanStatus  = (int)SCANTHREADSTATE.Waiting;
     _DorkToScan  = dorkToScan;
     httpGet      = null;
 }
예제 #2
0
        /// <summary>
        /// Re-scan (so, scan again) the selected Dork.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void RescanMenuItem_Click(object sender, EventArgs e)
        {
            DorkDone ddone = (DorkDone)resultListView.SelectedItems[0].Tag;

            SelectedDork.Dork     = ddone as Dork;
            SelectedDork.TreeNode = ddone.LastNode;
            SelectedDork.NextPage = 0;
            singleScan();
        }
예제 #3
0
        /// <summary>
        /// Creates new DorkDone object from a given SSelectedDork object.
        /// Presets attributes like status, time, host
        /// </summary>
        /// <param name="scanDork">A selected Dork (eg from ui)</param>
        /// <returns>Corresponding DorkDone object</returns>
        private DorkDone CreateDorkForScanning(SSelectedDork scanDork)
        {
            DorkDone dorkdone = new DorkDone(scanDork);

            dorkdone.ScanResult = (int)RESULT_STATUS.WhileScan;
            dorkdone.Host       = scanHostTextBox.Text.Trim();
            dorkdone.Now();
            return(dorkdone);
        }
예제 #4
0
        /// <summary>
        /// Shows the Dork of the selected result back in the TreeView.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void showLeftStrip_Click(object sender, EventArgs e)
        {
            tvwDorks.Focus();
            DorkDone dork     = (DorkDone)resultListView.SelectedItems[0].Tag;
            TreeNode treenode = dork.LastNode;

            treenode.Expand();
            treenode.EnsureVisible();
            tvwDorks.SelectedNode = treenode;
        }
예제 #5
0
 /// <summary>
 /// Clear all un-successful Dorks/results out of the ResultView.
 /// Leaves just positives.
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void ClearErrorsStrip_Click(object sender, EventArgs e)
 {
     foreach (ListViewItem listItem in resultListView.Items)
     {
         DorkDone ddone = (DorkDone)listItem.Tag;
         if (ddone.ScanResult != (int)RESULT_STATUS.ScanWithResult)
         {
             resultListView.Items.Remove(listItem);
         }
     }
 }
예제 #6
0
        /// <summary>
        /// Called when double-clicking on an item in the result-list.
        /// Opens browser with the Url, or (if unsuccessfull scan) opens
        /// dialog with description of error.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void resultList_DoubleClick(object sender, EventArgs e)
        {
            if (resultListView.SelectedItems.Count == 1)
            {
                DorkDone ddone = (DorkDone)resultListView.SelectedItems[0].Tag;

                if (ddone.ScanResult == (int)RESULT_STATUS.ScanWithResult ||
                    ddone.ScanResult == (int)RESULT_STATUS.Blocked)
                {
                    openInBrowserToolStripMenuItem_Click(sender, e);
                }
                else
                {
                    if (ddone.ScanResult == (int)RESULT_STATUS.Failure)
                    {
                        ShowErrorStrip_Click(sender, e);
                    }
                }
            }
        }
예제 #7
0
        /// <summary>
        /// Called whenever the selection from the user in the result-list changes.
        /// Mostly items from the context-menu are enabled/disabled here.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void resultSelectionChanged(object sender, EventArgs e)
        {
            bool selectedItems   = resultListView.SelectedItems.Count > 0;
            bool oneSelectedItem = resultListView.SelectedItems.Count == 1;

            cutToolStripButton.Enabled  = cutToolStripMenuItem.Enabled = selectedItems;
            copyToolStripButton.Enabled = copyToolStripMenuItem.Enabled = selectedItems;
            copyToClpMenuItem.Enabled   = selectedItems;

            openInBrowserToolStripMenuItem.Enabled = oneSelectedItem;
            RescanMenuItem.Enabled        = oneSelectedItem;
            showLeftStrip.Enabled         = oneSelectedItem;
            scanMoreFromHereStrip.Enabled = oneSelectedItem;

            if (oneSelectedItem)
            {
                DorkDone ddone = resultListView.SelectedItems[0].Tag as DorkDone;
                if (ddone != null)
                {
                    bool isSuccessItem = (ddone.ScanResult == (int)RESULT_STATUS.ScanWithResult);

                    ShowErrorStrip.Enabled = (ddone.ScanResult == (int)RESULT_STATUS.Failure);

                    scanMoreFromHereStrip.Enabled          = (ddone.NextPage != 0) && (isSuccessItem);
                    openInBrowserToolStripMenuItem.Enabled = isSuccessItem;

                    // again, here, show it to the user
                    formatDorkToRichText(ddone as Dork);
                }
            }
            else
            {
                ShowErrorStrip.Enabled = false;
                openInBrowserToolStripMenuItem.Enabled = false;
            }
        }
예제 #8
0
        /// <summary>
        /// If a Dork failed, show its error message in a MessageBox.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ShowErrorStrip_Click(object sender, EventArgs e)
        {
            DorkDone ddone = (DorkDone)resultListView.SelectedItems[0].Tag;

            MessageBox.Show(ddone.ErrorMessage, rm.GetString("RES_E_SCANERROR"), MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
예제 #9
0
        /// <summary>
        /// This is the Background worker which starts and controls the ScanMonitor.
        /// Does some UI things, also takes care of the ScanningDialog.
        /// This seems a doubling of the ScanMonitor's Watcher, but it is needed to keep the UI running independently.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void doThreadScan(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker bw     = (BackgroundWorker)sender;
            int    ScanCountSession = 0;
            double frac             = 100.0 / ((double)dorksToScan.Count);
            double realstat         = 0;

            using (ScanMonitor scanmonitor = new ScanMonitor(Properties.Settings.Default.MaxParallelScans))
            {
                foreach (SSelectedDork _dork in dorksToScan)
                {
                    ScanCountSession++;

                    if (scanningdialog != null)
                    {
                        scanningdialog.UpdateTitle(ScanCountSession);
                        Update();
                    }

                    DorkDone     dorkdone = CreateDorkForScanning(_dork);
                    ListViewItem lv       = ShowTemporaryDork(_dork);
                    lv.Tag            = dorkdone;
                    dorkdone.ViewItem = lv;
                    Update();

                    Scanner scanner = new Scanner(new ScanGoogleProvider(), dorkdone);

                    while (!scanmonitor.IsThreadAvail())
                    {
                        CheckAndDisplayResults(scanmonitor);
                        Thread.Sleep(300);
                    }

                    scanmonitor.Add(scanner);
                    Thread.Sleep(200);

                    CheckAndDisplayResults(scanmonitor);

                    if (scanningdialog != null)
                    {
                        realstat += frac / Properties.Settings.Default.RequestPages;
                        scanningdialog.SetPercentage((int)Math.Round(realstat));
                        Update();
                    }

                    if (bw.CancellationPending)
                    {
                        e.Cancel = true;
                        break;
                    }

                    int stealthtime = Properties.Settings.Default.StealthTime / 1000;

                    if (stealthtime > 0)
                    {
                        if (stealthtime > 3)
                        {
                            progressBar1.ForeColor = Color.DarkGray;
                        }

                        for (int i = 0; i < stealthtime; i++)
                        {
                            Thread.Sleep(1000);
                            if (bw.CancellationPending)
                            {
                                e.Cancel = true;
                                break;
                            }
                        }

                        if (stealthtime > 3)
                        {
                            progressBar1.ForeColor = Color.DarkBlue;
                        }
                    }

                    if (scanningdialog != null)
                    {
                        realstat = (frac * ScanCountSession);
                        scanningdialog.SetPercentage((int)Math.Round(realstat));
                        Update();
                    }

                    // be sure to cancel
                    if (e.Cancel == true)
                    {
                        break;
                    }
                } // foreach

                if (scanningdialog != null)
                {
                    if (scanmonitor.HasResults() || scanmonitor.HasPendingScans())
                    {
                        scanningdialog.UpdateTitleWaiting();
                    }
                }

                while (scanmonitor.HasResults() ||
                       (!e.Cancel && scanmonitor.HasPendingScans())
                       )
                {
                    CheckAndDisplayResults(scanmonitor);
                    Thread.Sleep(200);
                }
            }
        }
예제 #10
0
        /// <summary>
        /// This is one of the hearts of gS.
        /// Like it is named, it checks the results and with them controls
        /// the outer interface of the ScanMonitor. It's somehow a respectful
        /// connection between the UI and the parallel scanner in the backend.
        /// </summary>
        /// <param name="scanmonitor">Instance of ScanMonitor while scanning.</param>
        private void CheckAndDisplayResults(ScanMonitor scanmonitor)
        {
            if (scanmonitor.HasResults())
            {
                Scanner  scanner  = scanmonitor.GetFinishedScanner();
                DorkDone dorkdone = scanner.ResultDork;
                if (dorkdone == null)
                {
                    return;
                }

                if (dorkdone.ScanResult == (int)RESULT_STATUS.Cancel)
                {
                    Trace.WriteLineIf(Debug.Trace.TraceGoolag.TraceInfo, "Scan was canceled.");
                    dorkdone.ViewItem.ImageIndex       = (int)RESULT_STATUS.Cancel;
                    dorkdone.ViewItem.SubItems[0].Text = rm.GetString("RES_CANCELSCAN");
                    dorkdone.ViewItem.SubItems[2].Text = "";
                    return;
                }
                if (dorkdone.ScanResult == (int)RESULT_STATUS.Nothing)
                {
                    Trace.WriteLineIf(Debug.Trace.TraceGoolag.TraceInfo, "Scan returned no results.");
                    dorkdone.ViewItem.ImageIndex       = (int)RESULT_STATUS.Nothing;
                    dorkdone.ViewItem.SubItems[0].Text = rm.GetString("RES_NORESULT");
                    dorkdone.ViewItem.SubItems[2].Text = "";
                    summaryStat.ScansNoResult++;
                    return;
                }
                if (dorkdone.ScanResult == (int)RESULT_STATUS.Failure)
                {
                    dorkdone.ViewItem.ImageIndex       = (int)RESULT_STATUS.Failure;
                    dorkdone.ViewItem.SubItems[0].Text = rm.GetString("RES_FAILED");
                    dorkdone.ViewItem.SubItems[2].Text = "";
                    summaryStat.ScansFailed++;
                    Trace.WriteLineIf(Debug.Trace.TraceGoolag.TraceInfo, "Scan failed.");
                    return;
                }
                if (dorkdone.ScanResult == (int)RESULT_STATUS.Blocked)
                {
                    dorkdone.ViewItem.ImageIndex       = (int)RESULT_STATUS.Blocked;
                    dorkdone.ViewItem.SubItems[0].Text = rm.GetString("RES_BLOCKED");
                    dorkdone.ViewItem.SubItems[2].Text = dorkdone.ResultURL;
                    summaryStat.ScansFailed++;
                    Trace.WriteLineIf(Debug.Trace.TraceGoolag.TraceInfo, "Scan was blocked.");

                    if (Properties.Settings.Default.BlockDetectMode == (int)BLOCKING_MODE.SingleAndStop)
                    {
                        int stoppedscans = scanmonitor.StopAllActive();
                        Trace.WriteLineIf(Debug.Trace.TraceGoolag.TraceVerbose, stoppedscans, "Scans canceled in queue");

                        while (scanmonitor.HasPendingScans())
                        {
                            Thread.Sleep(200);
                        }
                    }

                    if (Properties.Settings.Default.BlockDetectMode != (int)BLOCKING_MODE.Ignore)
                    {
                        ShowScanningDialog(false);

                        DialogResult dr = MessageBox.Show("Start browser to unlock block? Cancel will stop scanning.", "Block detected!", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Stop);

                        if (dr == DialogResult.Yes)
                        {
                            OSUtils.OpenInBrowser(dorkdone.ResultURL);
                            MessageBox.Show("Ready to resume?", "Resume scanning.", MessageBoxButtons.OK, MessageBoxIcon.Question);
                        }
                        else if (dr == DialogResult.Cancel)
                        {
                            int stoppedscans = scanmonitor.StopAllActive();
                            Trace.WriteLineIf(Debug.Trace.TraceGoolag.TraceVerbose, stoppedscans, "Scans canceled in queue");

                            while (scanmonitor.HasPendingScans())
                            {
                                Thread.Sleep(100);
                            }
                            StopScanning();
                        }

                        ShowScanningDialog(true);
                    }

                    return;
                }
                if (dorkdone.ScanResult == (int)RESULT_STATUS.ScanWithResult)
                {
                    resultListView.Items.Remove(dorkdone.ViewItem); // remove the one that is displayed while scanning

                    if (scanner.Count > 0)
                    {
                        int      lastIdx    = 0;
                        DorkDone resDork    = scanner.ResultDork;
                        DorkDone followDork = null;

                        if (resDork.NextPage != 0)
                        {
                            if ((resDork.NextPage / 10) < Properties.Settings.Default.RequestPages)
                            {
                                followDork            = new DorkDone();
                                followDork            = (DorkDone)resDork.Clone();
                                followDork.ScanResult = (int)RESULT_STATUS.WhileScan;
                                Scanner nextscanner = new Scanner(new ScanGoogleProvider(), followDork);

                                while (!scanmonitor.IsThreadAvail())
                                {
                                    Thread.Sleep(300);
                                }

                                scanmonitor.Add(nextscanner);
                                Thread.Sleep(100);
                            }
                        }

                        do
                        {
                            ListViewItem lv1 = resultListView.Items.Add(rm.GetString("RES_SUCCESS"),
                                                                        (int)RESULT_STATUS.ScanWithResult);

                            lv1.SubItems.Add(resDork.Title);
                            lv1.SubItems.Add(resDork.ResultURL);
                            lastIdx = lv1.Index;
                            lv1.Tag = resDork;

                            summaryStat.ScansSuccess++;
                            resDork = resDork.Next;

                            resultListView.EnsureVisible(lastIdx);
                        } while (resDork != null);
                    }
                }
            }
        }
예제 #11
0
        /// <summary>
        /// Run a scan with a DorkDone.
        /// </summary>
        /// <param name="DorkToScan">DorkDone to scan.</param>
        /// <returns>True if no errors occured.</returns>
        public bool DoDork(DorkDone DorkToScan)
        {
            _ScanStatus = (int)SCANTHREADSTATE.Working;
            RequestBuilder req = new RequestBuilder(scanProvider);

            httpGet = new HttpSimpleGet(Properties.Settings.Default.ScanTimeOut);

            string currentRequest = req.getRequest(DorkToScan.Query,
                                                   DorkToScan.Host,
                                                   DorkToScan.NextPage);

            Trace.WriteLineIf(Debug.Trace.TraceGoolag.TraceInfo, currentRequest, "ScanURL:");

            if (!httpGet.Do(currentRequest))
            {
                DorkToScan.ErrorMessage = httpGet.GetErrorMessage();
                DorkToScan.ScanResult   = (int)RESULT_STATUS.Failure;
                _ScanStatus             = (int)SCANTHREADSTATE.Finished;
                firstResultDork         = DorkToScan;
                return(false);
            }

            ParseHtmlResults parser = new ParseHtmlResults(scanProvider, DorkToScan.NextPage);

            parsedResults = parser.Parse(httpGet.GetResults());

            if (parsedResults.Count > 0)
            {
                DorkToScan.ScanResult = (int)RESULT_STATUS.ScanWithResult;
                DorkToScan.NextPage   = parser.NextPage;

                DorkDone tmpDork = null;

                foreach (string parsedUrl in parsedResults)
                {
                    DorkDone newDork = new DorkDone();
                    newDork           = (DorkDone)DorkToScan.Clone();
                    newDork.ResultURL = parsedUrl;
                    newDork.Next      = tmpDork;
                    tmpDork           = newDork;
                }

                firstResultDork = tmpDork;
            }
            else
            {
                DorkToScan.Next = null;
                firstResultDork = DorkToScan;

                if (parser.Blocked)
                {
                    DorkToScan.ScanResult = (int)RESULT_STATUS.Blocked;
                    DorkToScan.ResultURL  = httpGet.ResponseUri;
                }
                else
                {
                    DorkToScan.ScanResult = (int)RESULT_STATUS.Nothing;
                }
            }

            _ScanStatus = (int)SCANTHREADSTATE.Finished;
            return(true);
        }