public string NativeLanMan;  // SMB_STRING (this field WILL be aligned to start on a 2-byte boundary from the start of the SMB header)

        public SessionSetupAndXRequest(byte[] buffer, int offset, bool isUnicode) : base(buffer, offset, isUnicode)
        {
            MaxBufferSize = LittleEndianConverter.ToUInt16(this.SMBParameters, 4);
            MaxMpxCount   = LittleEndianConverter.ToUInt16(this.SMBParameters, 6);
            VcNumber      = LittleEndianConverter.ToUInt16(this.SMBParameters, 8);
            SessionKey    = LittleEndianConverter.ToUInt32(this.SMBParameters, 10);
            ushort OEMPasswordLength     = LittleEndianConverter.ToUInt16(this.SMBParameters, 14);
            ushort UnicodePasswordLength = LittleEndianConverter.ToUInt16(this.SMBParameters, 16);

            Reserved     = LittleEndianConverter.ToUInt32(this.SMBParameters, 18);
            Capabilities = (ServerCapabilities)LittleEndianConverter.ToUInt32(this.SMBParameters, 22);

            OEMPassword     = ByteReader.ReadBytes(this.SMBData, 0, OEMPasswordLength);
            UnicodePassword = ByteReader.ReadBytes(this.SMBData, OEMPasswordLength, UnicodePasswordLength);

            int dataOffset = OEMPasswordLength + UnicodePasswordLength;

            if (isUnicode)
            {
                // wordCount is 1 byte
                int padding = (1 + OEMPasswordLength + UnicodePasswordLength) % 2;
                dataOffset += padding;
            }
            AccountName   = SMBHelper.ReadSMBString(this.SMBData, ref dataOffset, isUnicode);
            PrimaryDomain = SMBHelper.ReadSMBString(this.SMBData, ref dataOffset, isUnicode);
            NativeOS      = SMBHelper.ReadSMBString(this.SMBData, ref dataOffset, isUnicode);
            NativeLanMan  = SMBHelper.ReadSMBString(this.SMBData, ref dataOffset, isUnicode);
        }
        public NTTransactCreateRequest(byte[] parameters, byte[] data, bool isUnicode)
        {
            int parametersOffset = 0;

            Flags             = (NTCreateFlags)LittleEndianReader.ReadUInt32(parameters, ref parametersOffset);
            RootDirectoryFID  = LittleEndianReader.ReadUInt32(parameters, ref parametersOffset);
            DesiredAccess     = (DesiredAccess)LittleEndianReader.ReadUInt32(parameters, ref parametersOffset);
            AllocationSize    = LittleEndianReader.ReadUInt64(parameters, ref parametersOffset);
            ExtFileAttributes = (ExtendedFileAttributes)LittleEndianReader.ReadUInt32(parameters, ref parametersOffset);
            ShareAccess       = (ShareAccess)LittleEndianReader.ReadUInt32(parameters, ref parametersOffset);
            CreateDisposition = (CreateDisposition)LittleEndianReader.ReadUInt32(parameters, ref parametersOffset);
            CreateOptions     = (CreateOptions)LittleEndianReader.ReadUInt32(parameters, ref parametersOffset);
            uint securityDescriptiorLength = LittleEndianReader.ReadUInt32(parameters, ref parametersOffset);
            uint eaLength   = LittleEndianReader.ReadUInt32(parameters, ref parametersOffset);
            uint nameLength = LittleEndianReader.ReadUInt32(parameters, ref parametersOffset);

            ImpersonationLevel = (ImpersonationLevel)LittleEndianReader.ReadUInt32(parameters, ref parametersOffset);
            SecurityFlags      = (SecurityFlags)ByteReader.ReadByte(parameters, ref parametersOffset);

            if (isUnicode)
            {
                parametersOffset++;
            }
            Name = SMBHelper.ReadFixedLengthString(parameters, ref parametersOffset, isUnicode, (int)nameLength);
            if (securityDescriptiorLength > 0)
            {
                SecurityDescriptor = new SecurityDescriptor(data, 0);
            }
            ExtendedAttributes = new FileFullEAInformationList(data, (int)securityDescriptiorLength);
        }
예제 #3
0
 public static void WriteSetSMBDateTime(byte[] buffer, int offset, DateTime?datetime)
 {
     if (datetime.HasValue)
     {
         SMBHelper.WriteSMBDateTime(buffer, offset, datetime.Value);
     }
 }
