/// <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; }
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; }