コード例 #1
0
        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);
            }
        }
コード例 #2
0
 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)));
     }
 }
コード例 #3
0
 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
     }
 }
コード例 #4
0
 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));
 }
コード例 #5
0
ファイル: Program.cs プロジェクト: itsreiji/Terax
        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);
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        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;
        }
コード例 #8
0
        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;
        }
コード例 #9
0
 public ReflectionPacketSerializer(MessageTables messages)
     : base(messages)
 {
 }