示例#1
0
 private static void sendSoundCaps(RdpPacket packet)
 {
     packet.WriteLittleEndian16((short)12);
     packet.WriteLittleEndian16((short)8);
     packet.WriteLittleEndian16((short)0);
     packet.WriteLittleEndian16((short)0);
 }
示例#2
0
 private static void sendColorcacheCaps(RdpPacket data)
 {
     data.WriteLittleEndian16((short)10);
     data.WriteLittleEndian16((short)8);
     data.WriteLittleEndian16((short)6);
     data.WriteLittleEndian16((short)0);
 }
示例#3
0
        public byte[] Negotiate()
        {
            RdpPacket packet   = new RdpPacket();
            uint      num      = (((((((0xe2000000 | RDPClient.NTLMSSP_NEGOTIATE_EXTENDED_SESSION_SECURITY) | RDPClient.NTLMSSP_NEGOTIATE_ALWAYS_SIGN) | RDPClient.NTLMSSP_NEGOTIATE_NTLM) | RDPClient.NTLMSSP_NEGOTIATE_SEAL) | RDPClient.NTLMSSP_NEGOTIATE_SIGN) | RDPClient.NTLMSSP_REQUEST_TARGET) | RDPClient.NTLMSSP_NEGOTIATE_OEM) | RDPClient.NTLMSSP_NEGOTIATE_UNICODE;
            int       position = (int)packet.Position;

            packet.WriteString("NTLMSSP", false);
            packet.WriteByte(0);
            packet.WriteLittleEndian32(1);
            packet.WriteLittleEndian32(num);
            int num3 = ((int)packet.Position) - position;

            num3 += 8;
            num3 += 8;
            if ((num & 0x2000000) != 0)
            {
                num3 += 8;
            }
            packet.WriteLittleEndian16((short)0);
            packet.WriteLittleEndian16((short)0);
            packet.WriteLittleEndian32(0);
            packet.WriteLittleEndian16((short)0);
            packet.WriteLittleEndian16((short)0);
            packet.WriteLittleEndian32(0);
            if ((num & 0x2000000) != 0)
            {
                this.WriteVersion(packet);
            }
            packet.Position     = 0L;
            this.m_NegotiateMsg = new byte[packet.Length];
            packet.Read(this.m_NegotiateMsg, 0, this.m_NegotiateMsg.Length);
            return(this.m_NegotiateMsg);
        }
示例#4
0
 private static void sendFontCaps(RdpPacket packet)
 {
     packet.WriteLittleEndian16((short)14);
     packet.WriteLittleEndian16((short)8);
     packet.WriteLittleEndian16((short)1);
     packet.WriteLittleEndian16((short)0);
 }
示例#5
0
 private static void sendPointerCaps(RdpPacket packet)
 {
     packet.WriteLittleEndian16((short)8);
     packet.WriteLittleEndian16((short)10);
     packet.WriteLittleEndian16((short)1);
     packet.WriteLittleEndian16((short)20);
     packet.WriteLittleEndian16((short)0x15);
 }
示例#6
0
        private static void sendSynchronize()
        {
            RdpPacket packet = new RdpPacket();

            packet.WriteLittleEndian16((short)1);
            packet.WriteLittleEndian16((short)0x3ea);
            IsoLayer.sendDataPDU(packet, IsoLayer.PDUType2.PDUTYPE2_SYNCHRONIZE, Secure.RDPEncrypted() ? MCS.SEC_ENCRYPT : 0);
        }
示例#7
0
        private static void sendControl(int action)
        {
            RdpPacket packet = new RdpPacket();

            packet.WriteLittleEndian16((short)action);
            packet.WriteLittleEndian16((short)0);
            packet.WriteLittleEndian32(0);
            IsoLayer.sendDataPDU(packet, IsoLayer.PDUType2.PDUTYPE2_CONTROL, Secure.RDPEncrypted() ? MCS.SEC_ENCRYPT : 0);
        }
示例#8
0
        private static void sendFontList()
        {
            RdpPacket packet = new RdpPacket();

            packet.WriteLittleEndian16((short)0);
            packet.WriteLittleEndian16((short)0);
            packet.WriteLittleEndian16((short)3);
            packet.WriteLittleEndian16((short)50);
            IsoLayer.sendDataPDU(packet, IsoLayer.PDUType2.PDUTYPE2_FONTLIST, Secure.RDPEncrypted() ? MCS.SEC_ENCRYPT : 0);
        }
示例#9
0
 private static void sendInputCaps(RdpPacket packet)
 {
     packet.WriteLittleEndian16((short)13);
     packet.WriteLittleEndian16((short)0x58);
     packet.WriteLittleEndian16((short)0x11);
     packet.WriteLittleEndian16((short)0);
     packet.WriteLittleEndian32(0x409);
     packet.WriteLittleEndian32(4);
     packet.WriteLittleEndian32(0);
     packet.WriteLittleEndian32(12);
     packet.Position += 0x40L;
 }
