设为首页收藏本站
查看: 3611|回复: 20

申请贴 IP段端口扫描小工具

  [复制链接]
  • TA的每日心情
    无聊
    昨天 00:03
  • 签到天数: 480 天

    [LV.9]以坛为家II

    发表于 2017-6-4 22:24:41 | 显示全部楼层 |阅读模式
    本帖最后由 a1085189 于 2017-6-10 17:31 编辑

    因为本人最早是学c#的,C#用的比较顺手,在比较C和C#之后还是决定用C#写
    主要部分都标注了,应该很容易看懂,这里用的是TCP多线程单网段扫描 过程很简单
    基本思路就是先ping目标IP,若存在,则利用TCP链接扫描开放端口
    因为只是测试,限制100个线程


    使用时只需要输入目标IP段,以及目前扫描的端口数量即可,返回值显示在下方textbox中







    以下为全部代码
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Net;
    4. using System.Net.Sockets;
    5. using System.Text.RegularExpressions;
    6. using System.Threading;
    7. using System.Windows.Forms;
    8. using System.Net.NetworkInformation;


    9. namespace scanIP
    10. {
    11.     public partial class Form1 : Form
    12.     {
    13.         public Form1()
    14.         {
    15.             System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
    16.             InitializeComponent();
    17.             textBox3.Text = "172.30.12.10";//拿到开始IP地址
    18.             textBox4.Text = "172.30.12.18";//拿到结束的IP地址
    19.         }

    20.         List<string> str;//结果字串
    21.         int start;//开始IP的最后一串数字
    22.         int end;//结束IP的最后一串数字
    23.         bool tag = true;//是否终止当前扫描的变量

    24.         private void button1_Click(object sender, EventArgs e)//点击事件
    25.         {
    26.             this.richTextBox1.Text = "开始\n";//打印输出,下同
    27.             Regex rgx = new Regex(@"^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$");//正则表达式,IP填写规则
    28.             if (rgx.IsMatch(textBox3.Text) && rgx.IsMatch(textBox4.Text))//匹配正确IP
    29.             {
    30.                 start = Int32.Parse(textBox1.Text);//获取IP最末尾的数字,下同
    31.                 end = Int32.Parse(textBox2.Text);
    32.             }
    33.             else//IP地址不正确跳出提示
    34.             {
    35.                 MessageBox.Show("请填写正确IP");
    36.                 return;
    37.             }

    38.             if (end - start > 100)//限制端口数不大于100
    39.             {
    40.                 MessageBox.Show("搜索范围不能超过100个端口");
    41.                 return;
    42.             }
    43.             if (end < start)//防止IP地址获取时后面的大于前面的
    44.             {
    45.                 MessageBox.Show("WTF?结束大于开头怎么扫?");
    46.                 return;
    47.             }
    48.             tag = true;
    49.             Thread waitT = new Thread(new ThreadStart(wait));//开子线程,先扫IP再扫端口
    50.             waitT.Start();//等待所有线程执行完毕在写入textbox中
    51.         }
    52.         public void wait()
    53.         {
    54.             int startIp = Int32.Parse(textBox3.Text.Split('.')[3]);//开始ip最末尾数字
    55.             int endIp = Int32.Parse(textBox4.Text.Split('.')[3]);//结束ip最末尾数字
    56.             string ip = textBox3.Text.Split('.')[0] + "." + textBox3.Text.Split('.')[1] + "." + textBox3.Text.Split('.')[2] + ".";//拼接IP地址段
    57.             for (int q = startIp; q <= endIp && tag == true; q++)//过程是IP前3个数字不变,q是IP的第四位数字,执行q的自增就是逐个扫描
    58.             {
    59.                 //执行ping命令
    60.                 Ping ping = new Ping();
    61.                 PingReply reply = ping.Send(IPAddress.Parse(ip + q), 20);//ping一下目标测试该IP是否存在,是否有人使用
    62.                 if (reply.Status == IPStatus.Success)//返回成功执行下部,有返回值说明该IP存在
    63.                 {
    64.                     richTextBox1.Text += ip + q + "Ping时间" + reply.RoundtripTime + "毫秒\n";//字符串拼接,输入信息:IP地址+响应时间
    65.                     string sIP = ip + q;
    66.                     Console.WriteLine(sIP);//此处测试用的,控制台输出打印IP地址

    67.                     IPHostEntry host = Dns.GetHostEntry(sIP);//取得该IP主机信息
    68.                     richTextBox1.Text += "主机名为" + host.HostName + "\n";//字符串拼接,输入信息:主机名
    69.                 }
    70.                 else //这里是输出IP不存在的状况
    71.                 {
    72.                     richTextBox1.Text += ip + q + "不可达 \n";//输出信息IP无法到达
    73.                     continue;
    74.                 }
    75.                 //IP存在,则开子线程开始端口扫描,端口数由textbox1,textbox2的差值决定
    76.                 Thread[] tharr = new Thread[end - start + 1];//创建多线程
    77.                 str = new List<string>();//定义一个数组
    78.                 for (int i = start; i <= end; i++)//循环次数即为端口数
    79.                 {
    80.                     Thread thread = new Thread(new ParameterizedThreadStart(Scan));
    81.                     thread.Start(new IPEndPoint(IPAddress.Parse(ip + q), i));//每扫描一个端口创建一个线程
    82.                     tharr[i - start] = thread;//把该线程赋给tharr,方便输出
    83.                 }
    84.                 bool iscon = true;//第一个线程等待时间
    85.                 for (int i = 0; i < tharr.Length; i++)
    86.                 {
    87.                     if (tharr[i] == null)//如果端口扫不到,说明未开放,跳过继续
    88.                         continue;
    89.                     while (tharr[i].IsAlive && iscon)//端口存在,对端口超时设置时间(目前200毫秒),一直等待此ip所有线程执行完毕才扫描下个ip
    90.                     {
    91.                         Thread.Sleep(200);//等待200ms
    92.                         iscon = false;//第一个线程给200ms等待时间,其他线程由于同步执行的,所以没等待时间了,如果线程还没执行完,说明此端口不可达。也可以说200ms如果扫不出那就跳过。
    93.                     }
    94.                 }
    95.                 str.Sort();//数组排序
    96.                 richTextBox1.Text += "开放端口: ";//以下为输出端口数组str
    97.                 for (int k = 0; k < str.Count; k++)//输出,填充到textbox中
    98.                     richTextBox1.Text += str[k];
    99.                 richTextBox1.Text += "\n";
    100.             }
    101.             if (tag == true)//如果扫描到最后tag一直为true,那就说明端口扫描结束,如果tag为false,那么说明是人为打断,所以是扫描终止
    102.                 MessageBox.Show("扫描完成");
    103.             else
    104.             {
    105.                 MessageBox.Show("扫描终止");
    106.             }
    107.         }
    108.         public void Scan(object Point)//该方法执行TCP链接,链接目标IP
    109.         {
    110.             IPEndPoint IPPoint = (IPEndPoint)Point;//表示为IP地址和端口号
    111.             try
    112.             {
    113.                 TcpClient tcp = new TcpClient();//声明TCP链接
    114.                 tcp.Connect(IPPoint);//使用TCP链接IP
    115.                 if (tcp.Connected)//链接成功则执行下面
    116.                     str.Add(IPPoint.Port + ",");
    117.             }
    118.             catch
    119.             {
    120.                 ;
    121.             }
    122.         }



    123.         private void button2_Click(object sender, EventArgs e)//停止按钮响应事件
    124.         {
    125.             tag = false;//设置tag为false,终止扫描
    126.         }


    127.     }

    128. }
    复制代码
    上边的就是所有的源码,也可以供参考,要是有更好的建议可以回复我。
    ID:Darksky












    使用时也很简单,只需要输入1-65000之间的端口号,以及目标IP段即可,通俗易懂

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?注册

    x

    点评

    没有文字解说,不合格的哟,尽快修改  发表于 2017-6-4 23:00
  • TA的每日心情
    无聊
    昨天 00:03
  • 签到天数: 480 天

    [LV.9]以坛为家II

     楼主| 发表于 2017-6-6 23:27:22 来自手机 | 显示全部楼层
    P0LICE 发表于 2017-06-06 19:32:26
    表示没有激情!!

    警察叔叔要啥激情?
    回复 支持 1 反对 0

    使用道具 举报

  • TA的每日心情
    郁闷
    2017-6-5 01:24
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    发表于 2017-6-5 01:27:13 | 显示全部楼层
      学习下,下来试试
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-6-2 18:31
  • 签到天数: 24 天

    [LV.4]偶尔看看III

    发表于 2017-6-5 20:25:09 | 显示全部楼层
    不会c#的根本看不懂
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    昨天 00:03
  • 签到天数: 480 天

    [LV.9]以坛为家II

     楼主| 发表于 2017-6-5 22:14:54 | 显示全部楼层
    注释了还看不懂吗?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    昨天 00:03
  • 签到天数: 480 天

    [LV.9]以坛为家II

     楼主| 发表于 2017-6-6 11:12:14 | 显示全部楼层
    帖子已修改
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2017-6-26 07:28
  • 签到天数: 28 天

    [LV.4]偶尔看看III

    发表于 2017-6-6 19:32:26 | 显示全部楼层
    表示没有激情!!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-5-25 11:34
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    发表于 2017-6-10 04:42:56 | 显示全部楼层
    学习了, 过来看看
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-10-1 14:48
  • 签到天数: 170 天

    [LV.7]常住居民III

    发表于 2017-6-15 17:44:20 | 显示全部楼层
    厉害?????????????
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2018-8-26 14:12
  • 签到天数: 255 天

    [LV.8]以坛为家I

    发表于 2017-6-16 16:23:09 | 显示全部楼层
    可以可以
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2018-11-1 00:39
  • 签到天数: 201 天

    [LV.7]常住居民III

    发表于 2017-6-20 22:02:39 | 显示全部楼层
    牛毙了   收藏+复制
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-12-6 18:39
  • 签到天数: 73 天

    [LV.6]常住居民II

    发表于 2017-8-17 15:51:13 | 显示全部楼层
    楼主辛苦了  感觉好厉害
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2018-9-27 14:29
  • 签到天数: 129 天

    [LV.7]常住居民III

    发表于 2018-4-4 09:45:49 | 显示全部楼层
    学习了,666666
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2018-8-25 12:11
  • 签到天数: 23 天

    [LV.4]偶尔看看III

    发表于 2018-4-21 20:50:24 | 显示全部楼层
    确实很好用的
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2018-10-20 15:40
  • 签到天数: 50 天

    [LV.5]常住居民I

    发表于 2018-8-2 16:44:10 | 显示全部楼层
    很久没有用C#,现在重新学起来
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    站长推荐 上一条 /1 下一条

    红盟社区--中国红客联盟 

    Processed in 0.135866 second(s), 30 queries.

    站点统计| 举报| Archiver| 手机版| 黑屋 |   

    Powered by HUC © 2001-2017 Comsenz Inc.

    手机扫我进入移动触屏客户端

    关注我们可获取更多热点资讯

    Honor accompaniments. theme macfee

    快速回复 返回顶部 返回列表