The Enhanced Security Server Redirection PDU is sent by the server to the client to instruct it to reconnect to an existing session on another server. The information required to perform the reconnection is contained in an embedded Server Redirection Packet (section 2.2.13.1). This PDU MUST NOT be sent if Standard RDP Security (see section 5.3) is in effect. The Standard Security Server Redirection PDU (see section 2.2.13.2.1) MUST be used instead.
Inheritance: RdpbcgrServerPdu
        /// <summary>
        /// Decode Enhanced Security Server Redirection PDU.
        /// </summary>
        /// <param name="data">data to be parsed</param>
        /// <param name="decryptedUserData">decrypted user data to be parsed</param>
        /// <param name="type">security header type</param>
        /// <returns>decoded Server Redirection PDU</returns>
        public StackPacket DecodeEnhancedServerRedirectionPDU(
            byte[] data,
            byte[] decryptedUserData,
            SecurityHeaderType type)
        {
            Enhanced_Security_Server_Redirection_Pdu pdu = new Enhanced_Security_Server_Redirection_Pdu();

            // data index
            int dataIndex = 0;

            // Server_Redirection_Pdu: commonHeader
            pdu.commonHeader = ParseMcsCommonHeader(data, ref dataIndex, type);

            // user data index
            int userDataIndex = 0;

            pdu.shareControlHeader = ParseTsShareControlHeader(decryptedUserData, ref userDataIndex);

            pdu.pad = ParseUInt16(decryptedUserData, ref userDataIndex, false);

            // Server_Redirection_PDU: serverRedirectionPdu
            pdu.serverRedirectionPdu = ParseRdpServerRedirectionPacket(decryptedUserData, ref userDataIndex);

            // check if there's paddings
            int remainBytes = decryptedUserData.Length - userDataIndex;
            if (remainBytes > 0)
            {
                pdu.pad1Octet = GetBytes(decryptedUserData, ref userDataIndex, remainBytes);
            }

            // Check if data length exceeded expectation
            VerifyDataLength(decryptedUserData.Length, userDataIndex, ConstValue.ERROR_MESSAGE_DATA_LENGTH_EXCEEDED);
            return pdu;
        }
示例#2
0
        public override StackPacket Clone()
        {
            Enhanced_Security_Server_Redirection_Pdu pduClone = new Enhanced_Security_Server_Redirection_Pdu();
            pduClone.commonHeader = commonHeader;
            pduClone.shareControlHeader = shareControlHeader;
            pduClone.pad = pad;
            pduClone.pad1Octet = RdpbcgrUtility.CloneByteArray(pad1Octet);
            pduClone.serverRedirectionPdu = new RDP_SERVER_REDIRECTION_PACKET();
            pduClone.serverRedirectionPdu.Domain = RdpbcgrUtility.CloneByteArray(serverRedirectionPdu.Domain);
            pduClone.serverRedirectionPdu.DomainLength = serverRedirectionPdu.DomainLength;
            pduClone.serverRedirectionPdu.Flags = serverRedirectionPdu.Flags;
            pduClone.serverRedirectionPdu.Length = serverRedirectionPdu.Length;
            pduClone.serverRedirectionPdu.LoadBalanceInfo = RdpbcgrUtility.CloneByteArray(serverRedirectionPdu.LoadBalanceInfo);
            pduClone.serverRedirectionPdu.LoadBalanceInfoLength = serverRedirectionPdu.LoadBalanceInfoLength;
            pduClone.serverRedirectionPdu.Pad = RdpbcgrUtility.CloneByteArray(serverRedirectionPdu.Pad);
            pduClone.serverRedirectionPdu.Password = RdpbcgrUtility.CloneByteArray(serverRedirectionPdu.Password);
            pduClone.serverRedirectionPdu.PasswordLength = serverRedirectionPdu.PasswordLength;
            pduClone.serverRedirectionPdu.RedirFlags = serverRedirectionPdu.RedirFlags;
            pduClone.serverRedirectionPdu.SessionId = serverRedirectionPdu.SessionId;
            pduClone.serverRedirectionPdu.TargetFQDN = RdpbcgrUtility.CloneByteArray(serverRedirectionPdu.TargetFQDN);
            pduClone.serverRedirectionPdu.TargetFQDNLength = serverRedirectionPdu.TargetFQDNLength;
            pduClone.serverRedirectionPdu.TargetNetAddress = RdpbcgrUtility.CloneByteArray(serverRedirectionPdu.TargetNetAddress);
            pduClone.serverRedirectionPdu.TargetNetAddresses.addressCount = serverRedirectionPdu.TargetNetAddresses.addressCount;
            if (serverRedirectionPdu.TargetNetAddresses.address != null)
            {
                pduClone.serverRedirectionPdu.TargetNetAddresses.address =
                    new TARGET_NET_ADDRESS[serverRedirectionPdu.TargetNetAddresses.address.Length];
                for (int i = 0; i < serverRedirectionPdu.TargetNetAddresses.address.Length; ++i)
                {
                    pduClone.serverRedirectionPdu.TargetNetAddresses.address[i].address =
                        RdpbcgrUtility.CloneByteArray(serverRedirectionPdu.TargetNetAddresses.address[i].address);
                    pduClone.serverRedirectionPdu.TargetNetAddresses.address[i].addressLength =
                        serverRedirectionPdu.TargetNetAddresses.address[i].addressLength;
                }
            }
            pduClone.serverRedirectionPdu.TargetNetAddressesLength = serverRedirectionPdu.TargetNetAddressesLength;
            pduClone.serverRedirectionPdu.TargetNetAddressLength = serverRedirectionPdu.TargetNetAddressLength;
            pduClone.serverRedirectionPdu.TargetNetBiosName =
                RdpbcgrUtility.CloneByteArray(serverRedirectionPdu.TargetNetBiosName);
            pduClone.serverRedirectionPdu.TargetNetBiosNameLength =
                serverRedirectionPdu.TargetNetBiosNameLength;
            pduClone.serverRedirectionPdu.UserName = RdpbcgrUtility.CloneByteArray(serverRedirectionPdu.UserName);
            pduClone.serverRedirectionPdu.UserNameLength = serverRedirectionPdu.UserNameLength;

            return pduClone;
        }