go语言制作端口扫描器_Golang

GO语言编写的TCP端口扫描器,本人的第一个GO程序。

Git@OSC:http://git.oschina.net/youshusoft/GoScanner

使用命令:

Scanner startIp [endIp] port thread

参数说明:

startIp  开始IP
endIp  结束IP,可选,不输入表示只扫描startIp
port  扫描端口,单个端口:3389;多个端口:1433,3389;连续端口:135-3389
thread  最大并发线程数,最高2048

扫描结果保存在同目录下的 result.txt 中,每次启动都会清掉之前的内容。

例子一:
Scanner 58.96.172.22 58.96.172.220 80 512
扫描58.96.172.22到58.96.172.220中的80端口,最大并发线程512。

例子二:
Scanner 58.96.172.22 58.96.172.220 21,5631 512
扫描58.96.172.22到58.96.172.220中的21和5631端口,最大并发线程512。

例子三:
Scanner 58.96.172.22 58.96.172.220 1-520 512
扫描58.96.172.22到58.96.172.220中的1到520端口,最大并发线程512。

例子四:
Scanner 58.96.172.22 1-520 512
扫描58.96.172.22中的1到520端口,最大并发线程512。

package main
import (
"fmt"
"strconv"
"flag"
"strings"
"net"
"os"
)
/**
  扫描地址
*/
var ipAddrs chan string = make(chan string)
//扫描结果
var result chan string = make(chan string)
//线程数
var thread chan int = make(chan int)
var nowThread int;
//关闭程序
var clo chan bool = make(chan bool)
//保存结果
func writeResult(){
  fileName := "result.txt"
  fout,err := os.Create(fileName)
  if err != nil{
    //文件创建失败
    fmt.Println(fileName + " create error")
  }
  defer fout.Close()
  s,ok := <- result
  for ;ok;{
    fout.WriteString(s + "\r\n")
    s,ok = <- result
  }
  //通知进程退出
  clo <- true;
}
//根据线程参数启动扫描线程
func runScan(){
  t,ok := <- thread
  nowThread = t;
  if ok{
    for i := 0;i < nowThread;i++{
    go scan(strconv.Itoa(i))
    }
  }
  //等待线程终止
  for;<-thread == 0;{
    nowThread--
    if nowThread == 0{
      //全部线程已终止,关闭结果写入,退出程序
      close(result)
      break
    }
  }
}
/**
  扫描线程
*/
func scan(threadId string){
  s,ok := <-ipAddrs
  for;ok;{
    fmt.Println("[thread-" + threadId + "] scan:" + s)
    _,err := net.Dial("tcp",s)
    if err == nil{
      //端口开放
      result <- s
    }
    s,ok = <-ipAddrs
  }
  fmt.Println("[thread-" + threadId + "] end")
  thread <- 0;
}
//获取下一个IP
func nextIp(ip string) string{
  ips := strings.Split(ip,".")
  var i int;
  for i = len(ips) - 1;i >= 0;i--{
    n,_ := strconv.Atoi(ips[i])
    if n >= 255{
      //进位
      ips[i] = "1"
    }else{
      //+1
      n++
      ips[i] = strconv.Itoa(n)
      break
    }
  }
  if i == -1{
    //全部IP段都进行了进位,说明此IP本身已超出范围
    return "";
  }
  ip = ""
  leng := len(ips)
  for i := 0;i < leng;i++{
    if i == leng -1{
      ip += ips[i]
    }else{
      ip += ips[i] + "."
    }
  }
  return ip
}
//生成IP地址列表
func processIp(startIp,endIp string) []string{
  var ips = make([]string,0)
  for ;startIp != endIp;startIp = nextIp(startIp){
    if startIp != ""{
      ips = append(ips,startIp)
    }
  }
  ips = append(ips,startIp)
  return ips
}
//处理参数
func processFlag(arg []string){
  //开始IP,结束IP
  var startIp,endIp string
  //端口
  var ports []int = make([]int,0)
  index := 0
  startIp = arg[index]
  si := net.ParseIP(startIp)
  if si == nil{
    //开始IP不合法
    fmt.Println("'startIp' Setting error")
    return
  }
  index++
  endIp = arg[index]
  ei := net.ParseIP(endIp)
  if(ei == nil){
    //未指定结束IP,即只扫描一个IP
    endIp = startIp
  }else{
   index++
  }
  tmpPort := arg[index]
  if strings.Index(tmpPort,"-") != -1{
    //连续端口
    tmpPorts := strings.Split(tmpPort,"-")
    var startPort,endPort int
    var err error
    startPort,err = strconv.Atoi(tmpPorts[0])
    if err != nil || startPort < 1 || startPort > 65535{
      //开始端口不合法
      return
    }
    if len(tmpPorts) >= 2{
      //指定结束端口
      endPort,err = strconv.Atoi(tmpPorts[1])
      if err != nil || endPort < 1 || endPort > 65535 || endPort < startPort{
        //结束端口不合法
        fmt.Println("'endPort' Setting error")
        return
      }
    }else{
      //未指定结束端口
      endPort = 65535
    }
    for i := 0;startPort + i <= endPort;i++{
      ports = append(ports,startPort + i)
    }
  }else{
    //一个或多个端口
    ps := strings.Split(tmpPort,",")
    for i := 0;i < len(ps);i++{
      p,err := strconv.Atoi(ps[i])
      if err != nil{
        //端口不合法
        fmt.Println("'port' Setting error")
        return
      }
      ports = append(ports,p)
    }
  }
  index++
  t,err := strconv.Atoi(arg[index])
  if(err != nil){
    //线程不合法
    fmt.Println("'thread' Setting error")
    return
  }
  //最大线程2048
  if t < 1{
    t = 1;
  }else if t > 2048{
    t = 2048;
  }
  //传送启动线程数
  thread <- t
  //生成扫描地址列表
  ips := processIp(startIp,endIp)
  il := len(ips)
  for i := 0; i < il;i++{
    pl := len(ports)
    for j := 0;j < pl;j++{
      ipAddrs <- ips[i] + ":" + strconv.Itoa(ports[j])
    }
  }
  close(ipAddrs)
}
func main(){
  flag.Parse()
  if flag.NArg() != 3 && flag.NArg() != 4{
    //参数不合法
    fmt.Println("Parameter error")
    return
  }
  //获取参数
  args := make([]string,0,4)
  for i := 0;i < flag.NArg();i++{
    args = append(args,flag.Arg(i))
  }
  //启动扫描线程
  go runScan()
  //启动结果写入线程
  go writeResult()
  //参数处理
  processFlag(args)
  //等待退出指令
  <- clo;
  fmt.Println("Exit")
}