示例#10
0
        public static void Disconnect()
        {
            RdpPacket packet = new RdpPacket();

            packet.WriteLittleEndian16((short)1);
            packet.WriteLittleEndian16((short)0x3ea);
            IsoLayer.sendDataPDU(packet, IsoLayer.PDUType2.PDUTYPE2_SHUTDOWN_REQUEST, Secure.RDPEncrypted() ? SEC_ENCRYPT : 0);
            packet = new RdpPacket();
            packet.WriteByte((byte)(DPUM << 2));
            packet.WriteByte(3);
            IsoLayer.SendTPKT(packet);
        }
示例#11
0
        internal static void send_request(byte[] client_random, byte[] rsa_data, byte[] username, byte[] host)
        {
            int       num    = 0x80;
            int       num2   = (username.Length == 0) ? 0 : (username.Length + 1);
            int       num3   = (host.Length == 0) ? 0 : (host.Length + 1);
            int       num4   = (0x80 + num2) + num3;
            RdpPacket packet = new RdpPacket();

            packet.WriteLittleEndian32(num);
            packet.WriteByte(0x13);
            packet.WriteByte(2);
            packet.WriteLittleEndian16((short)num4);
            packet.WriteLittleEndian32(1);
            packet.WriteLittleEndianU32(0xff010000);
            packet.Write(client_random, 0, 0x20);
            packet.WriteLittleEndian16((short)0);
            packet.WriteLittleEndian16((short)(RDPClient.modulus_size + 8));
            packet.Write(rsa_data, 0, RDPClient.modulus_size);
            packet.Position += 8L;
            packet.WriteLittleEndian16((short)15);
            packet.WriteLittleEndian16((short)num2);
            if (num2 != 0)
            {
                packet.Write(username, 0, num2 - 1);
                packet.WriteByte(0);
            }
            packet.WriteLittleEndian16((short)0x10);
            packet.WriteLittleEndian16((short)num3);
            if (num3 != 0)
            {
                packet.Write(host, 0, num3 - 1);
                packet.WriteByte(0);
            }
            IsoLayer.SendMCS(packet, MCS.MSC_GLOBAL_CHANNEL);
        }
示例#12
0
        internal static void send_authresp(byte[] token, byte[] crypt_hwid, byte[] signature)
        {
            int       num    = 0x80;
            int       num2   = 0x3a;
            RdpPacket packet = new RdpPacket();

            packet.WriteLittleEndian32(num);
            packet.WriteByte(0x15);
            packet.WriteByte(2);
            packet.WriteLittleEndian16((short)num2);
            packet.WriteLittleEndian16((short)1);
            packet.WriteLittleEndian16((short)10);
            packet.Write(token, 0, 10);
            packet.WriteLittleEndian16((short)1);
            packet.WriteLittleEndian16((short)20);
            packet.Write(crypt_hwid, 0, 20);
            packet.Write(signature, 0, 0x10);
            IsoLayer.SendMCS(packet, MCS.MSC_GLOBAL_CHANNEL);
        }
示例#13
0
        internal static void sendDataPDU(RdpPacket packet, PDUType2 type, int sec_flags)
        {
            RdpPacket packet2 = new RdpPacket();

            packet.Position = 0L;
            int num = ((int)packet.Length) + 0x12;

            packet2.WriteLittleEndian16((short)num);
            packet2.WriteLittleEndian16((short)0x17);
            packet2.WriteLittleEndian16((short)(RDPClient.McsUserID + 0x3e9));
            packet2.WriteLittleEndian32(RDPClient.rdp_shareid);
            packet2.WriteByte(0);
            packet2.WriteByte(1);
            packet2.WriteLittleEndian16((short)(num - 14));
            packet2.WriteByte((byte)type);
            packet2.WriteByte(0);
            packet2.WriteLittleEndian16((short)0);
            packet2.copyToByteArray(packet);
            SendMCS_GlobalChannel(packet2, sec_flags);
        }
示例#14
0
 private static void sendControlCaps(RdpPacket packet)
 {
     packet.WriteLittleEndian16((short)5);
     packet.WriteLittleEndian16((short)12);
     packet.WriteLittleEndian16((short)0);
     packet.WriteLittleEndian16((short)0);
     packet.WriteLittleEndian16((short)2);
     packet.WriteLittleEndian16((short)2);
 }
示例#15
0
 private static void sendActivateCaps(RdpPacket data)
 {
     data.WriteLittleEndian16((short)7);
     data.WriteLittleEndian16((short)12);
     data.WriteLittleEndian16((short)0);
     data.WriteLittleEndian16((short)0);
     data.WriteLittleEndian16((short)0);
     data.WriteLittleEndian16((short)0);
 }
示例#16
0
 internal static void internal_sendInput(int time, int message_type, int device_flags, uint param1, uint param2)
 {
     if (Network.ConnectionAlive || (message_type == 0))
     {
         RdpPacket packet = new RdpPacket();
         packet.WriteLittleEndian16((short)1);
         packet.WriteLittleEndian16((short)0);
         packet.WriteLittleEndian32(time);
         packet.WriteLittleEndian16((short)message_type);
         packet.WriteLittleEndian16((short)device_flags);
         packet.WriteLittleEndian16((ushort)param1);
         packet.WriteLittleEndian16((ushort)param2);
         sendDataPDU(packet, PDUType2.PDUTYPE2_INPUT, Secure.RDPEncrypted() ? MCS.SEC_ENCRYPT : 0);
     }
 }
