Example #1
0
        public static uint GetSynPacket(byte[] byBuffer, uint uSIP, uint uDIP, ushort usSPort, ushort usDPort)
        {
            uint uSeq = 0;

            lock (m_rnd) uSeq = (uint)m_rnd.Next();
            return(RAWDefine.GetSynPacket(byBuffer, uSIP, uDIP, usSPort, usDPort, uSeq));
        }
Example #2
0
        public static uint GetSynPacket(byte[] byBuffer, string strSIP, string strDIP, ushort usSPort, ushort usDPort)
        {
            uint uSeq = 0;

            lock (m_rnd) uSeq = (uint)m_rnd.Next();
            return(RAWDefine.GetSynPacket(byBuffer, RAWDefine.IPToINT(strSIP), RAWDefine.IPToINT(strDIP), usSPort, usDPort, uSeq));
        }
Example #3
0
        //private void SendData(SYNScanTaskInfo ti) {
        //    SocketAsyncEventArgs sae = this.PopSAE();
        //    Array.Copy(ti.SYNPacket, sae.Buffer, ti.SYNPacket.Length);
        //    ti.LastTime = DateTime.Now;
        //    sae.RemoteEndPoint = ti.EndPoint;
        //    if (!m_sock_raw.SendToAsync(sae)) IOProcessPool.QueueWork(this.ProcessSend, sae);
        //}

        private SYNScanTaskInfo CreateTaskInfo(int nPort, EndPoint endPoint, int nProbes, int nTimeout, int nRetry, int nTotalTimeout, bool bUseNullProbes)
        {
            SYNScanTaskInfo ti = null;

            lock (m_obj_sync) {
                ti = m_que_task.Dequeue();
            }
            ti.Retry          = nRetry;
            ti.RunedRetry     = 0;
            ti.Port           = nPort;
            ti.EndPoint       = endPoint;
            ti.IsStarted      = false;
            ti.Probes         = nProbes;
            ti.IsUseNullProbe = bUseNullProbes;
            ti.Timeout        = nTimeout;
            ti.TotalTimeout   = nTotalTimeout;
            ti.UIP            = BitConverter.ToUInt32(((IPEndPoint)endPoint).Address.GetAddressBytes(), 0);
            uint uTemp = 0;

            lock (m_rnd) uTemp = (uint)m_rnd.Next();
            uTemp    &= 0xFF0000FF;
            ti.TaskID = ti.TaskID & 0x00FFFF00 | uTemp;
            ti.SEQ    = RAWDefine.GetSynPacket(ti.SYNPacket, m_uLocalIP, ti.UIP, m_nLocalPort, (ushort)ti.Port, ti.TaskID);
            return(ti);
        }
Example #4
0
        private void FullCheckSum(byte[] byPacket)
        {
            uint sum = RAWDefine.CheckSum(byPacket, byPacket.Length);

            byPacket[2] = (byte)sum;
            byPacket[3] = (byte)(sum >> 8);
        }
