static void Main(string[] args)
        {
            // Network monitor type
            TCPNetworkMonitor.NetworkMonitorType MonitorType = TCPNetworkMonitor.NetworkMonitorType.RawSocket;

            /*StringBuilder errbuff = new StringBuilder();
             * pcap_open("", 0, 0, 0, new IntPtr(), errbuff);
             * if (errbuff.ToString() != "")
             * {
             *  MonitorType = TCPNetworkMonitor.NetworkMonitorType.WinPCap;
             * }*/

            // Packet queue
            pq = new LinkedList <Packet>();

            // Initialize Machina
            FFXIVNetworkMonitor monitor = new FFXIVNetworkMonitor
            {
                MessageReceived = OnMessageReceived,
                MessageSent     = OnMessageSent,
                MonitorType     = MonitorType
            };

            monitor.Start();

            var wizardProcessor = new WizardProcessor();

            // Run packet ID stuff
            wizardProcessor.Run(pq);
        }
Exemplo n.º 2
0
        public MainWindow()
        {
            InitializeComponent();
            repo = Properties.Settings.Default.RepoUrl;
            db   = new Database(repo);

            captureMode = (TCPNetworkMonitor.NetworkMonitorType)Properties.Settings.Default.NetworkMonitorType;

            if (captureMode == TCPNetworkMonitor.NetworkMonitorType.RawSocket)
            {
                SwitchModeSockets.IsChecked = true;
            }
            else
            {
                SwitchModePcap.IsChecked = true;
            }

            // register the event that is fired after the key press.
            hook.KeyPressed +=
                new EventHandler <KeyPressedEventArgs>(hook_KeyPressed);
            // register the control + alt + F12 combination as hot key.

            try
            {
                hook.RegisterHotKey(ModifierKeys.Control,
                                    Keys.F12);
            }
            catch (Exception) {} //Hook already registered, or something weird happened


            //var test = Struct.Parse(db.GetServerZoneStruct(0x143), new byte[] {});
        }
Exemplo n.º 3
0
        private void ControllerOnGameProcessUpdated(bool fromView, HashSet <uint> pids)
        {
            lock (this)
            {
                if (!_isStarted)
                {
                    return;
                }

                var oldCtx = new HashSet <uint>(_processContexts.Keys);
                oldCtx.ExceptWith(pids);

                foreach (var pid in oldCtx)
                {
                    if (_processContexts.TryRemove(pid, out var ctx))
                    {
                        ctx.Stop();
                    }
                }

                // Check network parse mode
                var targetMonitorType = DetermineMonitorType();
                if (targetMonitorType != _currentMonitorType)
                {
                    _currentMonitorType = targetMonitorType;

                    // Stop all existing monitors since the parse mode has changed
                    foreach (var context in _processContexts.Values)
                    {
                        context.Stop();
                    }
                    _processContexts.Clear();

                    _plugin.Controller.NotifyLogMessageAppend(false, $"Parse mode = {targetMonitorType}.");
                }

                foreach (var pid in pids)
                {
                    _processContexts.AddOrUpdate(pid, _pid =>
                    {
                        var ctx = new ProcessContext(_pid, _currentMonitorType);
                        ctx.OnPingOpCodeDetected += code =>
                        {
                            _plugin.Controller.NotifyLogMessageAppend(false, $"IPC Ping OpCode detected for pid={_pid}: 0x{code:x4}");
                        };
                        ctx.Start();
                        return(ctx);
                    }, (_, _ctx) => _ctx);
                }
            }
        }
Exemplo n.º 4
0
            public ProcessContext(uint pid, TCPNetworkMonitor.NetworkMonitorType monitorType)
            {
                Monitor.ProcessID   = pid;
                Monitor.MonitorType = monitorType;

                // Packet sent by game client won't be captured if filter is enabled for RawSocket mode,
                // so enable the filter only on WinPCap mode.
                Monitor.UseSocketFilter = monitorType == TCPNetworkMonitor.NetworkMonitorType.WinPCap;

                Monitor.MessageReceived              = _packetMonitor.MessageReceived;
                Monitor.MessageSent                  = _packetMonitor.MessageSent;
                _packetMonitor.OnPingSample         += PacketMonitorOnOnPingSample;
                _packetMonitor.OnPingOpCodeDetected += code => OnPingOpCodeDetected?.Invoke(code);
            }