示例#17
0
        private static void sendConnectNegotiation(int NegotiationFlags, byte[] loadBalanceToken)
        {
            string domainAndUsername = RDPClient.DomainAndUsername;

            if (domainAndUsername.Length > 9)
            {
                domainAndUsername = domainAndUsername.Substring(0, 9);
            }
            RdpPacket packet = new RdpPacket();

            packet.WriteByte(3);
            packet.WriteByte(0);
            long position = packet.Position;

            packet.WriteBigEndian16((short)0);
            packet.WriteByte(0);
            packet.WriteByte(0xe0);
            packet.WriteBigEndian16((short)0);
            packet.WriteBigEndian16((short)0);
            packet.WriteByte(0);
            if (loadBalanceToken != null)
            {
                packet.Write(loadBalanceToken, 0, loadBalanceToken.Length);
                packet.WriteString("\r\n", false);
            }
            else
            {
                packet.WriteString("Cookie: mstshash=" + domainAndUsername + "\r\n", true);
            }
            packet.WriteByte(1);
            packet.WriteByte(0);
            packet.WriteLittleEndian16((short)8);
            packet.WriteLittleEndian32(NegotiationFlags);
            long num2 = packet.Position;

            packet.Position = position;
            packet.WriteBigEndian16((short)num2);
            packet.WriteByte((byte)(num2 - 5L));
            IsoLayer.Write(packet);
        }