예제 #4
0
 public QueryInformationResponse(byte[] buffer, int offset) : base(buffer, offset, false)
 {
     FileAttributes = (FileAttributes)LittleEndianConverter.ToUInt16(this.SMBParameters, 0);
     LastWriteTime  = SMBHelper.ReadSMBDateTime(this.SMBParameters, 2);
     FileSize       = LittleEndianConverter.ToUInt32(this.SMBParameters, 6);
     Reserved       = ByteReader.ReadBytes(this.SMBParameters, 10, 10);
 }
예제 #5
0
 public SetInfoStandard(byte[] buffer, int offset)
 {
     CreationDateTime   = SMBHelper.ReadSMBDateTime(buffer, offset + 0);
     LastAccessDateTime = SMBHelper.ReadSMBDateTime(buffer, offset + 4);
     LastWriteDateTime  = SMBHelper.ReadSMBDateTime(buffer, offset + 8);
     Reserved           = ByteReader.ReadBytes(buffer, offset + 12, 10);
 }
예제 #6
0
 public override byte[] GetBytes(bool isUnicode)
 {
     this.SMBParameters = new byte[ParametersLength];
     LittleEndianWriter.WriteUInt16(this.SMBParameters, 0, FID);
     SMBHelper.WriteUTime(this.SMBParameters, 2, LastTimeModified);
     return(base.GetBytes(isUnicode));
 }
예제 #7
0
        public override byte[] GetBytes(bool isUnicode)
        {
            ushort securityBlobLength = (ushort)SecurityBlob.Length;

            this.SMBParameters = new byte[ParametersLength];
            LittleEndianWriter.WriteUInt16(this.SMBParameters, 4, (ushort)Action);
            LittleEndianWriter.WriteUInt16(this.SMBParameters, 6, securityBlobLength);

            int padding = 0;

            if (isUnicode)
            {
                // wordCount is 1 byte
                padding      = (1 + securityBlobLength) % 2;
                this.SMBData = new byte[SecurityBlob.Length + padding + NativeOS.Length * 2 + NativeLanMan.Length * 2 + 4];
            }
            else
            {
                this.SMBData = new byte[SecurityBlob.Length + NativeOS.Length + NativeLanMan.Length + 2];
            }
            int offset = 0;

            ByteWriter.WriteBytes(this.SMBData, ref offset, SecurityBlob);
            offset += padding;
            SMBHelper.WriteSMBString(this.SMBData, ref offset, isUnicode, NativeOS);
            SMBHelper.WriteSMBString(this.SMBData, ref offset, isUnicode, NativeLanMan);

            return(base.GetBytes(isUnicode));
        }
예제 #8
0
        public override byte[] GetBytes(bool isUnicode)
        {
            this.SMBParameters = new byte[ParametersLength];
            LittleEndianWriter.WriteUInt16(this.SMBParameters, 0, (ushort)SearchAttributes);

            if (isUnicode)
            {
                int padding = 1;
                this.SMBData = new byte[2 + OldFileName.Length * 2 + NewFileName.Length * 2 + 4 + padding];
            }
            else
            {
                this.SMBData = new byte[2 + OldFileName.Length + NewFileName.Length + 2];
            }
            int dataOffset = 0;

            ByteWriter.WriteByte(this.SMBData, ref dataOffset, BufferFormat1);
            SMBHelper.WriteSMBString(this.SMBData, ref dataOffset, isUnicode, OldFileName);
            ByteWriter.WriteByte(this.SMBData, ref dataOffset, BufferFormat2);
            if (isUnicode)
            {
                dataOffset++; // padding
            }
            SMBHelper.WriteSMBString(this.SMBData, ref dataOffset, isUnicode, NewFileName);

            return(base.GetBytes(isUnicode));
        }
예제 #9
0
        public QueryFSInfoVolume(bool isUnicode, byte[] buffer, int offset)
        {
            VolumeSerialNumber = LittleEndianConverter.ToUInt32(buffer, offset + 0);
            byte charCount = ByteReader.ReadByte(buffer, offset + 4);

            VolumeLabel = SMBHelper.ReadSMBString(buffer, offset + 5, isUnicode);
        }
