/// <summary> /// Decode Standard 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 DecodeServerRedirectionPDU( byte[] data, byte[] decryptedUserData, SecurityHeaderType type) { Server_Redirection_Pdu pdu = new Server_Redirection_Pdu(); // data index int dataIndex = 0; UpdateSecurityHeaderType(ref type); // Server_Redirection_Pdu: commonHeader pdu.commonHeader = ParseMcsCommonHeader(data, ref dataIndex, type); // user data index int userDataIndex = 0; // Server_Redirection_PDU: serverRedirectionPdu pdu.serverRedirectionPdu = ParseRdpServerRedirectionPacket(decryptedUserData, ref userDataIndex); // Check if data length exceeded expectation VerifyDataLength(decryptedUserData.Length, userDataIndex, ConstValue.ERROR_MESSAGE_DATA_LENGTH_EXCEEDED); return pdu; }
public override StackPacket Clone() { Server_Redirection_Pdu pduClone = new Server_Redirection_Pdu(); pduClone.commonHeader = commonHeader; 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; }