以上所述就是本文的全部内容了,希望大家能够喜欢。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索端口
, go语言
扫描器
易语言端口扫描器、go语言和golang、golang go语言、go语言为什么叫golang、端口扫描器,以便于您获取更多的相关知识。

时间: 2024-10-27 10:05:13

go语言制作端口扫描器_Golang的相关文章

GO语言实现的端口扫描器分享_Golang

复制代码 代码如下: //GO语言  实现端口扫描     //缺陷     //port  无法设置成全局变量不知道怎么设置的     //var l = list.New()   这个是数组操作并不是消息队列    跟消息队列功能类似     //实现功能     //实现生成 IP段     //实现端口扫描     //实现参数传入     //写入文件到本地     //main.go 58.215.20.30 58.215.201.30 80     //文件名 开始IP 结束IP

C实现的非阻塞方式命令行端口扫描器源码_C 语言

该实例是一个C实现的基于命令行模式端口扫描代码,并且是以非阻塞方式来实现对IP和端口的连接测试.为了大家使用和学习方便,已在代码中尽可能多的地方加入了注释,相信对于帮助大家理解C端口扫描有很大帮助. 具体功能代码如下: #include <afxext.h> #include <winsock.h> // 编译时需使用的库 #pragma comment(lib,"wsock32.lib") // select()成员定义 #define ZERO (fd_se

