private static void sendConfirmActive() { int num = 390; int num2 = 0; if (Secure.RDPEncrypted()) { num2 |= (int)(MCS.TS_SECURITY_HEADER.SEC_ENCRYPT); } RdpPacket data = new RdpPacket(); data.WriteLittleEndian16((short)((0x10 + num) + RDP_SOURCE.Length)); data.WriteLittleEndian16((short)0x13); data.WriteLittleEndian16((short)(MCS.McsUserID + 0x3e9)); data.WriteLittleEndian32(rdp_shareid); data.WriteLittleEndian16((short)0x3ea); data.WriteLittleEndian16((short)RDP_SOURCE.Length); data.WriteLittleEndian16((short)num); data.Write(RDP_SOURCE, 0, RDP_SOURCE.Length); data.WriteLittleEndian16((short)13); data.Position += 2L; sendGeneralCaps(data); sendBitmapCaps(data); sendOrderCaps(data); sendBitmapcacheCaps(data); sendColorcacheCaps(data); sendActivateCaps(data); sendControlCaps(data); sendPointerCaps(data); sendShareCaps(data); sendInputCaps(data); sendSoundCaps(data); sendFontCaps(data); sendGlyphCacheCaps(data); IsoLayer.SendToGlobalChannel(data, num2); }
/// <summary> /// Negotiation Start /// </summary> /// <param name="loadBalanceToken">null</param> /// <param name="bAutoReconnect">false</param> internal static void sendСonnectionRequest(byte[] loadBalanceToken, bool bAutoReconnect) { int num; Secure.dec_count = 0; Secure.enc_count = 0; Network.ConnectionStage = Network.eConnectionStage.Negotiating; if (Options.enableNLA) { // Client X.224 Connection Request PDU sendConnectNegotiation( NegotiationProtocol.PROTOCOL_RDP | NegotiationProtocol.PROTOCOL_SSL | NegotiationProtocol.PROTOCOL_HYBRID, loadBalanceToken); // Server X.224 Connection Confirm PDU num = receiveConnectNegotiation(); if (num == Main.SecureValue3) // SSL подключение запрещено настройками сервера { Network.Close(); Network.Connect(Options.Host, Options.Port); // Client X.224 Connection Request PDU sendConnectNegotiation(NegotiationProtocol.PROTOCOL_RDP, loadBalanceToken); // Server X.224 Connection Confirm PDU num = receiveConnectNegotiation(); if (num != 0) { throw new RDFatalException("Security negotiation failed!"); } } else // SSL подключение разрешено { if (((num & 1) != 0) || ((num & 2) != 0)) { Network.ConnectionStage = Network.eConnectionStage.Securing; Network.ConnectSSL(); } if ((num & 2) != 0) { Network.ConnectionStage = Network.eConnectionStage.Authenticating; CredSSP.Negotiate(Network.GetSSLPublicKey()); } } } else { // Client X.224 Connection Request PDU sendConnectNegotiation(NegotiationProtocol.PROTOCOL_RDP, loadBalanceToken); // Server X.224 Connection Confirm PDU num = receiveConnectNegotiation(); if (num != 0) { throw new RDFatalException("Security negotiation failed!"); } } Network.ConnectionStage = Network.eConnectionStage.Establishing; // Client MCS Connect Initial PDU IsoLayer.SendTPKT(sendConnectInitial(sendMcsData(true, Channels.RegisteredChannels.Count, num))); // Server MCS Connect Response PDU with GCC Conference Create Response receiveConnectResponse(); // Client MCS Erect Domain Request PDU send_ErectDomainRequest(); // Client MCS Attach User Request PDU send_AttachUserRequest(); // Server MCS Attach User Confirm PDU McsUserID = receive_AttachUserConfirm(); // Open User channel send_ChannelJoinRequest(McsUserID + MCS_USERCHANNEL_BASE); // Client MCS Channel Join Request PDU receive_ChannelJoinConfirm(); // Server MCS Channel Join Confirm PDU // Open Global channel send_ChannelJoinRequest(MSC_GLOBAL_CHANNEL); receive_ChannelJoinConfirm(); // Open over channels foreach (var channel in Channels.RegisteredChannels) { if (serverSupportedChannels.Contains(channel.ChannelID)) { send_ChannelJoinRequest(channel.ChannelID); receive_ChannelJoinConfirm(); Debug.WriteLine("Client open over channel: " + channel.ChannelID.ToString()); } } int num2 = 0x40; if (Secure.RDPEncrypted()) { Network.ConnectionStage = Network.eConnectionStage.SecureAndLogin; RdpPacket packet = Secure.establishKey(); packet.Position = 0L; IsoLayer.SendMCS(packet, MSC_GLOBAL_CHANNEL); num2 |= 8; } else { Network.ConnectionStage = Network.eConnectionStage.Login; } // Client Info PDU IsoLayer.SendToGlobalChannel(getLoginInfo(Options.Domain, Options.Username, Options.Password, "", "", bAutoReconnect), num2); }