Exemplo n.º 5
0
        private void SwitchModePcap_OnClick(object sender, RoutedEventArgs e)
        {
            if (AreTabsCapturing())
            {
                MessageBox.Show("A capture is in progress.", "Error", MessageBoxButton.OK,
                                MessageBoxImage.Error);
                return;
            }

            CaptureMode = TCPNetworkMonitor.NetworkMonitorType.WinPCap;
            SwitchModePcap.IsChecked    = true;
            SwitchModeSockets.IsChecked = false;

            Properties.Settings.Default.NetworkMonitorType = (int)CaptureMode;
            Properties.Settings.Default.Save();
        }
Exemplo n.º 6
0
        private void SwitchModeSockets_OnClick(object sender, RoutedEventArgs e)
        {
            if (captureWorker != null)
            {
                MessageBox.Show("A capture is in progress.", "Error", MessageBoxButton.OK,
                                MessageBoxImage.Error);
                return;
            }

            captureMode = TCPNetworkMonitor.NetworkMonitorType.RawSocket;
            SwitchModePcap.IsChecked    = false;
            SwitchModeSockets.IsChecked = true;

            Properties.Settings.Default.NetworkMonitorType = captureMode;
            Properties.Settings.Default.Save();
        }
Exemplo n.º 7
0
        public MainWindow()
        {
            ParseCommandlineArguments();
            InitializeComponent();
            repo = Properties.Settings.Default.RepoUrl;
            db   = new Database(repo);

            captureMode = (TCPNetworkMonitor.NetworkMonitorType)Properties.Settings.Default.NetworkMonitorType;

            if (captureMode == TCPNetworkMonitor.NetworkMonitorType.RawSocket)
            {
                SwitchModeSockets.IsChecked = true;
            }
            else
            {
                SwitchModePcap.IsChecked = true;
            }

            // register the event that is fired after the key press.
            hook.KeyPressed +=
                new EventHandler <KeyPressedEventArgs>(hook_KeyPressed);
            // register the control + alt + F12 combination as hot key.

            hotkeyTimer = new System.Threading.Timer(TryAssignHotkey, null, 0, 5);

            if (!string.IsNullOrEmpty(currentXmlFile))
            {
                ChangeTitle(System.IO.Path.GetFileNameWithoutExtension(currentXmlFile));
                var packets = CaptureFileOp.Load(currentXmlFile);
                foreach (PacketListItem packet in packets)
                {
                    AddPacketToListView(packet);
                }
            }

            //var test = Struct.Parse(db.GetServerZoneStruct(0x143), new byte[] {});
        }
Exemplo n.º 8
0
 public MachinaCaptureWorker(MainWindow window, TCPNetworkMonitor.NetworkMonitorType monitorType)
 {
     this.mainWindow  = window;
     this.monitorType = monitorType;
 }