Example #5
0
        //void IO_Completed(object sender, SocketAsyncEventArgs e) {
        //    switch (e.LastOperation) {
        //        case SocketAsyncOperation.SendTo:
        //            this.ProcessSend(e);
        //            break;
        //        case SocketAsyncOperation.Receive:
        //            this.ProcessRecv(e);
        //            break;
        //    }
        //}

        //private void ProcessSend(SocketAsyncEventArgs e) {
        //    this.PushSAE(e);
        //}

        private void ProcessRecv(object sender, SocketAsyncEventArgs e)
        {
            lock (m_obj_sync) {
                if (base._IsDisposed)
                {
                    return;
                }
            }
            Socket sock = e.UserToken as Socket;

            if (e.SocketError == SocketError.Success && e.BytesTransferred > 0)
            {
                bool b       = true;
                uint uSIP    = BitConverter.ToUInt32(e.Buffer, 16);
                int  nOffset = (e.Buffer[0] & 0x0F) * 4;
                uint uSEQ    = RAWDefine.GetACKNumber(e.Buffer, nOffset) - 1;
                if (e.BytesTransferred < 40)
                {
                    b = false;
                }
                else if (nOffset < 20 || e.BytesTransferred - 20 < nOffset)
                {
                    b = false;
                }
                else if (e.Buffer[9] != RAWDefine.PROTO_TCP)
                {
                    b = false;
                }
                else if ((ushort)((e.Buffer[nOffset + 2] << 8) | e.Buffer[nOffset + 3]) != m_nLocalPort)
                {
                    b = false;
                }
                else if (e.Buffer[nOffset + 13] != 0x12)
                {
                    b = false;                                     //syn + ack
                }
                else if (uSIP != m_uLocalIP)
                {
                    b = false;
                }
                SYNScanTaskInfo ti = null;
                if (b)
                {
                    lock (m_dic_task_running) {
                        if (m_dic_task_running.ContainsKey(uSEQ))
                        {
                            ti = m_dic_task_running[uSEQ];
                            m_dic_task_running.Remove(uSEQ);
                        }
                    }
                }
                if (ti != null)
                {
                    uint id = m_tcp_scanner.Scan(ti.UIP, ti.Port, ti.Probes, ti.Timeout, ti.Retry, ti.TotalTimeout, ti.IsUseNullProbe);
                    lock (m_dic_uid) m_dic_uid.Add(id, ti);
                }
            }
            //if (!sock.ReceiveAsync(e)) IOProcessPool.QueueWork(this.ProcessRecv, e);
        }
        public SYNScanner(int nMaxTask, ProbeConfiger probes, EndPoint bindEndPoint)
        {
            if (nMaxTask > 60000 || nMaxTask < 1)
            {
                throw new ArgumentOutOfRangeException("the MaxTask must be between 1 and 30000");
            }
            m_probes = probes;
            if (bindEndPoint == null)
            {
                foreach (var v in Dns.GetHostAddresses(Dns.GetHostName()))
                {
                    if (v.IsIPv6LinkLocal || v.IsIPv6Multicast || v.IsIPv6SiteLocal)
                    {
                        continue;
                    }
                    bindEndPoint = new IPEndPoint(v, 0);
                }
            }
            m_rnd                    = new Random();
            m_dic_uid                = new Dictionary <uint, SYNScanTaskInfo>();// new Dictionary<uint, uint>();
            m_dic_task_running       = new Dictionary <uint, SYNScanTaskInfo>();
            m_tcp_scanner            = new TCPScanner(nMaxTask, probes);
            m_tcp_scanner.Completed += new ScanEventHandler(m_tcp_Completed);
            m_sock_bind              = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            m_sock_bind.Bind(bindEndPoint);
            bindEndPoint = m_sock_bind.LocalEndPoint;
            m_strLocalIP = bindEndPoint.ToString().Split(':')[0];
            m_uLocalIP   = RAWDefine.IPToINT(m_strLocalIP);
            m_nLocalPort = ushort.Parse(bindEndPoint.ToString().Split(':')[1]);
            m_se         = new Semaphore(nMaxTask, nMaxTask);

            m_sock_raw = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
            m_sock_raw.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true);
            m_sock_raw.Bind(bindEndPoint);
            m_sock_raw.IOControl(IOControlCode.ReceiveAll, new byte[] { 1, 0, 0, 0 }, null);

            m_que_task = new Queue <SYNScanTaskInfo>();
            m_que_sae  = new Queue <SocketAsyncEventArgs>();
            for (int i = 0; i < nMaxTask; i++)
            {
                SYNScanTaskInfo ti = new SYNScanTaskInfo();
                ti.TaskID    = (uint)((i + 1) << 8);
                ti.SYNPacket = new byte[40];
                m_que_task.Enqueue(ti);
            }

            SocketAsyncEventArgs sae = new SocketAsyncEventArgs();

            sae.Completed += new EventHandler <SocketAsyncEventArgs>(IO_Completed);
            sae.SetBuffer(new byte[65535], 0, 65535);
            sae.UserToken = m_sock_raw;
            if (!m_sock_raw.ReceiveAsync(sae))
            {
                IOProcessPool.QueueWork(this.ProcessRecv, sae);
            }
            m_thread_timeout = new Thread(this.CheckTimeout);
            m_thread_timeout.IsBackground = true;
            m_thread_timeout.Start();
        }
