public PacketLogWriter(MessageTables messages, ServerInfo[] servers, string directory, string fileNameFormat, bool compress) { if (servers == null) { throw new ArgumentNullException(nameof(servers)); } if (servers.Any(x => x == null)) { throw new ArgumentException("A null server was given.", nameof(servers)); } if (fileNameFormat == null) { throw new ArgumentNullException(nameof(fileNameFormat)); } IsCompressed = compress; Messages = messages ?? throw new ArgumentNullException(nameof(messages)); Servers = servers.ToDictionary(x => x.Id); Directory.CreateDirectory(directory); Stream stream = File.Open( Path.Combine(directory, DateTime.Now.ToString(fileNameFormat) + ".pkt"), FileMode.Create, FileAccess.Write); var magic = PacketLogEntry.Magic.ToArray(); stream.Write(magic, 0, magic.Length); stream.WriteByte((byte)(compress ? 6 : 0)); if (compress) { stream = new DeflateStream(stream, CompressionLevel.Optimal); } _writer = new TeraBinaryWriter(stream); _writer.WriteUInt32(Version); _writer.WriteByte((byte)messages.Region); _writer.WriteUInt32(messages.Game.Version); _writer.WriteUInt32((uint)servers.Length); foreach (var server in servers) { _writer.WriteInt32(server.Id); _writer.WriteString(server.Name); _writer.WriteBoolean(server.RealEndPoint.AddressFamily == AddressFamily.InterNetworkV6); _writer.WriteBytes(server.RealEndPoint.Address.GetAddressBytes()); _writer.WriteUInt16((ushort)server.RealEndPoint.Port); _writer.WriteBytes(server.ProxyEndPoint.Address.GetAddressBytes()); _writer.WriteUInt16((ushort)server.ProxyEndPoint.Port); } }
public PacketSerializer(MessageTables tables) { Tables = tables ?? throw new ArgumentNullException(nameof(tables)); Type[] types = AssemblyHelper.GetTypes(PACKETS_CONTRACT); foreach (Type type in types) { FieldInfo[] fields = type.GetFields(); _info.Add(type.Name, new PacketReflectionInfo(type, fields.Take(0, fields.Length - 1))); } }
public static void RefreshData() { using (ModuleSnapshot snapshot = new ModuleSnapshot(Process.GetCurrentProcess().MainModule)) { _clientVersion1 = GetVersion(snapshot, "8B 55 EC 8B 35 ? ? ? ?", 5); _clientVersion2 = GetVersion(snapshot, "66 83 02 0C 8B 3D ? ? ? ?", 6); _tables = new MessageTables(GetGameMessages(snapshot, "55 8B EC 8B 45 08 0F B7 C0 3D 88 13 00 00"), GetSystemMessages(snapshot, "55 8B EC 8B 45 08 85 C0 78 10 3D ? ? ? ?", 11)); //Analog to GetGameMessages: 55 8B EC 0F B7 45 08 3D 88 13 00 00 } }
public GameClient(TeraEncryptionKeys keys, MessageTables tables) { if (keys == null) { throw new ArgumentNullException(nameof(keys)); } _tesClient = new TeraEncryptionSession(PacketDirection.ServerToClient, keys); _tesServer = new TeraEncryptionSession(PacketDirection.ClientToServer, keys); Processor = new PacketProcessor(new PacketSerializer(tables)); }
static void Main(string[] args) { Test(); TeraEncryptionKeys keys = new TeraEncryptionKeys(PacketReceiver.ClientKey1, PacketReceiver.ClientKey2, PacketReceiver.ServerKey1, PacketReceiver.ServerKey2); MessageTables tables = new MessageTables(DicFromPath(@"D:\gMessages.txt"), DicFromPath(@"D:\sMessages.txt")); _client = new GameClient(keys, tables); PluginLoader pLoader = new PluginLoader("Plugins"); pLoader.Start(_client); PacketReceiver.PacketReceived += PacketReceiver_PacketReceived; PacketReceiver.Start(); Console.ReadKey(true); }
public CompilerPacketSerializer(MessageTables messages) : base(messages) { foreach (var opCode in messages.Game.OpCodeToName.Keys) { var type = GetType(opCode); if (type == null) { continue; } _serializers.Add(type, CompileSerializer(type)); _deserializers.Add(type, CompileDeserializer(type)); } _log.Basic("Compiled {0} packet serializers", _serializers.Count); }
protected PacketSerializer(MessageTables messages) { Messages = messages ?? throw new ArgumentNullException(nameof(messages)); var creators = new Dictionary <ushort, Func <Packet> >(); using var container = new CompositionContainer( new AssemblyCatalog(Assembly.GetExecutingAssembly()), true); var exports = container.GetExports <Func <Packet>, IPacketMetadata>( PacketAttribute.ThisContractName); foreach (var lazy in exports.Where(x => messages.Game.NameToOpCode.ContainsKey(x.Metadata.OpCode))) { creators.Add(messages.Game.NameToOpCode[lazy.Metadata.OpCode], lazy.Value); } _packetCreators = creators; }
public PacketLogReader(string fileName) { Stream stream = File.OpenRead(fileName); var magic = new byte[PacketLogEntry.Magic.Count]; if (stream.Read(magic, 0, magic.Length) != magic.Length) { throw new EndOfStreamException(); } if (!magic.SequenceEqual(PacketLogEntry.Magic)) { throw new InvalidDataException(); } Compressed = stream.ReadByte() != 0; if (Compressed) { stream = new DeflateStream(stream, CompressionMode.Decompress); } _reader = new TeraBinaryReader(stream); Version = _reader.ReadUInt32(); if (Version != PacketLogEntry.Version) { throw new InvalidDataException(); } var region = (Region)_reader.ReadByte(); if (!Enum.IsDefined(typeof(Region), region)) { throw new InvalidDataException(); } var clientVersion = _reader.ReadUInt32(); if (!OpCodeTable.Versions.Values.Contains(clientVersion)) { throw new InvalidDataException(); } Messages = new MessageTables(region, clientVersion); var serverCount = (int)_reader.ReadUInt32(); if (serverCount < 0) { throw new InvalidDataException(); } var servers = new Dictionary <int, ServerInfo>(serverCount); for (var i = 0; i < serverCount; i++) { var id = _reader.ReadInt32(); if (servers.ContainsKey(id)) { throw new InvalidDataException(); } var name = _reader.ReadString(); var size = _reader.ReadBoolean() ? 16 : 4; var realIPBytes = _reader.ReadBytes(size); var realPort = _reader.ReadUInt16(); var proxyIPBytes = _reader.ReadBytes(size); var proxyPort = _reader.ReadUInt16(); IPEndPoint realEP; IPEndPoint proxyEP; try { realEP = new IPEndPoint(new IPAddress(realIPBytes), realPort); proxyEP = new IPEndPoint(new IPAddress(proxyIPBytes), proxyPort); } catch (ArgumentException) { throw new InvalidDataException(); } servers.Add(id, new ServerInfo(id, name, realEP, proxyEP)); } Servers = servers; }
public ReflectionPacketSerializer(MessageTables messages) : base(messages) { }