/// <summary> /// Main entrypoint for the download program. /// </summary> /// <param name="args"> parameters passed in from the user </param> private static async Task Main(string[] args) { var detectBackdoorTool = new DetectBackdoorTool(); var parsedOptions = detectBackdoorTool.ParseOptions <Options>(args).Value; var detectionResults = await detectBackdoorTool.RunAsync(parsedOptions); foreach (var result in detectionResults) { foreach (var entry in result) { if (entry.Value == null || entry.Value.Metadata == null || entry.Value.Metadata.Matches == null) { continue; } if (parsedOptions.Format == "text") { foreach (var match in entry.Value.Metadata.Matches.OrderByDescending(x => x.Confidence)) { WriteMatch(match); } Console.WriteLine($"{entry.Value.Metadata.TotalMatchesCount} matches found."); } void WriteMatch(MatchRecord match) { var filename = match.FileName; if (filename == null) { return; } var sourcePathLength = entry.Value.Metadata.SourcePath?.Length; if (sourcePathLength.HasValue) { if (entry.Value.Metadata.SourcePath != null && filename.StartsWith(entry.Value.Metadata.SourcePath)) { filename = filename[sourcePathLength.Value..]; } } Console.WriteLine($"{match.Tags?.First()} - {filename}:{match.StartLocationLine} - {match.RuleName} ({match.Severity} - {match.Confidence})"); }
/// <summary> /// Main entrypoint for the download program. /// </summary> /// <param name="args"> parameters passed in from the user </param> private static async Task Main(string[] args) { ShowToolBanner(); DetectBackdoorTool?detectBackdoorTool = new DetectBackdoorTool(); Options? parsedOptions = detectBackdoorTool.ParseOptions <Options>(args).Value; List <Dictionary <string, AnalyzeResult?> >?detectionResults = await detectBackdoorTool.RunAsync(parsedOptions); foreach (Dictionary <string, AnalyzeResult?>?result in detectionResults) { foreach (KeyValuePair <string, AnalyzeResult?> entry in result) { if (entry.Value == null || entry.Value.Metadata == null || entry.Value.Metadata.Matches == null) { continue; } if (parsedOptions.Format == "text") { IOrderedEnumerable <MatchRecord>?matchEntries = entry.Value.Metadata.Matches.OrderByDescending(x => x.Confidence); int matchEntriesCount = matchEntries.Count(); int matchIndex = 1; foreach (MatchRecord?match in matchEntries) { WriteMatch(match, matchIndex, matchEntriesCount); matchIndex++; } Console.WriteLine($"{entry.Value.Metadata.TotalMatchesCount} matches found."); } void WriteMatch(MatchRecord match, int index, int matchCount) { string?filename = match.FileName; if (filename == null) { return; } int?sourcePathLength = entry.Value.Metadata.SourcePath?.Length; if (sourcePathLength.HasValue) { if (entry.Value.Metadata.SourcePath != null && filename.StartsWith(entry.Value.Metadata.SourcePath)) { filename = filename[sourcePathLength.Value..]; } } Console.WriteLine(Red($"--[ ") + Blue("Match #") + Yellow(index.ToString()) + Blue(" of ") + Yellow(matchCount.ToString()) + Red(" ]--")); Console.WriteLine(" Rule Id: " + Blue(match.Rule.Id)); Console.WriteLine(" Tag: " + Blue(match.Tags?.First())); Console.WriteLine(" Severity: " + Cyan(match.Severity.ToString()) + ", Confidence: " + Cyan(match.Confidence.ToString())); Console.WriteLine(" Filename: " + Yellow(filename)); Console.WriteLine(" Pattern: " + Green(match.MatchingPattern.Pattern)); foreach (string?line in match.Excerpt.Split(new[] { "\r", "\n", "\r\n" }, StringSplitOptions.None)) { string?s = line; if (s.Length > 100) { s = s.Substring(0, 100); } Console.WriteLine(Bright.Black(" | ") + Magenta(s)); } Console.WriteLine(); }