| C#编写的多线程端口扫描程序 |
|
| 作者:佚名 来源:安全在线
更新时间:2006-10-9 【字体:小
大】 |
|
<%=(int(rnd()*1)+1)%>您当前的位置:中国安全在线cnsafer.com 请进入[技术论坛]发表评论 阅读提示:
using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; //增加的如下.. using System.Data; using System.Net.Sockets; using System.Net; using System.IO; using System.Text; using System.Threading; namespace iPortScan { /// <summary> /// Summary description for Form1. /// </summary> public class Form1 : System.Windows.Forms.Form { //该处放的是程序要用到的公共变量 public string scanHost = Dns.GetHostName(); //默认当前本机IP public Int32 tport = 0; //当前连接端口编号 public Int32 connState = 0; //扫描状态 public int portSum = 0 ; //端口总计 public bool endThread = false; //结束状态 public AutoResetEvent asyncOpsAreDone = new AutoResetEvent(false); private System.Windows.Forms.Label label1; private System.Windows.Forms.TextBox txtHostname; private System.Windows.Forms.Button cmdExec; private System.Windows.Forms.ListBox logList; public System.Windows.Forms.CheckedListBox portList; private System.Windows.Forms.Label label2; private System.Windows.Forms.Label label3; private System.Windows.Forms.NumericUpDown sNum; private System.Windows.Forms.NumericUpDown eNum; private System.Windows.Forms.CheckBox showdie; private System.Windows.Forms.Label label4; private System.Windows.Forms.Button button1; private System.Windows.Forms.ToolTip toolTip1; private System.Windows.Forms.StatusBar statusBar1; private System.Windows.Forms.LinkLabel linkLabel1; private System.Windows.Forms.LinkLabel linkLabel2; private System.ComponentModel.IContainer components; /* 此处省略了各个调用的控件的属性设置代码 */ static void Main() { Application.Run(new Form1()); } private void cmdExec_Click(object sender, System.EventArgs e) { Int32 startPort = (Int32)sNum.Value; Int32 endPort = (Int32)eNum.Value; if(txtHostname.Text.Length==0) { MessageBox.Show("请输入一个主机的名称吧!","系统提示"); txtHostname.Text = scanHost.ToString(); txtHostname.Focus(); return; } if(startPort>endPort) { MessageBox.Show("错误,起始端口必须要小于结束的端口!","系统提示"); startPort = endPort-1; sNum.Text = startPort.ToString(); sNum.Focus(); return ; } if(cmdExec.Text=="&Scan") { endThread= false; cmdExec.Text= "&Stop"; } else { endThread= true; cmdExec.Text= "&Scan"; } if(endThread!=true) { connState = 0; portSum = 0; scanHost = txtHostname.Text; try { IPAddress ipaddr =(IPAddress)Dns.Resolve(scanHost).AddressList.GetValue(0); txtHostname.Text = ipaddr.ToString(); } catch { txtHostname.Focus(); MessageBox.Show("请输入正确的主机地址,该地址DNS无法解析","系统提示"); return ; } logList.Items.Clear(); for (Int32 threadNum = startPort; threadNum <=endPort; threadNum++) { ThreadPool.QueueUserWorkItem(new WaitCallback(Startscan),threadNum); logList.Items.Add ("扫描端口:" + threadNum.ToString()); } } } public void Startscan(Object state) { Int32 port = (Int32) state; string tMsg = ""; string getData = ""; int lindex = 0; int eindex = 0; connState++; //判断线程数目 if(endThread==true) { if(connState==((Int32)eNum.Value-(Int32)sNum.Value)) { cmdExec.Text = "&Scan"; logList.Items.Add ("扫描完毕!"); } else { cmdExec.Text = "&Stop"; logList.Items.Add ("正在停止对"+port.ToString()+"端口的扫描线程"); } logList.Items.Add("结束线程:"+port.ToString()); asyncOpsAreDone.Close(); } else { try { TcpClient tcp = new TcpClient(); tcp.Connect(scanHost,port); //该处如果建立连接错误的话,将不执行下面的代码.. portSum ++; lindex = portList.Items.Add(port.ToString() + "端口开放",false); portList.SelectedIndex=lindex; Stream sm = tcp.GetStream(); sm.Write(Encoding.Default.GetBytes(tMsg.ToCharArray()),0,tMsg.Length); StreamReader sr = new StreamReader(tcp.GetStream(),Encoding.Default); getData = sr.ReadLine(); if(lindex!=0&&getData.Length!=0) { tMsg = " +-" + port.ToString() + "端口数据:"+getData.ToString(); eindex = portList.Items.Add(tMsg); //插入一条信息记录 portList.Items.Insert(lindex+1,tMsg); portList.Items.RemoveAt(eindex); } sr.Close(); sm.Close(); tcp.Close(); } catch { //显示坏死的端口 if(showdie.Checked==true) { portList.Items.Add(port.ToString()+"端口无法连接,回传数据为空"); } } finally { Thread.Sleep(0); logList.Items.Add("结束线程:"+port.ToString()); asyncOpsAreDone.Close(); statusBar1.Text = "端口总计:"+portSum.ToString() ; if(connState==((Int32)eNum.Value-(Int32)sNum.Value)) { cmdExec.Text = "&Scan"; } } } } private void button1_Click(object sender, System.EventArgs e) { Application.Exit(); } 总结:基于.Net 框架开发程序确实简单方便,并且功能强大。
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力 |
| 文章录入:ls1238 责任编辑:ls1238
|
|
上一篇文章: 打造全功能MYSQL入侵UDF
下一篇文章: 高级扫描技术及原理介绍 |
| 【字体:小
大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】
|