示例#18
0
        private static void sendConfirmActive()
        {
            int num  = 390;
            int num2 = 0;

            if (Secure.RDPEncrypted())
            {
                num2 |= MCS.SEC_ENCRYPT;
            }
            RdpPacket data = new RdpPacket();

            data.WriteLittleEndian16((short)((0x10 + num) + RDP_SOURCE.Length));
            data.WriteLittleEndian16((short)0x13);
            data.WriteLittleEndian16((short)(RDPClient.McsUserID + 0x3e9));
            data.WriteLittleEndian32(RDPClient.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.SendMCS_GlobalChannel(data, num2);
        }
示例#19
0
        private byte[] Authenticate(byte[] lmChallengeResponse, byte[] ntChallengeResponse, string sDomainName, string sUser, string sWorkstation, byte[] EncryptedRandomSessionKey, byte[] ExportedSessionKey, bool bGenerateMIC)
        {
            RdpPacket packet = new RdpPacket();
            uint      flags  = ((((((0xe2800000 | RDPClient.NTLMSSP_NEGOTIATE_EXTENDED_SESSION_SECURITY) | RDPClient.NTLMSSP_NEGOTIATE_ALWAYS_SIGN) | RDPClient.NTLMSSP_NEGOTIATE_NTLM) | RDPClient.NTLMSSP_NEGOTIATE_SEAL) | RDPClient.NTLMSSP_NEGOTIATE_SIGN) | RDPClient.NTLMSSP_REQUEST_TARGET) | RDPClient.NTLMSSP_NEGOTIATE_UNICODE;

            DumpFlags(flags);
            int position = (int)packet.Position;

            packet.WriteString("NTLMSSP", false);
            packet.WriteByte(0);
            packet.WriteLittleEndian32(3);
            int num3 = ((int)packet.Position) - position;

            num3 += 8;
            num3 += 8;
            num3 += 8;
            num3 += 8;
            num3 += 8;
            num3 += 8;
            num3 += 4;
            if ((flags & 0x2000000) != 0)
            {
                num3 += 8;
            }
            if (bGenerateMIC)
            {
                num3 += 0x10;
            }
            byte[] bytes   = Encoding.Unicode.GetBytes(sDomainName);
            byte[] buffer  = Encoding.Unicode.GetBytes(sUser);
            byte[] buffer3 = Encoding.Unicode.GetBytes(sWorkstation);
            int    num4    = num3;
            int    num5    = num4 + bytes.Length;
            int    num6    = num5 + buffer.Length;
            int    num7    = num6 + buffer3.Length;
            int    num8    = num7 + lmChallengeResponse.Length;
            int    num9    = num8 + ntChallengeResponse.Length;

            packet.WriteLittleEndian16((ushort)lmChallengeResponse.Length);
            packet.WriteLittleEndian16((ushort)lmChallengeResponse.Length);
            packet.WriteLittleEndian32(num7);
            num3 += lmChallengeResponse.Length;
            packet.WriteLittleEndian16((ushort)ntChallengeResponse.Length);
            packet.WriteLittleEndian16((ushort)ntChallengeResponse.Length);
            packet.WriteLittleEndian32(num8);
            num3 += ntChallengeResponse.Length;
            packet.WriteLittleEndian16((ushort)bytes.Length);
            packet.WriteLittleEndian16((ushort)bytes.Length);
            packet.WriteLittleEndian32(num4);
            num3 += bytes.Length;
            packet.WriteLittleEndian16((ushort)buffer.Length);
            packet.WriteLittleEndian16((ushort)buffer.Length);
            packet.WriteLittleEndian32(num5);
            num3 += buffer.Length;
            packet.WriteLittleEndian16((ushort)buffer3.Length);
            packet.WriteLittleEndian16((ushort)buffer3.Length);
            packet.WriteLittleEndian32(num6);
            num3 += buffer3.Length;
            packet.WriteLittleEndian16((ushort)EncryptedRandomSessionKey.Length);
            packet.WriteLittleEndian16((ushort)EncryptedRandomSessionKey.Length);
            packet.WriteLittleEndian32(num9);
            num3 += EncryptedRandomSessionKey.Length;
            packet.WriteLittleEndian32(flags);
            if ((flags & 0x2000000) != 0)
            {
                this.WriteVersion(packet);
            }
            long num10 = packet.Position;

            if (bGenerateMIC)
            {
                packet.WritePadding(0x10);
            }
            packet.Write(bytes, 0, bytes.Length);
            packet.Write(buffer, 0, buffer.Length);
            packet.Write(buffer3, 0, buffer3.Length);
            packet.Write(lmChallengeResponse, 0, lmChallengeResponse.Length);
            packet.Write(ntChallengeResponse, 0, ntChallengeResponse.Length);
            packet.Write(EncryptedRandomSessionKey, 0, EncryptedRandomSessionKey.Length);
            if (bGenerateMIC)
            {
                packet.Position = 0L;
                byte[] buffer4 = new byte[packet.Length];
                packet.Read(buffer4, 0, buffer4.Length);
                HMACT64 hmact = new HMACT64(ExportedSessionKey);
                hmact.update(this.m_NegotiateMsg);
                hmact.update(this.m_ChallengeMsg);
                hmact.update(buffer4);
                byte[] buffer5 = hmact.digest();
                packet.Position = num10;
                packet.Write(buffer5, 0, buffer5.Length);
            }
            packet.Position = 0L;
            byte[] buffer6 = new byte[packet.Length];
            packet.Read(buffer6, 0, buffer6.Length);
            return(buffer6);
        }
示例#20
0
 private static void sendOrderCaps(RdpPacket data)
 {
     byte[] buffer = new byte[0x20];
     buffer[0]    = 1;
     buffer[1]    = 1;
     buffer[2]    = 1;
     buffer[3]    = 1;
     buffer[4]    = 1;
     buffer[7]    = 0;
     buffer[8]    = 1;
     buffer[9]    = 0;
     buffer[11]   = 1;
     buffer[15]   = 0;
     buffer[0x10] = 1;
     buffer[0x11] = 0;
     buffer[0x12] = 1;
     buffer[0x13] = 0;
     buffer[20]   = 0;
     buffer[0x15] = 0;
     buffer[0x16] = 1;
     buffer[0x18] = 0;
     buffer[0x19] = 0;
     buffer[0x1a] = 0;
     buffer[0x1b] = 1;
     data.WriteLittleEndian16((short)3);
     data.WriteLittleEndian16((short)0x58);
     data.Position += 20L;
     data.WriteLittleEndian16((short)1);
     data.WriteLittleEndian16((short)20);
     data.WriteLittleEndian16((short)0);
     data.WriteLittleEndian16((short)1);
     data.WriteLittleEndian16((short)0);
     data.WriteLittleEndian16((short)170);
     data.Write(buffer, 0, 0x20);
     data.WriteLittleEndian16((short)0x6a1);
     data.WriteLittleEndian16((short)2);
     data.Position += 4L;
     data.WriteLittleEndian32(0x38400);
     data.WriteLittleEndian32(0);
     data.WriteLittleEndian16((short)0x4e4);
     data.WriteLittleEndian16((short)0);
 }
示例#21
0
 private static void sendGlyphCacheCaps(RdpPacket packet)
 {
     packet.WriteLittleEndian16((short)0x10);
     packet.WriteLittleEndian16((short)0x34);
     packet.WriteLittleEndian16((short)0xfe);
     packet.WriteLittleEndian16((short)4);
     packet.WriteLittleEndian16((short)0xfe);
     packet.WriteLittleEndian16((short)4);
     packet.WriteLittleEndian16((short)0xfe);
     packet.WriteLittleEndian16((short)8);
     packet.WriteLittleEndian16((short)0xfe);
     packet.WriteLittleEndian16((short)8);
     packet.WriteLittleEndian16((short)0xfe);
     packet.WriteLittleEndian16((short)0x10);
     packet.WriteLittleEndian16((short)0xfe);
     packet.WriteLittleEndian16((short)0x20);
     packet.WriteLittleEndian16((short)0xfe);
     packet.WriteLittleEndian16((short)0x40);
     packet.WriteLittleEndian16((short)0xfe);
     packet.WriteLittleEndian16((short)0x80);
     packet.WriteLittleEndian16((short)0xfe);
     packet.WriteLittleEndian16((short)0x100);
     packet.WriteLittleEndian16((short)0x40);
     packet.WriteLittleEndian16((short)0x800);
     packet.WriteLittleEndian32(0x10000);
     packet.WriteLittleEndian16((short)3);
     packet.WriteLittleEndian16((short)0);
 }
示例#22
0
        private static void sendGeneralCaps(RdpPacket data)
        {
            data.WriteLittleEndian16((short)1);
            data.WriteLittleEndian16((short)0x18);
            data.WriteLittleEndian16((short)1);
            data.WriteLittleEndian16((short)3);
            data.WriteLittleEndian16((short)0x200);
            data.WriteLittleEndian16((short)0);
            data.WriteLittleEndian16((short)0);
            ExtraFlags flags = ExtraFlags.NO_BITMAP_COMPRESSION_HDR | ExtraFlags.ENC_SALTED_CHECKSUM | ExtraFlags.AUTORECONNECT_SUPPORTED | ExtraFlags.LONG_CREDENTIALS_SUPPORTED;

            if (RDPClient.enableFastPathOutput)
            {
                flags |= ExtraFlags.FASTPATH_OUTPUT_SUPPORTED;
            }
            data.WriteLittleEndian16((short)flags);
            data.WriteLittleEndian16((short)0);
            data.WriteLittleEndian16((short)0);
            data.WriteLittleEndian16((short)0);
            data.WriteLittleEndian16((short)0);
        }
示例#23
0
            public byte[] Serialise()
            {
                RdpPacket packet = new RdpPacket();

                if (this.NbDomainName.length > 0)
                {
                    packet.WriteLittleEndian16((short)2);
                    packet.WriteLittleEndian16((short)this.NbDomainName.length);
                    packet.Write(this.NbDomainName.value, 0, this.NbDomainName.length);
                }
                if (this.NbComputerName.length > 0)
                {
                    packet.WriteLittleEndian16((short)1);
                    packet.WriteLittleEndian16((short)this.NbComputerName.length);
                    packet.Write(this.NbComputerName.value, 0, this.NbComputerName.length);
                }
                if (this.DnsDomainName.length > 0)
                {
                    packet.WriteLittleEndian16((short)4);
                    packet.WriteLittleEndian16((short)this.DnsDomainName.length);
                    packet.Write(this.DnsDomainName.value, 0, this.DnsDomainName.length);
                }
                if (this.DnsComputerName.length > 0)
                {
                    packet.WriteLittleEndian16((short)3);
                    packet.WriteLittleEndian16((short)this.DnsComputerName.length);
                    packet.Write(this.DnsComputerName.value, 0, this.DnsComputerName.length);
                }
                if (this.DnsTreeName.length > 0)
                {
                    packet.WriteLittleEndian16((short)5);
                    packet.WriteLittleEndian16((short)this.DnsTreeName.length);
                    packet.Write(this.DnsTreeName.value, 0, this.DnsTreeName.length);
                }
                if (this.Timestamp.length > 0)
                {
                    packet.WriteLittleEndian16((short)7);
                    packet.WriteLittleEndian16((short)this.Timestamp.length);
                    packet.Write(this.Timestamp.value, 0, this.Timestamp.length);
                }
                if (this.Flags != 0)
                {
                    packet.WriteLittleEndian16((short)6);
                    packet.WriteLittleEndian16((short)4);
                    packet.WriteLittleEndian32(this.Flags);
                }
                if (this.Restrictions.length > 0)
                {
                    packet.WriteLittleEndian16((short)8);
                    packet.WriteLittleEndian16((short)this.Restrictions.length);
                    packet.Write(this.Restrictions.value, 0, this.Restrictions.length);
                }
                if (this.ChannelBindings.length > 0)
                {
                    packet.WriteLittleEndian16((short)10);
                    packet.WriteLittleEndian16((short)this.ChannelBindings.length);
                    packet.Write(this.ChannelBindings.value, 0, this.ChannelBindings.length);
                }
                if (this.TargetName.value != null)
                {
                    packet.WriteLittleEndian16((short)9);
                    packet.WriteLittleEndian16((short)this.TargetName.length);
                    packet.Write(this.TargetName.value, 0, this.TargetName.length);
                }
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WritePadding(8);
                byte[] buffer = new byte[packet.Length];
                packet.Position = 0L;
                packet.Read(buffer, 0, buffer.Length);
                return(buffer);
            }
示例#24
0
        private static RdpPacket getLoginInfo(string domain, string username, string password, string command, string directory, bool bAutoReconnect)
        {
            int       num    = 2 * "127.0.0.1".Length;
            int       num2   = 2 * @"C:\WINNT\System32\mstscax.dll".Length;
            int       num1   = _p;
            int       num3   = 2 * domain.Length;
            int       num4   = 2 * username.Length;
            int       num5   = 2 * password.Length;
            int       num6   = 2 * command.Length;
            int       num7   = 2 * directory.Length;
            RdpPacket packet = new RdpPacket();
            int       num8   = 0x213b;

            packet.WriteLittleEndian32(0);
            packet.WriteLittleEndian32(num8);
            packet.WriteLittleEndian16((short)num3);
            packet.WriteLittleEndian16((short)num4);
            if ((num8 & 8) != 0)
            {
                packet.WriteLittleEndian16((short)num5);
            }
            else
            {
                packet.WriteLittleEndian16((short)0);
            }
            packet.WriteLittleEndian16((short)num6);
            packet.WriteLittleEndian16((short)num7);
            if (0 < num3)
            {
                packet.WriteUnicodeString(domain);
            }
            else
            {
                packet.WriteLittleEndian16((short)0);
            }
            packet.WriteUnicodeString(username);
            if ((num8 & 8) != 0)
            {
                packet.WriteUnicodeString(password);
            }
            else
            {
                packet.WriteLittleEndian16((short)0);
            }
            if (0 < num6)
            {
                packet.WriteUnicodeString(command);
            }
            else
            {
                packet.WriteLittleEndian16((short)0);
            }
            if (0 < num7)
            {
                packet.WriteUnicodeString(directory);
            }
            else
            {
                packet.WriteLittleEndian16((short)0);
            }
            packet.WriteLittleEndian16((short)2);
            packet.WriteLittleEndian16((short)(num + 2));
            packet.WriteUnicodeString("127.0.0.1");
            packet.WriteLittleEndian16((short)(num2 + 2));
            packet.WriteUnicodeString(@"C:\WINNT\System32\mstscax.dll");
            TimeZoneInfo info = TimeZoneInfo.Local;

            packet.WriteLittleEndian32((int)info.BaseUtcOffset.TotalMinutes);
            packet.WriteUnicodeString(info.StandardName);
            packet.Position += 0x3e - (2 * info.StandardName.Length);
            if (info.SupportsDaylightSavingTime)
            {
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((ushort)10);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)30);
                packet.WriteLittleEndian16((short)2);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian32(0);
            }
            else
            {
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian32(0);
            }
            packet.WriteUnicodeString(info.DaylightName);
            packet.Position += 0x3e - (2 * info.DaylightName.Length);
            if (info.SupportsDaylightSavingTime)
            {
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((ushort)3);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0x1b);
                packet.WriteLittleEndian16((short)1);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian32((int)(info.BaseUtcOffset.TotalMinutes + 1.0));
            }
            else
            {
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian32(0);
            }
            packet.WriteLittleEndianU32(0);
            PerformanceFlags flags = (PerformanceFlags)0;

            if (!RDPClient.IsHostFlagSet(HostFlags.DesktopBackground))
            {
                flags |= PerformanceFlags.PERF_DISABLE_WALLPAPER;
            }
            if (RDPClient.IsHostFlagSet(HostFlags.FontSmoothing))
            {
                flags |= PerformanceFlags.PERF_ENABLE_FONT_SMOOTHING;
            }
            if (RDPClient.IsHostFlagSet(HostFlags.DesktopComposition))
            {
                flags |= PerformanceFlags.PERF_ENABLE_DESKTOP_COMPOSITION;
            }
            if (!RDPClient.IsHostFlagSet(HostFlags.ShowWindowContents))
            {
                flags |= PerformanceFlags.PERF_DISABLE_FULLWINDOWDRAG;
            }
            if (!RDPClient.IsHostFlagSet(HostFlags.MenuAnimation))
            {
                flags |= PerformanceFlags.PERF_DISABLE_MENUANIMATIONS;
            }
            if (!RDPClient.IsHostFlagSet(HostFlags.VisualStyles))
            {
                flags |= PerformanceFlags.PERF_DISABLE_THEMING;
            }
            packet.WriteLittleEndian32((int)flags);
            if (bAutoReconnect)
            {
                packet.WriteLittleEndian32(0x1c);
                packet.WriteLittleEndian32(0x1c);
                packet.WriteLittleEndian32(1);
                packet.WriteLittleEndian32(RDPClient.LogonID);
                HMACT64 hmact = new HMACT64(RDPClient.ReconnectCookie);
                hmact.update(Secure.GetClentRandom());
                byte[] buffer = hmact.digest();
                packet.Write(buffer, 0, buffer.Length);
                return(packet);
            }
            packet.WriteLittleEndian32(0);
            return(packet);
        }
