Exemplo n.º 1
0
        public ClaimsSetMetadata(byte[] data)
        {
            var pacStream = new NdrBinaryReader(data);

            Header = new RpcHeader(pacStream);

            ClaimSetSize = pacStream.ReadInt();

            pacStream.Seek(4);

            CompressionFormat        = (CompressionFormat)pacStream.ReadInt();
            UncompressedClaimSetSize = pacStream.ReadInt();
            ReservedType             = pacStream.ReadShort();
            ReservedFieldSize        = pacStream.ReadInt();

            pacStream.Align(8);
            var size = pacStream.ReadInt();

            if (size != ClaimSetSize)
            {
                throw new InvalidDataException($"Data length {size} doesn't match expected ClaimSetSize {ClaimSetSize}");
            }

            var claimSet = pacStream.Read(ClaimSetSize);

            if (CompressionFormat != CompressionFormat.COMPRESSION_FORMAT_NONE)
            {
                claimSet = Compressions.Decompress(claimSet, UncompressedClaimSetSize, CompressionFormat);
            }

            ClaimsSet = new ClaimsSet(claimSet);

            ReservedField = pacStream.Read(ReservedFieldSize);
        }
Exemplo n.º 2
0
        protected NdrMessage(byte[] data) : base(data)
        {
            if ((data?.Length ?? 0) <= 0)
            {
                return;
            }

            Header = Stream.ReadNdrHeader();
        }
Exemplo n.º 3
0
            public void Response(Action body, RpcHeader header)
            {
                var before = m.Position;

                m.Seek(RpcHeader.HeaderLength, SeekOrigin.Current);
                body();
                var after = m.Position;

                m.Seek(before, SeekOrigin.Begin);
                Write(header.Response((uint)(after - before - RpcHeader.HeaderLength)));

                m.Seek(after, SeekOrigin.Begin);
            }
Exemplo n.º 4
0
            public Action <Writer> Dispatch(RpcHeader header)
            {
#if DEBUG
                assert(header.Length, "RpcBody " + (MethodId)header.MethodId);
#endif

                switch ((MethodId)header.MethodId)
                {
                case MethodId.Add:
                    return(_ => OnAdd(r.ReadInt32()));


                case MethodId.Echo:
                    return(_ => OnEcho(r.ReadFullType()));


                case MethodId.Exchange:
                    return(_ => OnExchange(r.ReadItemArray()));


                case MethodId.Get:
                    return(_ => OnGet(r.ReadItem()));



                case MethodId.Change:

                    Item[] consume = r.ReadItemArray();


                    return(w => w.ResponseChange(OnChange(consume), header));



                case MethodId.Ping:

                    FullType type = r.ReadFullType();


                    return(w => w.ResponsePing(OnPing(type), header));



                default:
                    return(null);
                }
            }
Exemplo n.º 5
0
            public IEnumerator <uint> Parse(Func <MemoryStream> get, BinaryPackerWriterEx w)
            {
                while (true)
                {
                    yield return(RpcHeader.HeaderLength);

                    var r      = new BinaryPackerReaderEx(get());
                    var header = new RpcHeader(r.ReadUInt32());

                    yield return(header.Length);

                    switch ((MethodId)header.MethodId)
                    {
                    case MethodId.Add:
                        OnAdd(r.ReadInt32());
                        break;

                    case MethodId.Echo:
                        OnEcho(r.ReadFullType());
                        break;

                    case MethodId.Exchange:
                        OnExchange(r.ReadItemArray());
                        break;

                    case MethodId.Get:
                        OnGet(r.ReadItem());
                        break;

                    case MethodId.Change:
                        Item[] consume = r.ReadItemArray();
                        w.Write(OnChange(consume));
                        break;

                    case MethodId.Ping:
                        FullType type = r.ReadFullType();
                        w.Write(OnPing(type));
                        break;

                    // invalid case
                    default:
                        throw new InvalidDataException("Invalid methodId = " + header.MethodId);
                    }
                }
            }