Exemplo n.º 9
0
        static void Main(string[] args)
        {
            // Use arguments to configure the monitor.
            int MonitorIndex = Array.IndexOf(args, "--MonitorType");
            int PIDIndex     = Array.IndexOf(args, "--ProcessID");
            int IPIndex      = Array.IndexOf(args, "--LocalIP");
            int RegionIndex  = Array.IndexOf(args, "--Region");

            TCPNetworkMonitor.NetworkMonitorType MonitorType = TCPNetworkMonitor.NetworkMonitorType.RawSocket;
            if (MonitorIndex != -1 && args[MonitorIndex + 1] == "WinPCap")
            {
                MonitorType = TCPNetworkMonitor.NetworkMonitorType.WinPCap;
            }

            Region localRegion = Region.Global;

            if (RegionIndex != -1)
            {
                if (args[RegionIndex + 1] == "KR")
                {
                    localRegion = Region.KR;
                }
            }
            else if (!Util.SystemHasGlobalClient())
            {
                if (Util.SystemHasKRClient())
                {
                    localRegion = Region.KR;
                }
            }

            // Create the monitor.
            FFXIVNetworkMonitor monitor = new FFXIVNetworkMonitor
            {
                MonitorType     = MonitorType,
                ProcessID       = PIDIndex != -1 ? uint.Parse(args[PIDIndex + 1]) : 0,
                LocalIP         = IPIndex != -1 ? args[IPIndex + 1] : "",
                UseSocketFilter = Array.IndexOf(args, "--UseSocketFilter") != -1 ? true : false,
                MessageReceived = (string connection, long epoch, byte[] message) => MessageReceived(connection, epoch, message),
                MessageSent     = (string connection, long epoch, byte[] message) => MessageSent(connection, epoch, message)
            };

            // Create the parser.
            int ParseAlgorithmIndex = Array.IndexOf(args, "--ParseAlgorithm");

            if (ParseAlgorithmIndex != -1)
            {
                if (args[ParseAlgorithmIndex + 1] == "RAMHeavy")
                {
                    Parser = new Parser(localRegion, ParserMode.RAMHeavy);
                }
                else if (args[ParseAlgorithmIndex + 1] == "CPUHeavy")
                {
                    Parser = new Parser(localRegion, ParserMode.CPUHeavy);
                }
                else if (args[ParseAlgorithmIndex + 1] == "PacketSpecific")
                {
                    Parser = new Parser(localRegion, ParserMode.PacketSpecific);
                }
                else
                {
                    Parser = new Parser(localRegion, ParserMode.RAMHeavy);
                }
            }
            else
            {
                Parser = new Parser(localRegion, ParserMode.RAMHeavy);
            }

            // Check for input.
            string input = "";

            // Get the input without blocking the output.
            Thread InputLoop = new Thread(() =>
            {
                while (true)
                {
                    input = Console.In.ReadLine(); // This blocks the InputLoop thread, so there's no need to sleep or anything like that.
                }
            });

            InputLoop.Start();

            // Process the input.
            Thread InputProcessingLoop = new Thread(() => {
                while (input != "kill")
                {
                    if (input == "start")
                    {
                        monitor.Start();
                    }
                    else if (input == "stop")
                    {
                        try
                        {
                            monitor.Stop();
                        }
                        catch (NullReferenceException nre) // _monitor is null, and it's a private member of monitor so I can't check if it exists beforehand.
                        {
                            Console.Error.WriteLine(nre);
                        }
                    }

                    input = "";
                    Thread.Sleep(200); // One-fifth of a second is probably fine for user input, and it's way less intensive than 1.
                }

                try
                {
                    monitor.Stop();
                }
                catch (NullReferenceException) {}
                InputLoop.Abort();
            });

            InputProcessingLoop.Start();
        }
Exemplo n.º 10
0
        public MainWindow()
        {
            InitializeComponent();

            #if !DEBUG
            AppDomain.CurrentDomain.UnhandledException += delegate(object sender, UnhandledExceptionEventArgs eventArgs)
            {
                new ExtendedErrorView("FFXIVMon Reborn ran into an error and needs to close.",
                                      eventArgs.ExceptionObject.ToString(), "Unhandled Exception").ShowDialog();

                Process.GetCurrentProcess().Kill();
            };
            #endif

            bool loadedByArg = false;
            var  args        = Environment.GetCommandLineArgs();
            for (var i = 1; i + 1 < args.Length; i += 2)
            {
                if (args[i] == "--xml")
                {
                    var tab = new TabItem();

                    tab.Content = new XivMonTab();
                    tab.Header  = "New Capture";
                    ((XivMonTab)tab.Content).SetParents(tab, this);
                    MainTabControl.Items.Add(tab);
                    ((XivMonTab)tab.Content).LoadCapture(args[i + 1]);

                    loadedByArg = true;
                }
            }

            if (!loadedByArg)
            {
                var item = new TabItem();
                item.Content = new XivMonTab();
                item.Header  = "New Capture";
                ((XivMonTab)item.Content).SetParents(item, this);
                MainTabControl.Items.Add(item);
            }


            // register the event that is fired after the key press.
            _kbHook.KeyPressed += hook_KeyPressed;

            try
            {
                _kbHook.RegisterHotKey(ModifierKeys.Control | ModifierKeys.Alt, Keys.F12);
            }
            catch (Exception)
            {
                // ignored
            }

            CaptureMode = (TCPNetworkMonitor.NetworkMonitorType)Properties.Settings.Default.NetworkMonitorType;

            if (CaptureMode == TCPNetworkMonitor.NetworkMonitorType.RawSocket)
            {
                SwitchModeSockets.IsChecked = true;
            }
            else
            {
                SwitchModePcap.IsChecked = true;
            }

            try
            {
                ExdReader.Init(Properties.Settings.Default.GamePath);
            }
            catch (Exception exc)
            {
                new ExtendedErrorView("Unable to init EXD data. Please check your game path in Options -> Set Game Path.", exc.ToString(), "FFXIVMon Reborn").ShowDialog();
                Properties.Settings.Default.LoadEXD = false;
            }

            if (!Properties.Settings.Default.DontUsePacketTimestamp)
            {
                DontUsePacketTimestamp.IsChecked = false;
                Properties.Settings.Default.DontUsePacketTimestamp = false;
            }
            else
            {
                CaptureFlags |= MachinaCaptureWorker.ConfigFlags.DontUsePacketTimestamp;
                DontUsePacketTimestamp.IsChecked = true;
                Properties.Settings.Default.DontUsePacketTimestamp = true;
            }

            if (Properties.Settings.Default.ForceRealtimePriority)
            {
                Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.RealTime;
                ForceRealtimePriority.IsChecked = true;
            }

            if (Properties.Settings.Default.LoadEXD)
            {
                ExEnabledCheckbox.IsChecked = true;
            }

            if (Properties.Settings.Default.EnableFsWatcher)
            {
                WatchDefFilesCheckBox.IsChecked = true;
            }

            if (Properties.Settings.Default.HideHexBoxActorId)
            {
                HideHexBoxActorIdCheckBox.IsChecked = true;
            }

            VersioningProvider.LocalDbChanged += VersioningProviderOnLocalDbChanged;
            ScriptDebugView.Show();
            ScriptDebugView.Visibility = Visibility.Hidden;

            VersionChecker.CheckVersion();
        }