示例#25
0
        private static void sendPersistKeyList()
        {
            int num    = 0;
            int num2   = 0;
            int num3   = 0;
            int num4   = 0;
            int num5   = 0;
            int num6   = 0;
            int num7   = 0;
            int num8   = 0;
            int num9   = 0;
            int num10  = 0;
            int offset = 0;

            while ((((num6 < num) || (num7 < num2)) || ((num8 < num3) || (num9 < num4))) || (num10 < num5))
            {
                int       num12     = 0;
                int       num13     = 0;
                int       num14     = 0;
                int       num15     = 0;
                int       num16     = 0;
                bool      bMoreKeys = false;
                RdpPacket packet    = new RdpPacket();
                packet.WriteLittleEndian16((ushort)num12);
                packet.WriteLittleEndian16((ushort)num13);
                packet.WriteLittleEndian16((ushort)num14);
                packet.WriteLittleEndian16((ushort)num15);
                packet.WriteLittleEndian16((ushort)num16);
                packet.WriteLittleEndian16((ushort)num);
                packet.WriteLittleEndian16((ushort)num2);
                packet.WriteLittleEndian16((ushort)num3);
                packet.WriteLittleEndian16((ushort)num4);
                packet.WriteLittleEndian16((ushort)num5);
                byte num17 = 0;
                if (offset == 0)
                {
                    num17 = (byte)(num17 | 1);
                }
                if (!bMoreKeys)
                {
                    num17 = (byte)(num17 | 2);
                }
                packet.WriteByte(num17);
                packet.WriteByte(0);
                packet.WriteLittleEndian16((short)0);

                IsoLayer.sendDataPDU(packet, IsoLayer.PDUType2.PDUTYPE2_BITMAPCACHE_PERSISTENT_LIST, Secure.RDPEncrypted() ? MCS.SEC_ENCRYPT : 0);
                num6  += num12;
                num7  += num13;
                num8  += num14;
                num9  += num15;
                num10 += num16;
            }
        }