Exemplo n.º 6
0
            public static RpcHeader FromStream(BinaryReader reader)
            {
                RpcHeader header = new RpcHeader();

                header.MajorVersion       = reader.ReadByte();
                header.MinorVersion       = reader.ReadByte();
                header.PacketType         = reader.ReadByte();
                header.PacketFlags        = reader.ReadByte();
                header.DataRepresentation = reader.ReadUInt32();
                header.FragLength         = reader.ReadUInt16();
                header.AuthLength         = reader.ReadUInt16();
                header.CallId             = reader.ReadUInt32();

                header.Data     = reader.ReadBytes(header.FragLength - header.AuthLength - 16);
                header.AuthData = reader.ReadBytes(header.AuthLength);

                return(header);
            }
Exemplo n.º 7
0
        static void WriterThread(object o)
        {
            RpcContextSplit ctx = (RpcContextSplit)o;

            try
            {
                while (true)
                {
                    RpcHeader header = RpcHeader.FromStream(ctx.serverReader);

                    //Console.WriteLine("<= Packet: {0} Data: {1} Auth: {2}", header.PacketType, header.FragLength, header.AuthLength);
                    header.ToStream(ctx.clientWriter);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }

            Console.WriteLine("Stopping Writer Thread");
            ctx.client.Client.Shutdown(SocketShutdown.Send);
            ctx.server.Client.Shutdown(SocketShutdown.Receive);
        }
Exemplo n.º 8
0
            public Action<Writer> Dispatch(RpcHeader header)
            {
                #if DEBUG
                assert(header.Length, "RpcBody " + (MethodId)header.MethodId);
                #endif

                switch((MethodId)header.MethodId)
                {

                case MethodId.Change:
                    return _ => OnChange(r.ReadItemArray());

                case MethodId.Ping:
                    return _ => OnPing(r.ReadFullType());

                case MethodId.Add:

                    Int32 a = r.ReadInt32();

                    Int32 b = r.ReadInt32();

                    return w => w.ResponseAdd(OnAdd(a, b), header);

                case MethodId.Echo:

                    FullType type = r.ReadFullType();

                    return w => w.ResponseEcho(OnEcho(type), header);

                case MethodId.Empty:

                    return _ => OnEmpty();

                case MethodId.Exchange:

                    Item[] consume = r.ReadItemArray();

                    return w => w.ResponseExchange(OnExchange(consume), header);

                case MethodId.Get:

                    return w => w.ResponseGet(OnGet(), header);

                case MethodId.Put:

                    Item item = r.ReadItem();

                    return _ => OnPut(item);

                default:
                    return null;
                }
            }
Exemplo n.º 9
0
        /// <summary>
        /// Read from the client socket and send to server
        /// </summary>
        /// <param name="o"></param>
        static void ReaderThread(object o)
        {
            RpcContextSplit ctx         = (RpcContextSplit)o;
            bool            isauth      = false;
            bool            replacediid = false;

            try
            {
                while (true)
                {
                    RpcHeader header = RpcHeader.FromStream(ctx.clientReader);

                    if (!isauth && header.AuthLength > 0)
                    {
                        isauth = true;
                    }

                    if (isauth)
                    {
                        if (!replacediid)
                        {
                            byte[] b = ReplaceBytes(header.Data, oxidResolveIID, systemActivatorIID);
                            if (b != null)
                            {
                                header.Data = b;
                                replacediid = true;
                            }
                        }
                        else
                        {
                            // Is a RPC request
                            if (header.PacketType == 0)
                            {
                                //Console.WriteLine("Changing activation at localsystem");

                                byte[] actData = Trebuchet.Properties.Resources.request;

                                for (int i = 0; i < ctx.objref.Length; ++i)
                                {
                                    // Replace the marshalled IStorage object
                                    actData[i + 0x368] = ctx.objref[i];
                                }

                                RpcHeader newHeader = RpcHeader.FromStream(new BinaryReader(new MemoryStream(actData)));

                                // Fixup callid
                                newHeader.CallId = header.CallId;

                                header = newHeader;
                            }
                        }
                    }

                    //Console.WriteLine("=> Packet: {0} Data: {1} Auth: {2} {3}", header.PacketType, header.FragLength, header.AuthLength, isauth);

                    header.ToStream(ctx.serverWriter);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }

            Console.WriteLine("Stopping Reader Thread");

            ctx.client.Client.Shutdown(SocketShutdown.Receive);
            ctx.server.Client.Shutdown(SocketShutdown.Send);
        }
Exemplo n.º 10
0
 public void ResponseExchange(Item[] x, RpcHeader header)
 {
     w.Response(() => w.Write(x), header);
 }
Exemplo n.º 11
0
 public void ResponseGet(Item x, RpcHeader header)
 {
     w.Response(() => w.Write(x), header);
 }
Exemplo n.º 12
0
 public void ResponseAdd(Int32 x, RpcHeader header)
 {
     w.Response(() => w.Write(x), header);
 }
Exemplo n.º 13
0
 public void ResponseEcho(FullType x, RpcHeader header)
 {
     w.Response(() => w.Write(x), header);
 }
Exemplo n.º 14
0
            public static RpcHeader FromStream(BinaryReader reader)
            {
                RpcHeader header = new RpcHeader();
                header.MajorVersion = reader.ReadByte();
                header.MinorVersion = reader.ReadByte();
                header.PacketType = reader.ReadByte();
                header.PacketFlags = reader.ReadByte();
                header.DataRepresentation = reader.ReadUInt32();
                header.FragLength = reader.ReadUInt16();
                header.AuthLength = reader.ReadUInt16();
                header.CallId = reader.ReadUInt32();

                header.Data = reader.ReadBytes(header.FragLength - header.AuthLength - 16);
                header.AuthData = reader.ReadBytes(header.AuthLength);

                return header;
            }
Exemplo n.º 15
0
 public void ResponseGet(Item x, RpcHeader header)
 {
     w.Response(() => w.Write(x), header);
 }
Exemplo n.º 16
0
 public void ResponseAdd(Int32 x, RpcHeader header)
 {
     w.Response(() => w.Write(x), header);
 }
Exemplo n.º 17
0
            public void Response(Action body, RpcHeader header)
            {
                var before = m.Position;
                m.Seek(RpcHeader.HeaderLength, SeekOrigin.Current);
                body();
                var after = m.Position;

                m.Seek(before, SeekOrigin.Begin);
                Write(header.Response((uint)(after - before)));

                m.Seek(after, SeekOrigin.Begin);
            }
Exemplo n.º 18
0
            public IEnumerator<uint> Parse(Func<MemoryStream> get, BinaryPackerWriterEx w)
            {
                while(true)
                {
                yield return RpcHeader.HeaderLength;
                var r = new BinaryPackerReaderEx(get());
                var header = new RpcHeader(r.ReadUInt32());

                yield return header.Length;
                switch((MethodId)header.MethodId)
                {
                    case MethodId.Add:
                        OnAdd(r.ReadInt32());
                        break;

                    case MethodId.Echo:
                        OnEcho(r.ReadFullType());
                        break;

                    case MethodId.Exchange:
                        OnExchange(r.ReadItemArray());
                        break;

                    case MethodId.Get:
                        OnGet(r.ReadItem());
                        break;

                    case MethodId.Change:
                        Item[] consume = r.ReadItemArray();
                        w.Write(OnChange(consume));
                        break;

                    case MethodId.Ping:
                        FullType type = r.ReadFullType();
                        w.Write(OnPing(type));
                        break;

                    // invalid case
                    default:
                        throw new InvalidDataException("Invalid methodId = " + header.MethodId);
                }
                }
            }
Exemplo n.º 19
0
 public void ResponsePing(FullType x, RpcHeader header)
 {
     w.Response(() => w.Write(x), header);
 }
Exemplo n.º 20
0
 public void ResponseChange(Item[] x, RpcHeader header)
 {
     w.Response(() => w.Write(x), header);
 }