static public SMB_COM_SESSION_SETUP_ANDX_RESPONSE SMB_AndxResponseFromBytes(byte[] arr) { SMB_COM_SESSION_SETUP_ANDX_RESPONSE str = new SMB_COM_SESSION_SETUP_ANDX_RESPONSE(); int size = Marshal.SizeOf(str); IntPtr ptr = Marshal.AllocHGlobal(size); Marshal.Copy(arr, 0, ptr, size); str = (SMB_COM_SESSION_SETUP_ANDX_RESPONSE)Marshal.PtrToStructure(ptr, str.GetType()); Marshal.FreeHGlobal(ptr); return(str); }
static public void DetectVersionOfWindows(byte[] res) { SMB_HEADER header = SMB_HeaderFromBytes(res); if (!IsValidSMB1Header(header)) { Console.WriteLine("Did not receive proper response when determining version... Are you sure this server is running SMB?"); return; } int sizeOfHeader = Marshal.SizeOf(header); SMB_COM_SESSION_SETUP_ANDX_RESPONSE andxr = SMB_AndxResponseFromBytes(res.Skip(sizeOfHeader).ToArray()); int byteCount = andxr.ByteCount; int sizeOfAndxr = Marshal.SizeOf(andxr); byte[] data = res.Skip(sizeOfHeader + sizeOfAndxr + 1).ToArray().Take(byteCount).ToArray(); //The 1 is for Padding- This could become a problem string hexString = BitConverter.ToString(data).Replace("-00-00-00-", "&"); //The SMB data is split using 3 0x00 bytes, these are changed to an '&' for easier split string[] hexStringSplit = hexString.Split('&'); for (int i = 0; i < 3; i++) { StringBuilder strbuilder = new StringBuilder(); string[] charArray = hexStringSplit[i].Split('-'); foreach (string chars in charArray) { int value = Convert.ToInt32(chars, 16); char charValue = (char)value; if (charValue != 0) { strbuilder.Append(charValue); } } if (i == 0) { Console.WriteLine("Native OS: " + strbuilder.ToString()); } else if (i == 1) { Console.WriteLine("Native LAN Manager: " + strbuilder.ToString()); } else if (i == 2) { Console.WriteLine("Domain: " + strbuilder.ToString()); } } }