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)
            {
            }
        }
Ejemplo n.º 2
0
        /// <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));
        }
Ejemplo n.º 3
0
        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));
        }
Ejemplo n.º 5
0
        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();
        }
Ejemplo n.º 6
0
 public void Test1()
 {
     using var sniffFile = new SniffFile("./sniff.pkt");
     var context = Parser.Of(sniffFile).Run();
 }