예제 #10
0
        public override byte[] GetBytes(bool isUnicode)
        {
            this.SMBParameters = new byte[ParametersLength];
            int parametersOffset = 4;

            LittleEndianWriter.WriteUInt16(this.SMBParameters, ref parametersOffset, (ushort)OptionalSupport);
            MaximalShareAccessRights.WriteBytes(this.SMBParameters, ref parametersOffset);
            GuestMaximalShareAccessRights.WriteBytes(this.SMBParameters, ref parametersOffset);

            // Should be written as OEM string but it doesn't really matter
            string serviceString = TreeConnectHelper.GetServiceString(Service);

            if (isUnicode)
            {
                this.SMBData = new byte[serviceString.Length + NativeFileSystem.Length * 2 + 3];
            }
            else
            {
                this.SMBData = new byte[serviceString.Length + NativeFileSystem.Length + 2];
            }

            int offset = 0;

            ByteWriter.WriteNullTerminatedAnsiString(this.SMBData, ref offset, serviceString);
            SMBHelper.WriteSMBString(this.SMBData, ref offset, isUnicode, NativeFileSystem);

            return(base.GetBytes(isUnicode));
        }
예제 #11
0
        public FindFileNamesInfo(byte[] buffer, ref int offset, bool isUnicode) : base(false)
        {
            NextEntryOffset = LittleEndianReader.ReadUInt32(buffer, ref offset);
            FileIndex       = LittleEndianReader.ReadUInt32(buffer, ref offset);
            uint fileNameLength = LittleEndianReader.ReadUInt32(buffer, ref offset);

            FileName = SMBHelper.ReadFixedLengthString(buffer, ref offset, isUnicode, (int)fileNameLength);
        }
예제 #12
0
        public override void WriteBytes(byte[] buffer, ref int offset, bool isUnicode)
        {
            uint fileNameLength = (uint)(isUnicode ? FileName.Length * 2 : FileName.Length);

            LittleEndianWriter.WriteUInt32(buffer, ref offset, NextEntryOffset);
            LittleEndianWriter.WriteUInt32(buffer, ref offset, FileIndex);
            LittleEndianWriter.WriteUInt32(buffer, ref offset, fileNameLength);
            SMBHelper.WriteSMBString(buffer, ref offset, isUnicode, FileName);
        }
예제 #13
0
 public QueryFileBasicInfo(byte[] buffer, int offset)
 {
     CreationDateTime   = SMBHelper.ReadFileTime(buffer, ref offset);
     LastAccessDateTime = SMBHelper.ReadFileTime(buffer, ref offset);
     LastWriteDateTime  = SMBHelper.ReadFileTime(buffer, ref offset);
     LastChangeTime     = SMBHelper.ReadFileTime(buffer, ref offset);
     ExtFileAttributes  = (ExtendedFileAttributes)LittleEndianReader.ReadUInt32(buffer, ref offset);
     Reserved           = LittleEndianReader.ReadUInt32(buffer, ref offset);
 }
예제 #14
0
 public Transaction2FindNext2Request(byte[] parameters, byte[] data, bool isUnicode) : base()
 {
     SID              = LittleEndianConverter.ToUInt16(parameters, 0);
     SearchCount      = LittleEndianConverter.ToUInt16(parameters, 2);
     InformationLevel = (FindInformationLevel)LittleEndianConverter.ToUInt16(parameters, 4);
     ResumeKey        = LittleEndianConverter.ToUInt32(parameters, 6);
     Flags            = (FindFlags)LittleEndianConverter.ToUInt16(parameters, 10);
     FileName         = SMBHelper.ReadSMBString(parameters, 12, isUnicode);
 }
예제 #15
0
        public QueryFSVolumeInfo(byte[] buffer, int offset)
        {
            VolumeCreationTime = SMBHelper.ReadFileTime(buffer, offset + 0);
            SerialNumber       = LittleEndianConverter.ToUInt32(buffer, offset + 8);
            uint volumeLabelSize = LittleEndianConverter.ToUInt32(buffer, offset + 12);

            Reserved    = LittleEndianConverter.ToUInt16(buffer, offset + 16);
            VolumeLabel = ByteReader.ReadUnicodeString(buffer, offset + 18, (int)volumeLabelSize);
        }
예제 #16
0
 public QueryInfoStandard(byte[] buffer, int offset)
 {
     CreationDateTime   = SMBHelper.ReadSMBDateTime(buffer, ref offset);
     LastAccessDateTime = SMBHelper.ReadSMBDateTime(buffer, ref offset);
     LastWriteDateTime  = SMBHelper.ReadSMBDateTime(buffer, ref offset);
     FileDataSize       = LittleEndianReader.ReadUInt32(buffer, ref offset);
     AllocationSize     = LittleEndianReader.ReadUInt32(buffer, ref offset);
     Attributes         = (FileAttributes)LittleEndianReader.ReadUInt16(buffer, ref offset);
 }
예제 #17
0
 public override byte[] GetBytes()
 {
     byte[] buffer = new byte[Length];
     SMBHelper.WriteSMBDateTime(buffer, 0, CreationDateTime);
     SMBHelper.WriteSMBDateTime(buffer, 4, LastAccessDateTime);
     SMBHelper.WriteSMBDateTime(buffer, 8, LastWriteDateTime);
     ByteWriter.WriteBytes(buffer, 12, Reserved);
     return(buffer);
 }
 public CreateDirectoryRequest(byte[] buffer, int offset, bool isUnicode) : base(buffer, offset, isUnicode)
 {
     BufferFormat = ByteReader.ReadByte(this.SMBData, 0);
     if (BufferFormat != SupportedBufferFormat)
     {
         throw new InvalidRequestException("Unsupported Buffer Format");
     }
     DirectoryName = SMBHelper.ReadSMBString(this.SMBData, 1, isUnicode);
 }
예제 #19
0
 public SetFileBasicInfo(byte[] buffer, int offset)
 {
     CreationTime      = SMBHelper.ReadSetFileTime(buffer, offset + 0);
     LastAccessTime    = SMBHelper.ReadSetFileTime(buffer, offset + 8);
     LastWriteTime     = SMBHelper.ReadSetFileTime(buffer, offset + 16);
     LastChangeTime    = SMBHelper.ReadSetFileTime(buffer, offset + 24);
     ExtFileAttributes = (ExtendedFileAttributes)LittleEndianConverter.ToUInt32(buffer, offset + 32);
     Reserved          = LittleEndianConverter.ToUInt32(buffer, offset + 36);
 }
예제 #20
0
        public override byte[] GetBytes(bool isUnicode)
        {
            this.SMBParameters = new byte[ParameterLength];
            LittleEndianWriter.WriteUInt16(this.SMBParameters, 0, (ushort)FileAttributes);
            SMBHelper.WriteSMBDateTime(this.SMBParameters, 2, LastWriteTime);
            LittleEndianWriter.WriteUInt32(this.SMBParameters, 6, FileSize);
            ByteWriter.WriteBytes(this.SMBParameters, 10, Reserved, 10);

            return(base.GetBytes(isUnicode));
        }
 public TransactionQueryNamedPipeInfoResponse(byte[] parameters, bool isUnicode) : base()
 {
     OutputBufferSize = LittleEndianConverter.ToUInt16(parameters, 0);
     InputBufferSize  = LittleEndianConverter.ToUInt16(parameters, 2);
     MaximumInstances = ByteReader.ReadByte(parameters, 4);
     CurrentInstances = ByteReader.ReadByte(parameters, 5);
     PipeNameLength   = ByteReader.ReadByte(parameters, 6);
     // Note: Trans_Parameters is aligned to 4 byte boundary
     PipeName = SMBHelper.ReadSMBString(parameters, 8, isUnicode);
 }
예제 #22
0
        public static DateTime?ReadSetSMBDateTime(byte[] buffer, int offset)
        {
            uint value = LittleEndianConverter.ToUInt32(buffer, offset);

            if (value > 0)
            {
                return(SMBHelper.ReadSMBDateTime(buffer, offset));
            }
            return(null);
        }
        public override byte[] GetParameters(bool isUnicode)
        {
            int length = 4;

            length += isUnicode ? DirectoryName.Length * 2 + 2 : DirectoryName.Length + 1 + 1;
            byte[] parameters = new byte[length];
            LittleEndianWriter.WriteUInt32(parameters, 0, Reserved);
            SMBHelper.WriteSMBString(parameters, 4, isUnicode, DirectoryName);
            return(parameters);
        }
