using System; using System.IO; using System.Linq; using BinaryObjectScanner; namespace ProtectionScan { class Program { static void Main(string[] args) { #if NET462_OR_GREATER || NETCOREAPP // Register the codepages System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); #endif // Create progress indicator var fileProgress = new Progress(); fileProgress.ProgressChanged += Changed; // Get the options from the arguments var options = Options.ParseOptions(args); // If we have an invalid state if (options == null) { Options.DisplayHelp(); return; } // Create scanner for all paths var scanner = new Scanner( options.ScanArchives, options.ScanContents, options.ScanGameEngines, options.ScanPackers, options.ScanPaths, options.Debug, fileProgress); // Loop through the input paths foreach (string inputPath in options.InputPaths) { GetAndWriteProtections(scanner, inputPath); } } /// /// Wrapper to get and log protections for a single path /// /// Scanner object to use /// File or directory path private static void GetAndWriteProtections(Scanner scanner, string path) { // An invalid path can't be scanned if (!Directory.Exists(path) && !File.Exists(path)) { Console.WriteLine($"{path} does not exist, skipping..."); return; } try { var protections = scanner.GetProtections(path); WriteProtectionResultFile(path, protections); } catch (Exception ex) { using var sw = new StreamWriter(File.OpenWrite($"exception-{DateTime.Now:yyyy-MM-dd_HHmmss.ffff}.txt")); sw.WriteLine(ex); } } /// /// Write the protection results from a single path to file, if possible /// /// File or directory path /// Dictionary of protections found, if any private static void WriteProtectionResultFile(string path, ProtectionDictionary? protections) { if (protections == null) { Console.WriteLine($"No protections found for {path}"); return; } using var sw = new StreamWriter(File.OpenWrite($"protection-{DateTime.Now:yyyy-MM-dd_HHmmss.ffff}.txt")); foreach (string key in protections.Keys.OrderBy(k => k)) { // Skip over files with no protection if (protections[key] == null || !protections[key].Any()) continue; string line = $"{key}: {string.Join(", ", [.. protections[key].OrderBy(p => p)])}"; Console.WriteLine(line); sw.WriteLine(line); } } /// /// Protection progress changed handler /// private static void Changed(object? source, ProtectionProgress value) { Console.WriteLine($"{value.Percentage * 100:N2}%: {value.Filename} - {value.Protection}"); } } }