//private bool _IsDisposed = false; //public bool IsDisposed { // get { return _IsDisposed; } //} public SmbScanner(int nMaxTask) { m_dic_netbios.Add(1, "NetBIOS computer name "); m_dic_netbios.Add(2, "NetBIOS domain name "); m_dic_netbios.Add(3, "DNS computer name "); m_dic_netbios.Add(4, "DNS domain name "); m_dic_netbios.Add(6, "Flags "); m_dic_netbios.Add(7, "Timestamp "); m_se = new Semaphore(nMaxTask, nMaxTask); m_que_sae = new Queue <SocketAsyncEventArgs>(); m_que_task = new Queue <SmbScanTaskInfo>(); m_hs_task_running = new HashSet <SmbScanTaskInfo>(); for (int i = 0; i < nMaxTask; i++) { SmbScanTaskInfo ti = new SmbScanTaskInfo(); SocketAsyncEventArgs sae = new SocketAsyncEventArgs(); sae.Completed += new EventHandler <SocketAsyncEventArgs>(IO_Completed); sae.SetBuffer(new byte[1500], 0, 1500); ti.RecvSAE = sae; sae.UserToken = ti; m_que_task.Enqueue(ti); } m_byNTLMSSP = Encoding.UTF8.GetBytes("NTLMSSP\0"); m_byNext = SmbScanner.GetNextVal(m_byNTLMSSP); new Thread(this.CheckTimeout) { IsBackground = true }.Start(); }
private static int KmpIndexOf(int nIndex, byte[] byParent, byte[] bySub, int[] nextVal) { int i = nIndex, j = -1; if (nextVal == null) { nextVal = SmbScanner.GetNextVal(bySub); } while (i < byParent.Length && j < bySub.Length) { if (j == -1 || byParent[i] == bySub[j]) { i++; j++; } else { j = nextVal[j]; } } return(j >= bySub.Length ? i - bySub.Length : -1); }
private void ProcessRecv(SocketAsyncEventArgs e) { SmbScanTaskInfo ti = e.UserToken as SmbScanTaskInfo; ti.LastTime = DateTime.Now; if (e.SocketError != SocketError.Success || e.BytesTransferred < 1) { //if (ti.RunedRetry < ti.Retry) { // ti.Step = 1; // this.StartConnect(ti); //} else this.EndTask(ti, new ScanEventArgs(ti.TaskID, ti.EndPoint, ti.CanConnect, e.SocketError.ToString())); this.EndTask(ti, new ScanEventArgs(ti.TaskID, ti.EndPoint, ti.CanConnect, e.SocketError.ToString())); return; } if (!SmbScanner.CheckHeader(e.Buffer)) { this.EndTask(ti, new ScanEventArgs(ti.TaskID, ti.EndPoint, true, "The header is not smb")); return; } if (ti.Step == 1) { SocketAsyncEventArgs sae = this.PopSAE(); try { Array.Copy(m_bySmb2, sae.Buffer, m_bySmb2.Length); sae.SetBuffer(0, m_bySmb2.Length);//buffer if (!ti.Socket.SendAsync(sae)) { IOProcessPool.QueueWork(this.ProcessSend, sae); } } catch { this.PushSAE(sae); } try { ti.Step++; if (!ti.Socket.ReceiveAsync(e)) { IOProcessPool.QueueWork(this.ProcessRecv, e); } } catch (Exception ex) { this.EndTask(ti, new ScanEventArgs(ti.TaskID, ti.EndPoint, ex.Message)); return; } } else { string strResult = string.Empty; int nOffsetNtlmssp = SmbScanner.KmpIndexOf(0, e.Buffer, m_byNTLMSSP, m_byNext); if (nOffsetNtlmssp == -1) { this.EndTask(ti, new ScanEventArgs(ti.TaskID, ti.EndPoint, "SMB", -1, "", e.Buffer, e.BytesTransferred)); return; } lock (m_strBuffer) { try { m_strBuffer.Remove(0, m_strBuffer.Length); m_strBuffer.Append("Target Name :"); m_strBuffer.Append(Encoding.Unicode.GetString(e.Buffer, e.Buffer[nOffsetNtlmssp + 16] + nOffsetNtlmssp, e.Buffer[nOffsetNtlmssp + 12])); int nOffsetData = e.Buffer[nOffsetNtlmssp + 16] + nOffsetNtlmssp + e.Buffer[nOffsetNtlmssp + 12]; while (e.Buffer[nOffsetData] != 0) { if (m_dic_netbios.ContainsKey(e.Buffer[nOffsetData])) { m_strBuffer.Append("\r\n" + m_dic_netbios[e.Buffer[nOffsetData]] + ":"); } else { m_strBuffer.Append("\r\n" + e.Buffer[nOffsetData].ToString("X2") + ":"); } if (!m_dic_netbios.ContainsKey(e.Buffer[nOffsetData]) || e.Buffer[nOffsetData] == 6 || e.Buffer[nOffsetData] == 7) { for (int i = nOffsetData + 4; i < nOffsetData + 4 + e.Buffer[nOffsetData + 2]; i++) { m_strBuffer.Append(((int)e.Buffer[i]).ToString("X2")); } } else { m_strBuffer.Append(Encoding.Unicode.GetString(e.Buffer, nOffsetData + 4, e.Buffer[nOffsetData + 2])); } nOffsetData += e.Buffer[nOffsetData + 2] + 4; } m_strBuffer.Append("\r\n----------OS----------\r\n" + Encoding.Unicode.GetString(e.Buffer, nOffsetData + 4, e.BytesTransferred - nOffsetData - 4).Replace("\0", "\r\n")); strResult = m_strBuffer.ToString(); } catch { strResult = "[ERROR] - Can not format the data"; } } this.EndTask(ti, new ScanEventArgs(ti.TaskID, ti.EndPoint, "SMB", -1, strResult, e.Buffer, e.BytesTransferred)); } }