//////////////////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////////// internal virtual Boolean ReadRequest() { treeId = recieve.Skip(40).Take(4).ToArray(); //////////////////////////////////////////////////////////////////////////////// SMB2Header header = new SMB2Header(); header.SetCommand(new Byte[] { 0x05, 0x00 }); header.SetCreditsRequested(new Byte[] { 0x01, 0x00 }); header.SetMessageID(++messageId); header.SetProcessID(processId); header.SetTreeId(treeId); header.SetSessionID(sessionId); SMB2ReadRequest readRequest = new SMB2ReadRequest(); readRequest.SetGuidHandleFile(guidFileHandle); Byte[] bData = readRequest.GetRequest(); header.SetChainOffset(bData.Length); if (signing) { header.SetFlags(new Byte[] { 0x0c, 0x00, 0x00, 0x00 }); header.SetSignature(sessionKey, ref bData); } else { header.SetFlags(new Byte[] { 0x00, 0x00, 0x00, 0x00 }); } Byte[] bHeader = header.GetHeader(); //////////////////////////////////////////////////////////////////////////////// SMB2Header header2 = new SMB2Header(); header2.SetCommand(new Byte[] { 0x0e, 0x00 }); header2.SetCreditsRequested(new Byte[] { 0x01, 0x00 }); header2.SetMessageID(++messageId); header2.SetProcessID(processId); header2.SetTreeId(treeId); header2.SetSessionID(sessionId); header2.SetChainOffset(new Byte[] { 0x68, 0x00, 0x00, 0x00 }); SMB2FindFileRequestFile requestFile = new SMB2FindFileRequestFile(); requestFile.SetPadding(new Byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }); Byte[] bData2 = requestFile.GetRequest(); if (signing) { header2.SetFlags(new Byte[] { 0x0c, 0x00, 0x00, 0x00 }); header2.SetSignature(sessionKey, ref bData2); } else { header2.SetFlags(new Byte[] { 0x04, 0x00, 0x00, 0x00 }); } Byte[] bHeader2 = header2.GetHeader(); //////////////////////////////////////////////////////////////////////////////// SMB2Header header3 = new SMB2Header(); header3.SetCommand(new Byte[] { 0x0e, 0x00 }); header3.SetCreditsRequested(new Byte[] { 0x01, 0x00 }); header3.SetMessageID(++messageId); header3.SetProcessID(processId); header3.SetTreeId(treeId); header3.SetSessionID(sessionId); SMB2FindFileRequestFile requestFile2 = new SMB2FindFileRequestFile(); requestFile2.SetOutputBufferLength(new Byte[] { 0x80, 0x00, 0x00, 0x00 }); Byte[] bData3 = requestFile2.GetRequest(); if (signing) { header3.SetFlags(new Byte[] { 0x0c, 0x00, 0x00, 0x00 }); header3.SetSignature(sessionKey, ref bData3); } else { header3.SetFlags(new Byte[] { 0x04, 0x00, 0x00, 0x00 }); } Byte[] bHeader3 = header3.GetHeader(); //////////////////////////////////////////////////////////////////////////////// NetBIOSSessionService sessionService = new NetBIOSSessionService(); sessionService.SetHeaderLength(bHeader.Length + bHeader2.Length + bHeader3.Length); sessionService.SetDataLength(bData.Length + bData2.Length + bData3.Length); Byte[] bSessionService = sessionService.GetNetBIOSSessionService(); Byte[] bSend = Combine.combine(Combine.combine(bSessionService, bHeader), bData); bSend = Combine.combine(bSend, Combine.combine(bHeader2, bData2)); bSend = Combine.combine(bSend, Combine.combine(bHeader3, bData3)); streamSocket.Write(bSend, 0, bSend.Length); streamSocket.Flush(); streamSocket.Read(recieve, 0, recieve.Length); if (GetStatus(recieve.Skip(12).Take(4).ToArray())) return true; else return false; }
//////////////////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////////// internal Boolean FindRequest() { treeId = recieve.Skip(40).Take(4).ToArray(); //////////////////////////////////////////////////////////////////////////////// SMB2Header header = new SMB2Header(); header.SetCommand(new Byte[] { 0x0e, 0x00 }); header.SetCreditsRequested(new Byte[] { 0x01, 0x00 }); header.SetMessageID(++messageId); header.SetProcessID(processId); header.SetTreeId(treeId); header.SetSessionID(sessionId); header.SetChainOffset(new Byte[] { 0x68, 0x00, 0x00, 0x00 }); SMB2FindFileRequestFile findFileRequestFile = new SMB2FindFileRequestFile(); findFileRequestFile.SetInfoLevel(new Byte[] { 0x25 }); findFileRequestFile.SetFileID(guidFileHandle); findFileRequestFile.SetPadding(new Byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }); Byte[] bData = findFileRequestFile.GetRequest(); if (signing) { header.SetFlags(new Byte[] { 0x0c, 0x00, 0x00, 0x00 }); header.SetSignature(sessionKey, ref bData); } Byte[] bHeader = header.GetHeader(); //////////////////////////////////////////////////////////////////////////////// SMB2Header header2 = new SMB2Header(); header2.SetCommand(new Byte[] { 0x0e, 0x00 }); header2.SetCreditsRequested(new Byte[] { 0x01, 0x00 }); header2.SetMessageID(++messageId); header2.SetProcessID(processId); header2.SetTreeId(treeId); header2.SetSessionID(sessionId); header.SetFlags(new Byte[] { 0x04, 0x00, 0x00, 0x00 }); SMB2FindFileRequestFile findFileRequestFile2 = new SMB2FindFileRequestFile(); findFileRequestFile2.SetInfoLevel(new Byte[] { 0x25 }); findFileRequestFile2.SetFileID(guidFileHandle); findFileRequestFile2.SetPadding(new Byte[] { 0x80, 0x00, 0x00, 0x00 }); Byte[] bData2 = findFileRequestFile2.GetRequest(); if (signing) { header2.SetFlags(new Byte[] { 0x0c, 0x00, 0x00, 0x00 }); header2.SetSignature(sessionKey, ref bData); } Byte[] bHeader2 = header2.GetHeader(); //////////////////////////////////////////////////////////////////////////////// NetBIOSSessionService sessionService = new NetBIOSSessionService(); sessionService.SetHeaderLength(bHeader.Length + bHeader2.Length); sessionService.SetDataLength(bData.Length + bData2.Length); Byte[] bSessionService = sessionService.GetNetBIOSSessionService(); Combine combine = new Combine(); combine.Extend(bHeader); combine.Extend(bData); combine.Extend(bHeader2); combine.Extend(bData2); Byte[] bSend = Combine.combine(bSessionService, combine.Retrieve()); streamSocket.Write(bSend, 0, bSend.Length); streamSocket.Flush(); streamSocket.Read(recieve, 0, recieve.Length); return(GetStatus(recieve.Skip(12).Take(4).ToArray())); }