示例#26
0
 private static void sendBitmapcacheCaps(RdpPacket packet)
 {
     if (RDPClient.m_bServerSupportsCacheV2)
     {
         packet.WriteLittleEndian16((short)0x13);
         packet.WriteLittleEndian16((short)40);
         packet.WriteLittleEndian16(false ? ((ushort)1) : ((ushort)0));
         packet.WriteByte(0);
         packet.WriteByte(3);
         uint num = 0;
         packet.WriteLittleEndian32(120);
         packet.WriteLittleEndian32((uint)(120 | num));
         packet.WriteLittleEndian32((uint)(0x400 | num));
         packet.WriteLittleEndian32(0);
         packet.WriteLittleEndian32(0);
         packet.Position += 12L;
     }
     else
     {
         packet.WriteLittleEndian16((short)4);
         packet.WriteLittleEndian16((short)40);
         packet.Position += 0x18L;
         packet.WriteLittleEndian16((short)120);
         packet.WriteLittleEndian16((short)0x300);
         packet.WriteLittleEndian16((short)120);
         packet.WriteLittleEndian16((short)0xc00);
         packet.WriteLittleEndian16((short)0x400);
         packet.WriteLittleEndian16((short)0x2000);
     }
 }
示例#27
0
        internal static void SendInput(List <Rdp.InputInfo> InputToSend)
        {
            if (RDPClient.use_fastpath_input)
            {
                RdpPacket packet = new RdpPacket();
                ushort    num    = 1;
                int       count  = InputToSend.Count;
                if (count < 0x10)
                {
                    packet.WriteByte((byte)(count << 2));
                }
                else
                {
                    packet.WriteByte(0);
                    num = (ushort)(num + 1);
                }
                foreach (Rdp.InputInfo info in InputToSend)
                {
                    switch (info.Message_Type)
                    {
                    case Rdp.InputType.INPUT_EVENT_SCANCODE:
                        num = (ushort)(num + 2);
                        break;

                    case Rdp.InputType.INPUT_EVENT_UNICODE:
                        num = (ushort)(num + 3);
                        break;

                    case Rdp.InputType.INPUT_EVENT_MOUSE:
                        num = (ushort)(num + 7);
                        break;

                    case Rdp.InputType.INPUT_EVENT_SYNC:
                        num = (ushort)(num + 1);
                        break;
                    }
                }
                num = (ushort)(num + 1);
                if (num > 0x7f)
                {
                    num = (ushort)(num + 1);
                }
                packet.WriteEncodedUnsigned16(num);
                if (count >= 0x10)
                {
                    packet.WriteByte((byte)count);
                }
                foreach (Rdp.InputInfo info2 in InputToSend)
                {
                    int num3 = 0;
                    switch (info2.Message_Type)
                    {
                    case Rdp.InputType.INPUT_EVENT_SCANCODE:
                        if ((info2.Device_Flags & 0x8000) != 0)
                        {
                            num3 |= 1;
                        }
                        if ((info2.Device_Flags & 0x100) != 0)
                        {
                            num3 |= 2;
                        }
                        packet.WriteByte((byte)num3);
                        packet.WriteByte((byte)info2.Param1);
                        break;

                    case Rdp.InputType.INPUT_EVENT_UNICODE:
                        if ((info2.Device_Flags & 0x8000) != 0)
                        {
                            num3 |= 1;
                        }
                        packet.WriteByte((byte)(0x80 | num3));
                        packet.WriteLittleEndian16((ushort)info2.Param1);
                        break;

                    case Rdp.InputType.INPUT_EVENT_MOUSE:
                        packet.WriteByte(0x20);
                        packet.WriteLittleEndian16((ushort)info2.Device_Flags);
                        packet.WriteLittleEndian16((ushort)info2.Param1);
                        packet.WriteLittleEndian16((ushort)info2.Param2);
                        break;

                    case Rdp.InputType.INPUT_EVENT_SYNC:
                        packet.WriteByte(0x60);
                        break;
                    }
                }
                Write(packet);
            }
            else
            {
                foreach (Rdp.InputInfo info3 in InputToSend)
                {
                    internal_sendInput(info3.Time, (int)info3.Message_Type, info3.Device_Flags, info3.Param1, info3.Param2);
                }
            }
        }
