public bool Filter(int id) { lock (SyncRoot) { int time = Time32.Now.GetHashCode(); PacketEntry filter; if (!Entries.TryGetValue(id, out filter)) { Entries.TryAdd(id, filter = new PacketEntry() { Count = 1, Time = time }); return(false); } if (time - filter.Time > PacketFilter.Timelimit) { filter.Time = time; filter.Count = 0; } filter.Count++; Entries[id] = filter; return(filter.Count > Limit(id)); } }
public bool IsApplicableForFilterSet(PacketEntry item) { bool isApplicable = false; switch (this.type) { case FilterType.Message: if (item.Message == ((int)this.value).ToString("X4")) { isApplicable = true; } break; case FilterType.ActorControl: if (item.ActorControl == (int)this.value) { isApplicable = true; } break; case FilterType.ActorControlName: if (item.ActorControl != -1 && item.Name.ToLower().Contains(((string)this.value).ToLower())) { isApplicable = true; } break; case FilterType.PacketName: if (item.Name.ToLower().Contains(((string)this.value).ToLower())) { isApplicable = true; } break; case FilterType.StringContents: var findStr = Convert.ToString(this.value).ToLower(); var packetStr = Encoding.UTF8.GetString(item.Data).ToLower(); if (packetStr.Contains(findStr)) { isApplicable = true; } break; default: break; } return(isApplicable); }
private void ReloadCurrentPackets() { var lastIndex = PacketListView.SelectedIndex; var array = new PacketEntry[PacketListView.Items.Count]; PacketListView.Items.CopyTo(array, 0); PacketListView.Items.Clear(); foreach (var item in array) { AddPacketToListView(item); } PacketListView.SelectedIndex = lastIndex; }
private void MessageSent(long epoch, byte[] message, int set, FFXIVNetworkMonitor.ConnectionType connectionType) { var res = Parse(message); var item = new PacketEntry { IsVisible = true, ActorControl = -1, Data = message, Message = res.header.MessageType.ToString("X4"), Direction = "C", Category = set.ToString(), Timestamp = Util.UnixTimeStampToDateTime(res.header.Seconds).ToString(@"MM\/dd\/yyyy HH:mm:ss"), Size = res.header.MessageLength.ToString(), Set = set, RouteID = res.header.RouteID.ToString(), PacketUnixTime = res.header.Seconds, SystemMsTime = Millis(), Connection = connectionType }; if (_configFlags.HasFlag(ConfigFlags.DontUsePacketTimestamp)) { item.Timestamp = DateTime.Now.ToString(@"MM\/dd\/yyyy HH:mm:ss.fff tt"); } _myTab.Dispatcher.Invoke(new Action(() => { _myTab.AddPacketToListView(item); })); }
private void Scripting_RunOnPacket(PacketEntry item, ScriptingProvider provider) { PacketEventArgs args = null; string structText = null; structText = item.Direction == "S" ? _db.GetServerZoneStruct(int.Parse(item.Message, NumberStyles.HexNumber)) : _db.GetClientZoneStruct(int.Parse(item.Message, NumberStyles.HexNumber)); if (structText != null) { if (structText.Length != 0) { try { var structProvider = new Struct(); var structEntries = structProvider.Parse(structText, item.Data); args = new PacketEventArgs(item, structEntries.Item2, _mainWindow.LogView); } catch (Exception exc) { _mainWindow.LogView.WriteLine($"[EXCEPTION] Thrown for {item.Message} - {item.Name}: {exc}"); args = new PacketEventArgs(item, null, _mainWindow.LogView); } } } else { args = new PacketEventArgs(item, null, _mainWindow.LogView); } if (args != null) { provider.ExecuteScripts(null, args); } }
public static PacketEntry[] Import(string path) { var lines = File.ReadAllLines(path); var output = new List <PacketEntry>(); foreach (var line in lines) { var parts = line.Split('|'); if (parts[0] != "252") { continue; } var packet = new PacketEntry(); packet.Timestamp = DateTime.Parse(parts[1]).ToString(@"MM\/dd\/yyyy HH:mm:ss.fff tt"); var bytes = new byte[(parts.Length - 3) * 4]; for (int i = 2; i < parts.Length - 1; i++) { var data = Util.StringToByteArray(parts[i]); Array.Copy(data.Reverse().ToArray(), 0, bytes, (i - 2) * 4, data.Length); } packet.Data = bytes; // ACT Plugin only logs server messages packet.Direction = "S"; packet.Message = BitConverter.ToUInt16(packet.Data, 0x12).ToString("X4"); output.Add(packet); } return(output.ToArray()); }
public PacketList() { StringHead = StringTail = null; }
public PacketEventArgs(PacketEntry packet, ExpandoObject packetobj, LogView debugView) { this.Packet = packet; this.PacketObj = packetobj; this.Debug = debugView; }
public bool IsApplicableForFilterSet(PacketEntry item) { try { switch (this.type) { case FilterType.Message: { var valStr = (string)value; string[] split; NumberStyles styles = NumberStyles.Any; if ((split = valStr.Split('x')).Length > 1) { valStr = split[1]; styles = NumberStyles.HexNumber; } else if ((split = valStr.Split('X')).Length > 1) { valStr = split[1]; styles = NumberStyles.HexNumber; } if (UInt16.TryParse(valStr, styles, CultureInfo.CurrentCulture, out var findUInt16)) { for (var i = 0; i + sizeof(UInt16) - 1 < item.Data.Length; ++i) { return(item.Message == findUInt16.ToString("X4")); } } } break; case FilterType.ActorControl: { var valStr = (string)value; string[] split; NumberStyles styles = NumberStyles.Any; if ((split = valStr.Split('x')).Length > 1) { valStr = split[1]; styles = NumberStyles.HexNumber; } else if ((split = valStr.Split('X')).Length > 1) { valStr = split[1]; styles = NumberStyles.HexNumber; } if (UInt16.TryParse(valStr, styles, CultureInfo.CurrentCulture, out var findUInt16)) { for (var i = 0; i + sizeof(UInt16) - 1 < item.Data.Length; ++i) { return(item.ActorControl == findUInt16); } } } break; case FilterType.ActorControlName: if (item.ActorControl != -1 && item.Name.ToLower().Contains(((string)this.value).ToLower())) { return(true); } break; case FilterType.PacketName: if (item.Name.ToLower().Contains(((string)this.value).ToLower())) { return(true); } break; case FilterType.StringContents: var findStr = Convert.ToString(this.value).ToLower(); var packetStr = Encoding.UTF8.GetString(item.Data).ToLower(); if (packetStr.Contains(findStr)) { return(true); } break; // todo: these are horribly inefficient case FilterType.Int64: { var valStr = (string)value; string[] split; NumberStyles styles = NumberStyles.Any; if ((split = valStr.Split('x')).Length > 1) { valStr = split[1]; styles = NumberStyles.HexNumber; } else if ((split = valStr.Split('X')).Length > 1) { valStr = split[1]; styles = NumberStyles.HexNumber; } if (Int64.TryParse(valStr, styles, CultureInfo.CurrentCulture, out var findInt64)) { for (var i = 0; i + sizeof(Int64) - 1 < item.Data.Length; ++i) { if (BitConverter.ToInt64(item.Data, i) == findInt64) { return(true); } } } if (UInt64.TryParse(valStr, styles, CultureInfo.CurrentCulture, out var findUInt64)) { for (var i = 0; i + sizeof(UInt64) - 1 < item.Data.Length; ++i) { if (BitConverter.ToUInt64(item.Data, i) == findUInt64) { return(true); } } } } break; case FilterType.Int32: { var valStr = (string)value; string[] split; NumberStyles styles = NumberStyles.Any; if ((split = valStr.Split('x')).Length > 1) { valStr = split[1]; styles = NumberStyles.HexNumber; } else if ((split = valStr.Split('X')).Length > 1) { valStr = split[1]; styles = NumberStyles.HexNumber; } if (Int32.TryParse(valStr, styles, CultureInfo.CurrentCulture, out var findInt32)) { for (var i = 0; i + sizeof(Int32) - 1 < item.Data.Length; ++i) { if (BitConverter.ToInt32(item.Data, i) == findInt32) { return(true); } } } if (UInt32.TryParse(valStr, styles, CultureInfo.CurrentCulture, out var findUInt32)) { for (var i = 0; i + sizeof(UInt32) - 1 < item.Data.Length; ++i) { if (BitConverter.ToUInt32(item.Data, i) == findUInt32) { return(true); } } } } break; case FilterType.Int16: { var valStr = (string)value; string[] split; NumberStyles styles = NumberStyles.Any; if ((split = valStr.Split('x')).Length > 1) { valStr = split[1]; styles = NumberStyles.HexNumber; } else if ((split = valStr.Split('X')).Length > 1) { valStr = split[1]; styles = NumberStyles.HexNumber; } if (Int16.TryParse(valStr, styles, CultureInfo.CurrentCulture, out var findInt16)) { for (var i = 0; i + sizeof(Int16) - 1 < item.Data.Length; ++i) { if (BitConverter.ToInt16(item.Data, i) == findInt16) { return(true); } } } if (UInt16.TryParse(valStr, styles, CultureInfo.CurrentCulture, out var findUInt16)) { for (var i = 0; i + sizeof(UInt16) - 1 < item.Data.Length; ++i) { if (BitConverter.ToUInt16(item.Data, i) == findUInt16) { return(true); } } } } break; case FilterType.Int8: { var valStr = (string)value; string[] split; int convertBase = 10; if ((split = valStr.Split('x')).Length > 1) { valStr = split[1]; convertBase = 16; } else if ((split = valStr.Split('X')).Length > 1) { valStr = split[1]; convertBase = 16; } var findInt8 = System.Convert.ToChar(System.Convert.ToUInt32(valStr, convertBase)); { for (var i = 0; i < item.Data.Length; ++i) { if (BitConverter.ToChar(item.Data, i) == findInt8) { return(true); } } } var findUInt8 = System.Convert.ToByte(System.Convert.ToUInt32(valStr, convertBase)); { for (var i = 0; i < item.Data.Length; ++i) { if (item.Data[i] == findUInt8) { return(true); } } } } break; case FilterType.Float: { if (float.TryParse((string)value, out var findFloat)) { for (var i = 0; i + sizeof(float) - 1 < item.Data.Length; ++i) { if (BitConverter.ToSingle(item.Data, i) == findFloat) { return(true); } } } } break; case FilterType.Double: { if (double.TryParse((string)value, out var findDouble)) { for (var i = 0; i + sizeof(double) - 1 < item.Data.Length; ++i) { if (BitConverter.ToSingle(item.Data, i) == findDouble) { return(true); } } } } break; case FilterType.ByteArray: { string valStr = value.ToString().Replace(" ", ""); List <byte> findBytes = new List <byte>(); for (var i = 0; i + 1 < valStr.Length; i += 2) { findBytes.Add(Convert.ToByte(Convert.ToUInt32(valStr.Substring(i, 2), 16))); } for (var i = 0; i + findBytes.Count - 1 < item.Data.Length; ++i) { if (item.Data[i] == findBytes[0]) { bool isMatch = true; for (var j = 0; j < findBytes.Count; ++j) { if (item.Data[i + j] != findBytes[j]) { isMatch = false; break; } } if (isMatch) { return(true); } } } } break; default: break; } } catch (Exception e) { return(false); } return(false); }
public void AddPacketToListView(PacketEntry item, bool silent = false) { if (_mainWindow.IsPausedCheckBox.IsChecked && !silent) { return; } if (_encryptionProvider != null && !item.IsDecrypted && item.Data[0x0C] != 0x09 && item.Data[0x0C] != 0x07 && item.Connection == FFXIVNetworkMonitor.ConnectionType.Lobby) { var data = item.Data; _encryptionProvider.DecryptPacket(data); item.Message = BitConverter.ToUInt16(item.Data, 0x12).ToString("X4"); item.IsDecrypted = true; } if (item.Direction == "S") { item.Name = _db.GetServerZoneOpName(int.Parse(item.Message, NumberStyles.HexNumber)); item.Comment = _db.GetServerZoneOpComment(int.Parse(item.Message, NumberStyles.HexNumber)); switch (item.Message) { case "0142": case "0143": case "0144": int cat = BitConverter.ToUInt16(item.Data, 0x20); item.ActorControl = cat; item.Name = _db.GetActorControlTypeName(cat); break; } if (_mainWindow.ExEnabledCheckbox.IsChecked) { try { var structText = _db.GetServerZoneStruct(int.Parse(item.Message, NumberStyles.HexNumber)); if (structText != null && structText.Length != 0) { switch (item.Name) { case "NpcSpawn": { Struct structProvider = new Struct(); dynamic obj = structProvider.Parse(structText, item.Data).Item2; item.Comment = $"Name: {_mainWindow.ExdProvider.GetBnpcName((uint)obj.bNPCName)}({obj.bNPCName}) - Base: {obj.bNPCBase}"; } break; case "ActorCast": { Struct structProvider = new Struct(); dynamic obj = structProvider.Parse(structText, item.Data).Item2; item.Comment = $"Action: {_mainWindow.ExdProvider.GetActionName(obj.action_id)}({obj.action_id}) - Type {obj.skillType} - Cast Time: {obj.cast_time}"; } break; } if (item.Name.Contains("ActorControl")) { switch (item.ActorControl) { case 3: //CastStart { var ctrl = Util.FastParseActorControl(item.Data); item.Comment = $"Action: {_mainWindow.ExdProvider.GetActionName((uint)ctrl.Param2)}({ctrl.Param2}) - Type {ctrl.Param1}"; } break; case 17: //ActionStart { var ctrl = Util.FastParseActorControl(item.Data); item.Comment = $"Action: {_mainWindow.ExdProvider.GetActionName((uint)ctrl.Param2)}({ctrl.Param2}) - Type {ctrl.Param1}"; } break; } } } } catch (Exception exc) { new ExtendedErrorView( $"EXD Error for {item.Message} - {item.Name}. Turning off EXD features.", exc.ToString(), "Error").ShowDialog(); _mainWindow.ExEnabledCheckbox.IsChecked = false; } } } else { item.Name = _db.GetClientZoneOpName(int.Parse(item.Message, NumberStyles.HexNumber)); item.Comment = _db.GetClientZoneOpComment(int.Parse(item.Message, NumberStyles.HexNumber)); if (item.Data[0x0C] == 0x09 && item.Message == "0000" && item.Connection == FFXIVNetworkMonitor.ConnectionType.Lobby) { _encryptionProvider = new LobbyEncryptionProvider(item.Data); item.Comment = "Lobby Encryption INIT"; } } item.IsForSelf = BitConverter.ToUInt32(item.Data, 0x04) == BitConverter.ToUInt32(item.Data, 0x08); item.Category = item.Set.ToString(); if (_mainWindow.RunScriptsOnNewCheckBox.IsChecked) { if (_mainWindow.ScriptProvider == null) { MessageBox.Show("No scripts were loaded.", "Error", MessageBoxButton.OK, MessageBoxImage.Error); _mainWindow.RunScriptsOnNewCheckBox.IsChecked = false; } else { try { Scripting_RunOnPacket(item, _mainWindow.ScriptProvider); } catch (Exception exc) { new ExtendedErrorView( $"Scripting exception thrown for {item.Message} - {item.Name}. Turning off auto script running.", exc.ToString(), "Error").ShowDialog(); _mainWindow.RunScriptsOnNewCheckBox.IsChecked = false; } } } if (_filters != null && _filters.Length > 0) { foreach (var filterEntry in _filters) { if (!filterEntry.IsApplicableForFilterSet(item)) { return; } } } item.Size = item.Data.Length.ToString(); PacketListView.Items.Add(item); if (!silent) { UpdateInfoLabel(); } }
public Capture() { Packets = new PacketEntry[0]; }
public void AddPacketToListView(PacketEntry item, bool silent = false) { if (item.Direction == "S") { item.Name = _db.GetServerZoneOpName(int.Parse(item.Message, NumberStyles.HexNumber)); item.Comment = _db.GetServerZoneOpComment(int.Parse(item.Message, NumberStyles.HexNumber)); } else { item.Name = _db.GetClientZoneOpName(int.Parse(item.Message, NumberStyles.HexNumber)); item.Comment = _db.GetClientZoneOpComment(int.Parse(item.Message, NumberStyles.HexNumber)); } item.Category = item.Set.ToString(); if (item.Message == "0142" || item.Message == "0143" || item.Message == "0144") { int cat = BitConverter.ToUInt16(item.Data, 0x20); item.ActorControl = cat; item.Name = _db.GetActorControlTypeName(cat); } if (_mainWindow.RunScriptsOnNewCheckBox.IsChecked) { try { PacketEventArgs args = null; var structText = _db.GetServerZoneStruct(int.Parse(item.Message, NumberStyles.HexNumber)); if (structText != null) { if (structText.Length != 0) { var structProvider = new Struct(); var structEntries = structProvider.Parse(structText, item.Data); args = new PacketEventArgs(item, structEntries.Item2, _mainWindow.ScriptDebugView); } } else { args = new PacketEventArgs(item, null, _mainWindow.ScriptDebugView); } Scripting_RunOnPacket(args); } catch (Exception exc) { new ExtendedErrorView( $"Scripting exception thrown for {item.Message} - {item.Name}. Turning off auto script running.", exc.ToString(), "Error").ShowDialog(); _mainWindow.RunScriptsOnNewCheckBox.IsChecked = false; return; } } if (_mainWindow.ExEnabledCheckbox.IsChecked && item.Direction == "S") { try { var structText = _db.GetServerZoneStruct(int.Parse(item.Message, NumberStyles.HexNumber)); if (structText != null) { if (structText.Length != 0) { switch (item.Name) { case "NpcSpawn": { Struct structProvider = new Struct(); dynamic obj = structProvider.Parse(structText, item.Data).Item2; item.Comment = $"Name: {_mainWindow.ExdProvider.GetBnpcName((int)obj.bNPCName)}({obj.bNPCName})"; } break; case "ActorCast": { Struct structProvider = new Struct(); dynamic obj = structProvider.Parse(structText, item.Data).Item2; item.Comment = $"Action: {_mainWindow.ExdProvider.GetActionName(obj.action_id)}({obj.action_id}) - Type {obj.skillType} - Cast Time: {obj.cast_time}"; } break; } if (item.Name.Contains("ActorControl")) { switch (item.ActorControl) { case 3: //CastStart { var ctrl = Util.FastParseActorControl(item.Data); item.Comment = $"Action: {_mainWindow.ExdProvider.GetActionName((int)ctrl.Param2)}({ctrl.Param2}) - Type {ctrl.Param1}"; } break; case 17: //ActionStart { var ctrl = Util.FastParseActorControl(item.Data); item.Comment = $"Action: {_mainWindow.ExdProvider.GetActionName((int)ctrl.Param2)}({ctrl.Param2}) - Type {ctrl.Param1}"; } break; } } } } } catch (Exception exc) { new ExtendedErrorView( $"EXD Error for {item.Message} - {item.Name}. Turning off EXD features.", exc.ToString(), "Error").ShowDialog(); _mainWindow.ExEnabledCheckbox.IsChecked = false; } } PacketListView.Items.Add(item); if (!silent) { UpdateInfoLabel(); } }