示例#1
0
        public SMB2_SessionSetupResponse SendSessionSetupRequests(NetworkCredential optionalCredential = null)
        {
            SSPIHelper MyHelper = new SSPIHelper(_server);

            if (optionalCredential != null)
            {
                MyHelper.LoginClient(optionalCredential);
            }
            byte[] ServerSSPIPacket = null;
            byte[] ClientSSPIPacket;
            byte[] MIC = null;
            bool   bContinueProcessing = true;

            while (bContinueProcessing)
            {
                MyHelper.InitializeClient(out ClientSSPIPacket, ServerSSPIPacket, out bContinueProcessing);
                if (!bContinueProcessing)
                {
                    byte[] temp;
                    MyHelper.SignMessage(mechTypes, out temp);
                    MIC = new byte[temp.Length - mechTypes.Length];
                    Array.Copy(temp, mechTypes.Length, MIC, 0, temp.Length - mechTypes.Length);
                    sessionkey = MyHelper.GetSessionKey();
                }
                var packet = BuildSessionSetupPacket(ClientSSPIPacket, MIC);
                SendPacket(packet);

                Trace.WriteLine("SessionSetup Packet sent");
                var answer = ReadPacket();
                var header = ReadSMB2Header(answer);
                Trace.WriteLine("SessionSetup Packet received");
                if (header.Status == 0)
                {
                    return(ReadResponse <SMB2_SessionSetupResponse>(answer));
                }
                if (header.Status != STATUS_MORE_PROCESSING_REQUIRED)
                {
                    Trace.WriteLine("Checking " + _server + "Error " + header.Status);
                    throw new Win32Exception((int)header.Status);
                }
                if (!bContinueProcessing)
                {
                    Trace.WriteLine("Checking " + _server + "Error " + header.Status + " when no processing needed");
                    throw new Win32Exception((int)header.Status, "Unexpected SessionSetup error");
                }

                var sessionSetupResponse = ReadResponse <SMB2_SessionSetupResponse>(answer);

                _sessionid = header.SessionId;
                // extract SSP answer from GSSPAPI answer
                ServerSSPIPacket = ExtractSSP(answer, sessionSetupResponse);
            }
            throw new NotImplementedException("Not supposed to be here");
        }