示例#28
0
 private static void sendBitmapCaps(RdpPacket data)
 {
     data.WriteLittleEndian16((short)2);
     data.WriteLittleEndian16((short)0x1c);
     data.WriteLittleEndian16((short)RDPClient.server_bpp);
     data.WriteLittleEndian16((short)1);
     data.WriteLittleEndian16((short)1);
     data.WriteLittleEndian16((short)1);
     data.WriteLittleEndian16((short)RDPClient.width);
     data.WriteLittleEndian16((short)RDPClient.height);
     data.WriteLittleEndian16((short)0);
     data.WriteLittleEndian16((short)1);
     data.WriteLittleEndian16((short)1);
     data.WriteByte(0);
     data.WriteByte(0);
     data.WriteLittleEndian16((short)1);
     data.WriteLittleEndian16((short)0);
 }
示例#29
0
        internal static RdpPacket sendMcsData(bool use_rdp5, int num_channels, int serverSelectedProtocol)
        {
            RdpPacket packet     = new RdpPacket();
            string    clientName = RDPClient.ClientName;

            if (clientName.Length > 15)
            {
                clientName = clientName.Substring(0, 15);
            }
            int num  = 2 * clientName.Length;
            int num2 = 0x9e;

            if (use_rdp5)
            {
                num2 += 0x60;
            }
            if (use_rdp5 && (num_channels > 0))
            {
                num2 += (num_channels * 12) + 8;
            }
            if ((RDPClient.serverNegotiateFlags & NegotiationFlags.EXTENDED_CLIENT_DATA_SUPPORTED) != ((NegotiationFlags)0))
            {
                num2 += 8;
            }
            packet.WriteBigEndian16((short)5);
            packet.WriteBigEndian16((short)20);
            packet.WriteByte(0x7c);
            packet.WriteBigEndian16((short)1);
            packet.WriteBigEndian16((short)(num2 | 0x8000));
            packet.WriteBigEndian16((short)8);
            packet.WriteBigEndian16((short)0x10);
            packet.WriteByte(0);
            packet.WriteLittleEndian16((ushort)0xc001);
            packet.WriteByte(0);
            packet.WriteLittleEndian32(0x61637544);
            packet.WriteBigEndian16((short)((num2 - 14) | 0x8000));
            packet.WriteLittleEndian16((ushort)0xc001);
            packet.WriteLittleEndian16(use_rdp5 ? ((short)0xd8) : ((short)0x88));
            packet.WriteLittleEndian16(use_rdp5 ? ((short)4) : ((short)1));
            packet.WriteLittleEndian16((short)8);
            packet.WriteLittleEndian16((short)RDPClient.width);
            packet.WriteLittleEndian16((short)RDPClient.height);
            packet.WriteLittleEndian16((ushort)0xca01);
            packet.WriteLittleEndian16((ushort)0xaa03);
            packet.WriteLittleEndian32(0x409);
            packet.WriteLittleEndian32(use_rdp5 ? 0xa28 : 0x1a3);
            packet.WriteUnicodeString(clientName);
            packet.Position += 30 - num;
            packet.WriteLittleEndian32(4);
            packet.WriteLittleEndian32(0);
            packet.WriteLittleEndian32(12);
            packet.Position += 0x40L;
            packet.WriteLittleEndian16((ushort)0xca01);
            packet.WriteLittleEndian16(use_rdp5 ? ((short)1) : ((short)0));
            if (use_rdp5)
            {
                packet.WriteLittleEndian32(0);
                packet.WriteLittleEndian16((short)((byte)RDPClient.server_bpp));
                packet.WriteLittleEndian16((short)7);
                packet.WriteLittleEndian16((short)1);
                packet.Position += 0x40L;
                packet.WriteByte(0);
                packet.WriteByte(0);
                packet.WriteLittleEndian32(serverSelectedProtocol);
                packet.WriteLittleEndian16((ushort)0xc004);
                packet.WriteLittleEndian16((short)12);
                int num3 = 13;

                if (((RDPClient.flags & HostFlags.ConsoleSession) != ((HostFlags)0)) || (RDPClient.sessionID != 0))
                {
                    num3 |= 2;
                }
                packet.WriteLittleEndian32(num3);
                packet.WriteLittleEndian32(RDPClient.sessionID);
            }
            packet.WriteLittleEndian16((ushort)0xc002);
            packet.WriteLittleEndian16(use_rdp5 ? ((short)12) : ((short)8));
            int num4 = 0;

            if (serverSelectedProtocol == 0)
            {
                num4 |= 3;
            }
            packet.WriteLittleEndian32(num4);
            if (use_rdp5)
            {
                packet.WriteLittleEndian32(0);
            }
            if (use_rdp5 && (num_channels > 0))
            {
                packet.WriteLittleEndian16((ushort)0xc003);
                packet.WriteLittleEndian16((short)((num_channels * 12) + 8));
                packet.WriteLittleEndian32(num_channels);
                foreach (IVirtualChannel channel in Channels.RegisteredChannels)
                {
                    packet.WriteString(channel.ChannelName, false);
                    packet.WriteByte(0);
                    packet.WriteBigEndian32((uint)0xc0a00000);
                }
            }
            if ((RDPClient.serverNegotiateFlags & NegotiationFlags.EXTENDED_CLIENT_DATA_SUPPORTED) != ((NegotiationFlags)0))
            {
                packet.WriteLittleEndian16((ushort)0xc006);
                packet.WriteLittleEndian16((short)8);
                packet.WriteLittleEndian32(0);
            }
            return(packet);
        }