mirror of
https://github.com/TalAloni/SMBLibrary.git
synced 2025-07-20 16:15:53 +02:00
SMB1Client: Store and expose server capabilities
This commit is contained in:
parent
b3af07e5e4
commit
e1c5cf8b54
1 changed files with 81 additions and 6 deletions
|
@ -33,6 +33,11 @@ namespace SMBLibrary.Client
|
||||||
private Socket m_clientSocket;
|
private Socket m_clientSocket;
|
||||||
private IAsyncResult m_currentAsyncResult;
|
private IAsyncResult m_currentAsyncResult;
|
||||||
private bool m_forceExtendedSecurity;
|
private bool m_forceExtendedSecurity;
|
||||||
|
private bool m_unicode;
|
||||||
|
private bool m_largeFiles;
|
||||||
|
private bool m_infoLevelPassthrough;
|
||||||
|
private bool m_largeRead;
|
||||||
|
private bool m_largeWrite;
|
||||||
|
|
||||||
private object m_incomingQueueLock = new object();
|
private object m_incomingQueueLock = new object();
|
||||||
private List<SMB1Message> m_incomingQueue = new List<SMB1Message>();
|
private List<SMB1Message> m_incomingQueue = new List<SMB1Message>();
|
||||||
|
@ -125,14 +130,30 @@ namespace SMBLibrary.Client
|
||||||
if (reply.Commands[0] is NegotiateResponse && !forceExtendedSecurity)
|
if (reply.Commands[0] is NegotiateResponse && !forceExtendedSecurity)
|
||||||
{
|
{
|
||||||
NegotiateResponse response = (NegotiateResponse)reply.Commands[0];
|
NegotiateResponse response = (NegotiateResponse)reply.Commands[0];
|
||||||
|
m_unicode = ((response.Capabilities & Capabilities.Unicode) > 0);
|
||||||
|
m_largeFiles = ((response.Capabilities & Capabilities.LargeFiles) > 0);
|
||||||
|
bool ntSMB = ((response.Capabilities & Capabilities.NTSMB) > 0);
|
||||||
|
bool rpc = ((response.Capabilities & Capabilities.RpcRemoteApi) > 0);
|
||||||
|
bool ntStatusCode = ((response.Capabilities & Capabilities.NTStatusCode) > 0);
|
||||||
|
m_infoLevelPassthrough = ((response.Capabilities & Capabilities.InfoLevelPassthrough) > 0);
|
||||||
|
m_largeRead = ((response.Capabilities & Capabilities.LargeRead) > 0);
|
||||||
|
m_largeWrite = ((response.Capabilities & Capabilities.LargeWrite) > 0);
|
||||||
m_serverChallenge = response.Challenge;
|
m_serverChallenge = response.Challenge;
|
||||||
return true;
|
return ntSMB && rpc && ntStatusCode;
|
||||||
}
|
}
|
||||||
else if (reply.Commands[0] is NegotiateResponseExtended)
|
else if (reply.Commands[0] is NegotiateResponseExtended)
|
||||||
{
|
{
|
||||||
NegotiateResponseExtended response = (NegotiateResponseExtended)reply.Commands[0];
|
NegotiateResponseExtended response = (NegotiateResponseExtended)reply.Commands[0];
|
||||||
|
m_unicode = ((response.Capabilities & Capabilities.Unicode) > 0);
|
||||||
|
m_largeFiles = ((response.Capabilities & Capabilities.LargeFiles) > 0);
|
||||||
|
bool ntSMB = ((response.Capabilities & Capabilities.NTSMB) > 0);
|
||||||
|
bool rpc = ((response.Capabilities & Capabilities.RpcRemoteApi) > 0);
|
||||||
|
bool ntStatusCode = ((response.Capabilities & Capabilities.NTStatusCode) > 0);
|
||||||
|
m_infoLevelPassthrough = ((response.Capabilities & Capabilities.InfoLevelPassthrough) > 0);
|
||||||
|
m_largeRead = ((response.Capabilities & Capabilities.LargeRead) > 0);
|
||||||
|
m_largeWrite = ((response.Capabilities & Capabilities.LargeWrite) > 0);
|
||||||
m_securityBlob = response.SecurityBlob;
|
m_securityBlob = response.SecurityBlob;
|
||||||
return true;
|
return ntSMB && rpc && ntStatusCode;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -152,12 +173,26 @@ namespace SMBLibrary.Client
|
||||||
throw new InvalidOperationException("A connection must be successfully established before attempting login");
|
throw new InvalidOperationException("A connection must be successfully established before attempting login");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Capabilities clientCapabilities = Capabilities.NTSMB | Capabilities.RpcRemoteApi | Capabilities.NTStatusCode | Capabilities.NTFind;
|
||||||
|
if (m_unicode)
|
||||||
|
{
|
||||||
|
clientCapabilities |= Capabilities.Unicode;
|
||||||
|
}
|
||||||
|
if (m_largeFiles)
|
||||||
|
{
|
||||||
|
clientCapabilities |= Capabilities.LargeFiles;
|
||||||
|
}
|
||||||
|
if (m_largeRead)
|
||||||
|
{
|
||||||
|
clientCapabilities |= Capabilities.LargeRead;
|
||||||
|
}
|
||||||
|
|
||||||
if (m_serverChallenge != null)
|
if (m_serverChallenge != null)
|
||||||
{
|
{
|
||||||
SessionSetupAndXRequest request = new SessionSetupAndXRequest();
|
SessionSetupAndXRequest request = new SessionSetupAndXRequest();
|
||||||
request.MaxBufferSize = MaxBufferSize;
|
request.MaxBufferSize = MaxBufferSize;
|
||||||
request.MaxMpxCount = MaxMpxCount;
|
request.MaxMpxCount = MaxMpxCount;
|
||||||
request.Capabilities = Capabilities.Unicode | Capabilities.NTStatusCode;
|
request.Capabilities = clientCapabilities;
|
||||||
request.AccountName = userName;
|
request.AccountName = userName;
|
||||||
request.PrimaryDomain = domainName;
|
request.PrimaryDomain = domainName;
|
||||||
byte[] clientChallenge = new byte[8];
|
byte[] clientChallenge = new byte[8];
|
||||||
|
@ -199,7 +234,7 @@ namespace SMBLibrary.Client
|
||||||
SessionSetupAndXRequestExtended request = new SessionSetupAndXRequestExtended();
|
SessionSetupAndXRequestExtended request = new SessionSetupAndXRequestExtended();
|
||||||
request.MaxBufferSize = MaxBufferSize;
|
request.MaxBufferSize = MaxBufferSize;
|
||||||
request.MaxMpxCount = MaxMpxCount;
|
request.MaxMpxCount = MaxMpxCount;
|
||||||
request.Capabilities = Capabilities.Unicode | Capabilities.NTStatusCode | Capabilities.LargeRead | Capabilities.LargeWrite;
|
request.Capabilities = clientCapabilities;
|
||||||
request.SecurityBlob = NTLMAuthenticationHelper.GetNegotiateMessage(m_securityBlob, domainName, authenticationMethod);
|
request.SecurityBlob = NTLMAuthenticationHelper.GetNegotiateMessage(m_securityBlob, domainName, authenticationMethod);
|
||||||
TrySendMessage(request);
|
TrySendMessage(request);
|
||||||
|
|
||||||
|
@ -213,7 +248,7 @@ namespace SMBLibrary.Client
|
||||||
request = new SessionSetupAndXRequestExtended();
|
request = new SessionSetupAndXRequestExtended();
|
||||||
request.MaxBufferSize = MaxBufferSize;
|
request.MaxBufferSize = MaxBufferSize;
|
||||||
request.MaxMpxCount = MaxMpxCount;
|
request.MaxMpxCount = MaxMpxCount;
|
||||||
request.Capabilities = Capabilities.Unicode | Capabilities.NTStatusCode | Capabilities.LargeRead | Capabilities.LargeWrite | Capabilities.ExtendedSecurity;
|
request.Capabilities = clientCapabilities;
|
||||||
|
|
||||||
request.SecurityBlob = NTLMAuthenticationHelper.GetAuthenticateMessage(response.SecurityBlob, domainName, userName, password, authenticationMethod, out m_sessionKey);
|
request.SecurityBlob = NTLMAuthenticationHelper.GetAuthenticateMessage(response.SecurityBlob, domainName, userName, password, authenticationMethod, out m_sessionKey);
|
||||||
TrySendMessage(request);
|
TrySendMessage(request);
|
||||||
|
@ -461,7 +496,7 @@ namespace SMBLibrary.Client
|
||||||
internal void TrySendMessage(SMB1Command request, ushort treeID)
|
internal void TrySendMessage(SMB1Command request, ushort treeID)
|
||||||
{
|
{
|
||||||
SMB1Message message = new SMB1Message();
|
SMB1Message message = new SMB1Message();
|
||||||
message.Header.UnicodeFlag = true;
|
message.Header.UnicodeFlag = m_unicode;
|
||||||
message.Header.ExtendedSecurityFlag = m_forceExtendedSecurity;
|
message.Header.ExtendedSecurityFlag = m_forceExtendedSecurity;
|
||||||
message.Header.Flags2 |= HeaderFlags2.LongNamesAllowed | HeaderFlags2.LongNameUsed | HeaderFlags2.NTStatusCode;
|
message.Header.Flags2 |= HeaderFlags2.LongNamesAllowed | HeaderFlags2.LongNameUsed | HeaderFlags2.NTStatusCode;
|
||||||
message.Header.UID = m_userID;
|
message.Header.UID = m_userID;
|
||||||
|
@ -470,6 +505,46 @@ namespace SMBLibrary.Client
|
||||||
TrySendMessage(m_clientSocket, message);
|
TrySendMessage(m_clientSocket, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool Unicode
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return m_unicode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool LargeFiles
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return m_largeFiles;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool InfoLevelPassthrough
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return m_infoLevelPassthrough;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool LargeRead
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return m_largeRead;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool LargeWrite
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return m_largeWrite;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static void TrySendMessage(Socket socket, SMB1Message message)
|
public static void TrySendMessage(Socket socket, SMB1Message message)
|
||||||
{
|
{
|
||||||
SessionMessagePacket packet = new SessionMessagePacket();
|
SessionMessagePacket packet = new SessionMessagePacket();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue