internal static void StopWorkFlowScans() { try { ScannerThread.Abort(); } catch { } WorkflowScannerWindow.UpdateScanStatusInUi(false, "Scan stopped"); }
internal static void OpenWindow() { if (!IsWindowOpen()) { OpenWorkflowScanner = new WorkflowScannerWindow(); OpenWorkflowScanner.Show(); } OpenWorkflowScanner.Activate(); }
internal static void MarkWorkFlowEnd() { if (CurrentWorkFlowStartIndex > 0) { if (Config.LastProxyLogId >= CurrentWorkFlowStartIndex) { WorkFlows.Add(new int[] { CurrentWorkFlowStartIndex, Config.LastProxyLogId }); WorkflowScannerWindow.UpdateWorkflowEntryInUi(WorkFlows[WorkFlows.Count - 1], CurrentWorkFlowName); } CurrentWorkFlowStartIndex = -1; CurrentWorkFlowName = ""; } }
internal static void CheckWorkflowRequest(Session Sess) { if (CurrentWorkFlowStartIndex < 1) { return; } lock (Hosts) { if (!Hosts.Contains(Sess.Request.BaseUrl)) { Hosts.Add(Sess.Request.BaseUrl); WorkflowScannerWindow.UpdateWorkflowHostEntryInUi(Sess.Request.BaseUrl); } } }
static void DoScan() { try { List <int[]> WorkFlowMarkers = new List <int[]>(); List <string> HostsToScan = new List <string>(); lock (WorkFlows) { foreach (int[] Marker in WorkFlows) { WorkFlowMarkers.Add(Marker); } WorkFlows.Clear(); } lock (AllowedHosts) { foreach (string Host in AllowedHosts) { HostsToScan.Add(Host); } AllowedHosts.Clear(); } foreach (int[] Marker in WorkFlowMarkers) { Analysis.LogAnalyzer Analyzer = new Analysis.LogAnalyzer(); Dictionary <string, Analysis.LogAssociations> AssociationsDict = Analyzer.Analyze(Marker[0], Marker[1], "Proxy"); foreach (string Ua in AssociationsDict.Keys) { ScanAssociation(AssociationsDict[Ua], HostsToScan, Marker); } } WorkflowScannerWindow.UpdateScanStatusInUi(false, "Scan complete"); } catch (ThreadAbortException) { } catch (Exception Exp) { IronException.Report("Error scanning workflows", Exp); } }
static void ScanAssociation(Analysis.LogAssociations Association, List <string> HostsToScan, int[] Marker) { if (Association.NonIgnorableCount > 0) { int Index = 0; foreach (int Id in Association.LogIds) { Analysis.LogAssociation Asso = Association.GetAssociation(Id); if (!Asso.IsIgnorable && HostsToScan.Contains(Asso.DestinationLog.Request.BaseUrl)) { Scanner S = new Scanner(Asso.DestinationLog.Request); if (S.BaseRequest.File.Length == 0 && S.BaseRequest.Query.Count == 0 && S.BaseRequest.UrlPathParts.Count > 1) { S.InjectUrl(); } S.InjectQuery(); if (S.BaseRequest.BodyType == BodyFormatType.Soap || S.BaseRequest.BodyType == BodyFormatType.Json || S.BaseRequest.BodyType == BodyFormatType.Multipart || S.BaseRequest.BodyType == BodyFormatType.Xml) { S.BodyFormat = FormatPlugin.Get(S.BaseRequest.BodyType); } S.InjectBody(); S.CheckAll(); if (S.InjectionPointsCount > 0) { S.WorkFlowLogAssociations = Association; S.IndexOfRequestToScanInWorkFlowLogAssociations = Index; WorkflowScannerWindow.UpdateScanStatusInUi(true, string.Format("Scanning Request no.{0} in workflow between logs {1}-{2}", Index, Marker[0], Marker[1])); S.Scan(); } Index++; } } } }