如何在C#中通过CIFS中的套接字发送第一个初始请求?
嗨 如何在C#中通过CIFS中的套接字发送第一个初始请求? 我想发送第一个初始请求,并从C#中的目标地址获得响应。 我想以CIFS格式发送CIFS请求 非常感谢您提供的任何代码片段如何在C#中通过CIFS中的套接字发送第一个初始请求?,c#,C#,嗨 如何在C#中通过CIFS中的套接字发送第一个初始请求? 我想发送第一个初始请求,并从C#中的目标地址获得响应。 我想以CIFS格式发送CIFS请求 非常感谢您提供的任何代码片段 提前谢谢。@傻瓜:是的,我试过这样: 内部枚举命令类型:字节 { SMB\u COM\u创建\u目录=0x00, SMB\u COM\u DELETE\u目录=0x01, SMB_COM_OPEN=0x02, SMB_COM_CREATE=0x03, SMB_COM_CLOSE=0x04, SMB_COM_FLUSH
提前谢谢。@傻瓜:是的,我试过这样: 内部枚举命令类型:字节 { SMB\u COM\u创建\u目录=0x00, SMB\u COM\u DELETE\u目录=0x01, SMB_COM_OPEN=0x02, SMB_COM_CREATE=0x03, SMB_COM_CLOSE=0x04, SMB_COM_FLUSH=0x05, SMB_COM_DELETE=0x06, SMB_COM_RENAME=0x07, SMB\u COM\u查询\u信息=0x08, SMB\u COM\u集合\u信息=0x09, SMB_COM_READ=0x0A, SMB_COM_WRITE=0x0B, SMB\u COM\u锁定\u字节\u范围=0x0C, SMB\u COM\u解锁\u字节\u范围=0x0D, SMB\u COM\u CREATE\u TEMPORARY=0x0E, SMB\u COM\u CREATE\u NEW=0x0F, SMB\u COM\u CHECK\u目录=0x10, SMB\u COM\u进程\u退出=0x11, SMB_COM_SEEK=0x12, SMB_COM_LOCK_和_READ=0x13, SMB_COM_写入_和_解锁=0x14, SMB\u COM\u READ\u RAW=0x1A, SMB\u COM\u读取\u MPXv0x1B, SMB\U COM\U READ\U MPX\U次要=0x1C, SMB\u COM\u WRITE\u RAW=0x1D, SMB\u COM\u写入\u MPX=0x1E, SMB\u COM\u写入\u MPX\u辅助=0x1F, SMB_COM_WRITE_COMPLETE=0x20, SMB\u COM\u查询\u服务器=0x21, SMB\u COM\u集合\u信息2=0x22, SMB\u COM\u查询\u信息2=0x23, SMB\u COM\u锁定\u和x=0x24, SMB\u COM\u事务=0x25, SMB\u COM\u事务\u次要=0x26, SMB\u COM\u IOCTL=0x27, SMB_COM_IOCTL_SECONDARY=0x28, SMB_COM_COPY=0x29, SMB_COM_MOVE=0x2A, SMB_COM_ECHO=0x2B, SMB_COM_WRITE_和_CLOSE=0x2C, SMB\u COM\u OPEN\u和X=0x2D, SMB_COM_READ_和x=0x2E, SMB\u COM\u WRITE\u和x=0x2F, SMB\u COM\u新建\u文件大小=0x30, SMB_COM_CLOSE_和_TREE_DISC=0x31, SMB_COM_事务2=0x32, SMB_COM_事务2_次要=0x33, SMB_COM_FIND_CLOSE2=0x34, SMB\u COM\u FIND\u NOTIFY\u CLOSE=0x35, /*由Xenix/Unix 0x60使用� 0x6E*/ SMB\u COM\u树\u连接=0x70, SMB\u COM\u树\u断开连接=0x71, SMB\u COM\u协商=0x72, SMB\u COM\u会话\u设置\u和x=0x73, SMB\u COM\u注销\u和x=0x74, SMB\u COM\u树\u连接\u和X=0x75, SMB\u COM\u查询\u信息\u磁盘=0x80, SMB_COM_SEARCH=0x81, SMB_COM_FIND=0x82, SMB_COM_FIND_UNIQUE=0x83, SMB\u COM\u FIND\u CLOSE=0x84, SMB\u COM\u NT\u TRANSACT=0xA0, SMB\u COM\u NT\u TRANSACT\u SECONDARY=0xA1, SMB\u COM\u NT\u CREATE\u和X=0xA2, SMB\u COM\u NT\u CANCEL=0xA4, SMB_COM_NT_RENAME=0xA5, SMB\u COM\u OPEN\u PRINT\u FILE=0xC0, SMB\u COM\u写入\u打印\u文件=0xC1, SMB\u COM\u CLOSE\u PRINT\u FILE=0xC2, SMB\u COM\u GET\u PRINT\u QUEUE=0xC3, SMB\u COM\u读取\u批量=0xD8, SMB\u COM\u写入\u批量=0xD9, SMB\u COM\u写入\u批量\u数据=0xDA }
public struct CIFSPacket
{
public uint protocolIdentifier;//the value must be "0xFF+'SMB'"
public byte command;
public byte errorClass;
public byte reserved;
public ushort error;
public byte flags;
//here there are 14 bytes of data which is used differently among different dialects.
//I do want the flags2 however so I'll try parsing them
public ushort flags2;
public ushort treeId;
public ushort processId;
public ushort userId;
public ushort multiplexId;
//trans request
public byte wordCount;//Count of parameter words defining the data portion of the packet.
//from here it might be undefined...
public int parametersStartIndex;
public ushort byteCount;//buffer length
public int bufferStartIndex;
// [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
public string Buffer;
}
static void Main(string[] args)
{
sock = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
// create server IPEndPoint instance. We assume
//GetHostEntry returns at least one address
IPAddress server = IPAddress.Parse("172.24.18.240");
int servPort = 139;
IPEndPoint serverEndPoint = new IPEndPoint(Dns.GetHostEntry(server).AddressList[0], servPort);
// CONNECT THE SOCKET TO THE SERVER ON SPECIFIED PORT
sock.Connect(serverEndPoint);
/// SocketOptionLevel Tcp = new SocketOptionLevel();
sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
CIFSPacket packet = new CIFSPacket();
packet.protocolIdentifier = 0xff;
packet.command = (byte)CommandTypes.SMB_COM_NEGOTIATE;
packet.errorClass = 0xff;
packet.error = 0;
packet.flags = 0x00;
packet.flags2 = 0x0001;
packet.multiplexId = 22;
packet.wordCount = 100;
packet.Buffer = "NT LM 0.12";
packet.byteCount = (ushort)packet.Buffer.Length;
//System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
// Byte[] bytes = encoding.GetBytes(packet.ToString());
int len = Marshal.SizeOf(packet);
byte[] arr = new byte[len];
IntPtr ptr = Marshal.AllocHGlobal(len);
Marshal.StructureToPtr(packet, ptr, true);
Marshal.Copy(ptr, arr, 0, len);
Marshal.FreeHGlobal(ptr);
//Byte[] bite = null;
//bite = BitConverter.GetBytes(Convert.ToDouble(packet));
sock.Send(arr);
Thread thread = new Thread(new ThreadStart(WorkThreadFunction));
thread.Start();
// Console.WriteLine ("Connected to server... SENDING ECHO STRING");
//Console.ReadLine();
}
public static void WorkThreadFunction()
{
byte[] buffer = new byte[1024];
try
{
int iRx = sock.Receive(buffer);
}
catch (Exception ex)
{
}
}
但插座不响应???
我认为CIFS数据包的形成是错误的。
有什么建议或代码片段吗?如果你说出你已经尝试过的内容/你已经走了多远,这会有所帮助。