一个简单的php在线端口扫描器

端口扫描|在线 前言 PHP是一种功能强大的Web开发语言.开发效率高,语法简单,为动态网站量身定做,加强面向对象(向C++靠拢,与JAVA搭了点边),可惜单线程(这是至命弱点,据说PHP是用C\C++编写的.),也能用C.C++.JAVA开发中间层,调用COM,服务器维护难度小,故障少. 既然是为动态网站量身定做,所以注定不能开发出X-scan这样的超强扫描器,不过如果要实现一些简单的功能,还是绰绰有余的. 端口扫描是我们最常用的踩点手段.如果在网吧这种地方,下载一个专门的扫描器又比较麻烦,如

PHP实现的一个简单的在线端口扫描器程序

前言 PHP是一种功能强大的Web开发语言.开发效率高,语法简单,为动态网站量身定做,加强面向对象(向C++靠拢,与JAVA搭了点边),可惜单线程(这是至命弱点,据说PHP是用C\C++编写的.),也能用C.C++.JAVA开发中间层,调用COM,服务器维护难度小,故障少. 既然是为动态网站量身定做,所以注定不能开发出X-scan这样的超强扫描器,不过如果要实现一些简单的功能,还是绰绰有余的. 端口扫描是我们最常用的踩点手段.如果在网吧这种地方,下载一个专门的扫描器又比较麻烦,如果利用现有的We

mfc c++-新人求教,我用mfc做了一个tcp fin的端口扫描器,死后得不出结果,求大神帮忙找出问题

问题描述 新人求教,我用mfc做了一个tcp fin的端口扫描器,死后得不出结果,求大神帮忙找出问题 cpp文件 // scanDlg.cpp : implementation file// #include ""stdafx.h""#include ""scan.h""#include ""scanDlg.h""#include ""afxdialogex.h&qu

python-nmap 0.2.4发布 nmap端口扫描器

python-nmap 0.2.4此版本实现了一个用于分析操作系统扫描输出的要求.它解决了与多个主机规格的错误.纠正了在example.py发生的错误,如果没有开放22-443之间的TCP端口. python-nmap 是一个用来http://www.aliyun.com/zixun/aggregation/17185.html">帮助用户使用 nmap 端口扫描器的 Python 库,可让用户轻松操作 nmap 扫描结果.自动扫描和生成报告. 下载地址:http://xael.org/n

用java语言制作球星管理系统

问题描述 用java语言制作球星管理系统 要求有一个主界面,可以实现NBA球星的姓名,所属球队,号码等基本信息的查询,修改,删除,添加等,把信息放在文件中,在java程序中读取文件中的信息.新人首帖求帮助 解决方案 http://www.codeforge.cn/read/71921/deletestu.java__html 解决方案二: http://www.codeforge.cn/read/71921/deletestu.java__htmlhttp://www.taodocs.com/p

cad-利用C#语言制作CAD插件

问题描述 利用C#语言制作CAD插件 想用C#编写一个CAD的插件,就是生成一个exe文件,点击之后安装,安装完之后能出现在CAD的工具栏或菜单栏中. 以前只做过一些简单的窗体程序,希望大神能指点一二,小弟在此先谢过了! 解决方案 http://www.cnblogs.com/Leo_wl/archive/2013/03/21/2973886.html

实例探究Python以并发方式编写高性能端口扫描器的方法

来源:http://www.jb51.net/article/86615.htm 关于端口扫描器端口扫描工具(Port Scanner)指用于探测服务器或主机开放端口情况的工具.常被计算机管理员用于确认安全策略,同时被攻击者用于识别目标主机上的可运作的网络服务. 端口扫描定义是客户端向一定范围的服务器端口发送对应请求,以此确认可使用的端口.虽然其本身并不是恶意的网络活动,但也是网络攻击者探测目标主机服务,以利用该服务的已知漏洞的重要手段.端口扫描的主要用途仍然只是确认远程机器某个服务的可用性.