public void ProcessFile(string filePath, ParsingOptions options) { try { var sniffFile = new SniffFile(filePath); _parseStatusText.Text = $"Detected client build {sniffFile!.ClientBuild}. Collecting packets..."; Observable.Start(() => { ProcessFileAsync(sniffFile, options) .ObserveOn(_uiScheduler) .Subscribe(data => { OnParseCompleted(data.Context, data.Statistics); }); }, TaskPoolScheduler.Default); } catch (InvalidOperationException) { } }
/// <summary> /// Enumerates all modules, returning ones that could be able to process the sniff. /// </summary> /// <param name="file"></param> /// <returns></returns> public static Parser Of(SniffFile file) { var modules = new List <Assembly>(); // Look for all assemblies in the current directory. var entryAssembly = Assembly.GetEntryAssembly(); if (entryAssembly != null) { var baseDirectory = Path.GetDirectoryName(entryAssembly.Location); baseDirectory = Path.Combine(baseDirectory !, "Modules"); foreach (var assemblyPath in Directory.EnumerateFiles(baseDirectory !, "*.dll", SearchOption.AllDirectories)) { try { var module = Assembly.LoadFile(assemblyPath); foreach (var attribute in module.GetCustomAttributes <ExpansionAttribute>()) { if (attribute.Expansion == file.ClientBuild.Expansion && attribute.RealmExpansionType == file.ClientBuild.ExpansionType) { modules.Add(module); } } } catch (Exception) { // TODO: ignore for now, but we should only try to load expansion modules } } } return(new Parser(modules, file)); }
private static void Main(string[] args) { SetUpConsole(); var files = args.ToList(); if (files.Count == 0) { PrintUsage(); return; } // config options are handled in Misc.Settings Utilities.RemoveConfigOptions(ref files); if (!Utilities.GetFiles(ref files)) { EndPrompt(); return; } Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture; if (Settings.UseDBC) { var startTime = DateTime.Now; DBC.DBC.Load(); var span = DateTime.Now.Subtract(startTime); Trace.WriteLine($"DBC loaded in { span.ToFormattedString() }."); } // Disable DB when we don't need its data (dumping to a binary file) if (!Settings.DumpFormatWithSQL()) { SQLConnector.Enabled = false; SSHTunnel.Enabled = false; } else { Filters.Initialize(); } SQLConnector.ReadDB(); var count = 0; foreach (var file in files) { SessionHandler.ZStreams.Clear(); if (Settings.ClientBuild != Enums.ClientVersionBuild.Zero) { ClientVersion.SetVersion(Settings.ClientBuild); } try { var sf = new SniffFile(file, Settings.DumpFormat, Tuple.Create(++count, files.Count)); sf.ProcessFile(); } catch (IOException ex) { Console.WriteLine($"Can't process {file}. Skipping. Message: {ex.Message}"); } } if (!string.IsNullOrWhiteSpace(Settings.SQLFileName) && Settings.DumpFormatWithSQL()) { Builder.DumpSQL("Dumping global sql", Settings.SQLFileName, SniffFile.GetHeader("multi")); } SQLConnector.Disconnect(); SSHTunnel.Disconnect(); if (Settings.LogErrors) { Logger.WriteErrors(); } Trace.Listeners.Remove("ConsoleMirror"); EndPrompt(); }
private IObservable <(ParsingContext Context, ParsingStatistics Statistics)> ProcessFileAsync(SniffFile sniffFile, ParsingOptions options) { var parser = Parser.Of(sniffFile); parser.PacketParsed.Sample(TimeSpan.FromMilliseconds(5), _uiScheduler) .Subscribe(opcode => { _parseStatusText.Text = $"(#{opcode.Index:N0}) Parsed {opcode.Opcode}."; }, () => { parser.Dispose(); }); return(parser.Run(options)); }
private static void Main(string[] args) { SetUpConsole(); var files = args.ToList(); if (files.Count == 0) { PrintUsage(); return; } // config options are handled in Misc.Settings Utilities.RemoveConfigOptions(ref files); if (!Utilities.GetFiles(ref files)) { EndPrompt(); return; } Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture; // Disable DB when we don't need its data (dumping to a binary file) if (!Settings.DumpFormatWithSQL()) { SQLConnector.Enabled = false; SSHTunnel.Enabled = false; } else { Filters.Initialize(); } SQLConnector.ReadDB(); var count = 0; foreach (var file in files) { SessionHandler.ZStreams.Clear(); ClientVersion.SetVersion(Settings.ClientBuild); var sf = new SniffFile(file, Settings.DumpFormat, Tuple.Create(++count, files.Count)); sf.ProcessFile(); } if (!String.IsNullOrWhiteSpace(Settings.SQLFileName) && Settings.DumpFormatWithSQL()) { Builder.DumpSQL("Dumping global sql", Settings.SQLFileName, SniffFile.GetHeader("multi")); } SQLConnector.Disconnect(); SSHTunnel.Disconnect(); if (Settings.LogErrors) { Logger.WriteErrors(); } Trace.Listeners.Remove("ConsoleMirror"); EndPrompt(); }
public void Test1() { using var sniffFile = new SniffFile("./sniff.pkt"); var context = Parser.Of(sniffFile).Run(); }