예제 #24
0
        public Transaction2QueryPathInformationRequest(byte[] parameters, byte[] data, bool isUnicode) : base()
        {
            InformationLevel = (QueryInformationLevel)LittleEndianConverter.ToUInt16(parameters, 0);
            Reserved         = LittleEndianConverter.ToUInt32(parameters, 4);
            FileName         = SMBHelper.ReadSMBString(parameters, 6, isUnicode);

            if (InformationLevel == QueryInformationLevel.SMB_INFO_QUERY_EAS_FROM_LIST)
            {
                GetExtendedAttributeList = new FullExtendedAttributeList(data, 0);
            }
        }
        public TreeConnectAndXResponse(byte[] buffer, int offset, bool isUnicode) : base(buffer, offset, isUnicode)
        {
            OptionalSupport = (OptionalSupportFlags)LittleEndianConverter.ToUInt16(this.SMBParameters, 4);

            int    dataOffset    = 0;
            string serviceString = ByteReader.ReadNullTerminatedAnsiString(this.SMBData, ref dataOffset);

            NativeFileSystem = SMBHelper.ReadSMBString(this.SMBData, ref dataOffset, isUnicode);

            Service = TreeConnectHelper.GetServiceName(serviceString);
        }
예제 #26
0
 public override byte[] GetBytes()
 {
     byte[] buffer = new byte[Length];
     SMBHelper.WriteFileTime(buffer, 0, CreationTime);
     SMBHelper.WriteFileTime(buffer, 8, LastAccessTime);
     SMBHelper.WriteFileTime(buffer, 16, LastWriteTime);
     SMBHelper.WriteFileTime(buffer, 24, LastChangeTime);
     LittleEndianWriter.WriteUInt32(buffer, 32, (uint)ExtFileAttributes);
     LittleEndianWriter.WriteUInt32(buffer, 36, Reserved);
     return(buffer);
 }
예제 #27
0
        public DeleteRequest(byte[] buffer, int offset, bool isUnicode) : base(buffer, offset, isUnicode)
        {
            SearchAttributes = (FileAttributes)LittleEndianConverter.ToUInt16(this.SMBParameters, 0);

            BufferFormat = ByteReader.ReadByte(this.SMBData, 0);
            if (BufferFormat != SupportedBufferFormat)
            {
                throw new InvalidRequestException("Unsupported Buffer Format");
            }
            FileName = SMBHelper.ReadSMBString(this.SMBData, 1, isUnicode);
        }
예제 #28
0
        public override byte[] GetBytes(bool isUnicode)
        {
            byte charCount = (byte)VolumeLabel.Length;

            int length = GetLength(isUnicode);

            byte[] buffer = new byte[length];
            LittleEndianWriter.WriteUInt32(buffer, 0, VolumeSerialNumber);
            ByteWriter.WriteByte(buffer, 4, charCount);
            SMBHelper.WriteSMBString(buffer, 5, isUnicode, VolumeLabel);
            return(buffer);
        }
예제 #29
0
        public override byte[] GetBytes(bool isUnicode)
        {
            uint volumeLabelSize = (uint)(VolumeLabel.Length * 2);

            byte[] buffer = new byte[FixedLength + volumeLabelSize];
            SMBHelper.WriteFileTime(buffer, 0, VolumeCreationTime);
            LittleEndianWriter.WriteUInt32(buffer, 8, SerialNumber);
            LittleEndianWriter.WriteUInt32(buffer, 12, volumeLabelSize);
            LittleEndianWriter.WriteUInt16(buffer, 16, Reserved);
            ByteWriter.WriteUnicodeString(buffer, 18, VolumeLabel);
            return(buffer);
        }
예제 #30
0
        public override byte[] GetBytes()
        {
            byte[] buffer = new byte[Length];
            int    offset = 0;

            SMBHelper.WriteSMBDateTime(buffer, ref offset, CreationDateTime);
            SMBHelper.WriteSMBDateTime(buffer, ref offset, LastAccessDateTime);
            SMBHelper.WriteSMBDateTime(buffer, ref offset, LastWriteDateTime);
            LittleEndianWriter.WriteUInt32(buffer, ref offset, FileDataSize);
            LittleEndianWriter.WriteUInt32(buffer, ref offset, AllocationSize);
            LittleEndianWriter.WriteUInt16(buffer, ref offset, (ushort)Attributes);
            return(buffer);
        }