Exemplo n.º 11
0
 public MachinaCaptureWorker(XivMonTab window, TCPNetworkMonitor.NetworkMonitorType monitorType, ConfigFlags flags)
 {
     this._myTab       = window;
     this._monitorType = monitorType;
     this._configFlags = flags;
 }
Exemplo n.º 12
0
        public MainWindow()
        {
            InitializeComponent();

            bool loadedByArg = false;
            var  args        = Environment.GetCommandLineArgs();

            for (var i = 1; i + 1 < args.Length; i += 2)
            {
                if (args[i] == "--xml")
                {
                    var tab = new TabItem();

                    tab.Content = new XivMonTab();
                    tab.Header  = "New Capture";
                    ((XivMonTab)tab.Content).SetParents(tab, this);
                    MainTabControl.Items.Add(tab);
                    ((XivMonTab)tab.Content).LoadCapture(args[i + 1]);

                    loadedByArg = true;
                }
            }

            if (!loadedByArg)
            {
                var item = new TabItem();
                item.Content = new XivMonTab();
                item.Header  = "New Capture";
                ((XivMonTab)item.Content).SetParents(item, this);
                MainTabControl.Items.Add(item);
            }


            // register the event that is fired after the key press.
            _kbHook.KeyPressed += hook_KeyPressed;

            try
            {
                _kbHook.RegisterHotKey(ModifierKeys.Control | ModifierKeys.Alt, Keys.F12);
            }
            catch (Exception)
            {
                // ignored
            }

            CaptureMode = (TCPNetworkMonitor.NetworkMonitorType)Properties.Settings.Default.NetworkMonitorType;

            if (CaptureMode == TCPNetworkMonitor.NetworkMonitorType.RawSocket)
            {
                SwitchModeSockets.IsChecked = true;
            }
            else
            {
                SwitchModePcap.IsChecked = true;
            }

            if (!Properties.Settings.Default.DontUsePacketTimestamp)
            {
                DontUsePacketTimestamp.IsChecked = false;
                Properties.Settings.Default.DontUsePacketTimestamp = false;
            }
            else
            {
                CaptureFlags |= MachinaCaptureWorker.ConfigFlags.DontUsePacketTimestamp;
                DontUsePacketTimestamp.IsChecked = true;
                Properties.Settings.Default.DontUsePacketTimestamp = true;
            }

            if (Properties.Settings.Default.ForceRealtimePriority)
            {
                Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.RealTime;
                ForceRealtimePriority.IsChecked = true;
            }

            if (Properties.Settings.Default.LoadEXD)
            {
                ExEnabledCheckbox.IsChecked = true;
            }

            if (Properties.Settings.Default.EnableFsWatcher)
            {
                WatchDefFilesCheckBox.IsChecked = true;
            }

            if (Properties.Settings.Default.HideHexBoxActorId)
            {
                HideHexBoxActorIdCheckBox.IsChecked = true;
            }

            VersioningProvider.LocalDbChanged += VersioningProviderOnLocalDbChanged;
        }