Example #7
0
        public static uint GetSynPacket(byte[] byBuffer, uint uSIP, uint uDIP, ushort usSPort, ushort usDPort, uint uSeq)
        {
            Array.Copy(m_bySyn, byBuffer, m_bySyn.Length);
            uint useq = RAWDefine.SetSynData(byBuffer, uSIP, uDIP, usSPort, usDPort, uSeq);

            RAWDefine.CheckSum(byBuffer);
            return(useq);
        }
Example #8
0
        private static void CheckSum(byte[] bySyn)
        {
            lock (m_byPsd) {
                m_byPsd[0] = bySyn[12];
                m_byPsd[1] = bySyn[13];
                m_byPsd[2] = bySyn[14];
                m_byPsd[3] = bySyn[15];
                m_byPsd[4] = bySyn[16];
                m_byPsd[5] = bySyn[17];
                m_byPsd[6] = bySyn[18];
                m_byPsd[7] = bySyn[19];

                Array.Copy(m_byPsd, m_byTemp, 12);
                Array.Copy(bySyn, 20, m_byTemp, 12, 20);
                ushort usSum = RAWDefine.CheckSum(m_byTemp, m_byTemp.Length);
                bySyn[36] = (byte)(usSum);
                bySyn[37] = (byte)(usSum >> 8);
                usSum     = RAWDefine.CheckSum(bySyn, 20);
                bySyn[10] = (byte)(usSum);
                bySyn[11] = (byte)(usSum >> 8);
            }
        }
Example #9
0
        private TaskInfo CreateTaskInfo(IPAddress ipAddr, int nRetry, byte[] byData)
        {
            TaskInfo ti = null;

            lock (m_que_taskInfo) ti = m_que_taskInfo.Dequeue();
            if (byData != null)
            {
                if (byData.Length > 1400)
                {
                    throw new ArgumentException("The [byData.Length] must less than 1400");
                }
                if (byData.Length + ti.HeadPacket.Length > ti.TempPacket.Length)
                {
                    ti.TempPacket = new byte[byData.Length + ti.HeadPacket.Length];
                    Array.Copy(ti.HeadPacket, ti.TempPacket, ti.HeadPacket.Length);
                    Array.Copy(byData, 0, ti.TempPacket, ti.HeadPacket.Length, byData.Length);
                }
                ti.DataLen = ti.HeadPacket.Length + byData.Length;
            }
            else
            {
                ti.DataLen = ti.HeadPacket.Length + 1;
                Array.Copy(ti.HeadPacket, ti.TempPacket, ti.HeadPacket.Length);
                lock (m_rnd) ti.TempPacket[ti.HeadPacket.Length] = (byte)m_rnd.Next('a', 'z');
            }
            ti.TempPacket[2] = 0;
            ti.TempPacket[3] = 0;
            uint sum = RAWDefine.CheckSum(ti.TempPacket, ti.TempPacket.Length);

            ti.TempPacket[2] = (byte)sum;
            ti.TempPacket[3] = (byte)(sum >> 8);
            ti.EndPoint      = new IPEndPoint(ipAddr, 0);
            ti.Retry         = nRetry;
            ti.RunedRetry    = 0;
            return(ti);
        }
Example #10
0
 public static uint IPToINT(string strIP)
 {
     return(RAWDefine.IPToINT(strIP, false));
 }
Example #11
0
 public static uint GetSynPacket(byte[] byBuffer, string strSIP, string strDIP, ushort usSPort, ushort usDPort, uint uSeq)
 {
     return(RAWDefine.GetSynPacket(byBuffer, RAWDefine.IPToINT(strSIP), RAWDefine.IPToINT(strDIP), usSPort, usDPort, uSeq));
 }
Example #12
0
 public static byte[] GetSynPacket(uint uSIP, uint uDIP, ushort usSPort, ushort usDPort, uint uSeq)
 {
     byte[] byRet = new byte[m_bySyn.Length];
     RAWDefine.GetSynPacket(byRet, uSIP, uDIP, usSPort, usDPort, uSeq);
     return(byRet);
 }
Example #13
0
 public static byte[] GetSynPacket(string strSIP, string strDIP, ushort usSPort, ushort usDPort)
 {
     return(RAWDefine.GetSynPacket(RAWDefine.IPToINT(strSIP), RAWDefine.IPToINT(strDIP), usSPort, usDPort));
 }