前言

最近有个小项目的需要,使用golang写了个端口扫描工具,不得不说golang的效率确实比python快的太多了。在使用一段时间golang之后,感觉有三个方面是优于python的:

  1. 一个方面是性能优越

  2. 第二方面是兼容性好

  3. 第三方面是可以跨平台编译成本地二进制文件,发布项目很方便。

接下来我把这个工具的源代码,以及使用方式给大家给大家分享一下。

PortScan

工具名称:PortScan

  1. 采用Go语言开发,支持从config.txt文件中读取目的ip和端口,对指定的目的服务器进行端口扫描

  2. config.txt支持配置端口列表,默认为22、36000、56000、3306

  3. 在服务器上连接目的服务器端口,仅做一次TCP三次握手

PortScan参数如下

参数说明:

  • -c:用来指定config文件路径

  • -limit:用来指定扫描端口的并发数,默认为1000

首先生成一个config.txt文件,内容如下:

ip共有255个,端口有10个,也就是说总共要进行2550次TCP连接。

接着使用go build PortScan.go命令,生成一个本地二进制文件PortScan.exe,然后执行命令:

PortScan.exe -c config.txt

最后的结果存储到result.txt文件中,大致用时是30s。

关键源代码

//首先从命令行中读取线程数和配置文件路径
//从配置文件中解析出ip和port
//配置文件格式为
// [ip]
// 127.0.0.1
// [port]
// 22
// 36000
// 56000
// 3306
//根据开启的线程数对指定ip和端口进行tcp连接
//如果端口开启,把ip:port按照格式返回 func Scanner(configFile string, functionid string, sendInfoFile string,limit int){ runtime.GOMAXPROCS(runtime.NumCPU())
data, err := ioutil.ReadFile(configFile)
portlist := make([]string,0,10) if err != nil{
log.Fatal(err)
panic(err)
} ip_index := bytes.Index(data,[]byte("[ip]")) port_index := bytes.Index(data,[]byte("[port]")) if ip_index < 0{ Info.Println("文件格式有误: missing [ip]")
return
} if port_index <0{ portlist = append(portlist,"22")
portlist = append(portlist,"36000")
portlist = append(portlist,"56000")
portlist = append(portlist,"3306") }else{
reg_port := regexp.MustCompile(`\d+`)
var ports [][]byte if ip_index>port_index{
ports = reg_port.FindAll(data[:ip_index],-1) }else{ ports = reg_port.FindAll(data[port_index:],-1)
} for _,v := range(ports){ portlist = append(portlist,string(v)) } } reg_ip := regexp.MustCompile(`((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))`) ips := reg_ip.FindAll(data,-1) input := make(chan []byte, len(ips)) result := make(chan string, len(ips)) defer close(input)
defer close(result) for _, v := range(ips){
input <- v
}
//控制多少并发
for i:=0; i<limit;i++{
//这个时候可以启动扫描函数
go ScanPort(portlist,input,result)
} for i :=0; i< len(ips);i++{ //将扫描的结果输出
ip_result,ok:= <-result if !ok {
break;
} } } func ScanPort(portlist []string,intput chan []byte,result chan string ) { for{
task,ok := <-intput if !ok{ return
}
ip := string(task)
Info.Println("scaning ",ip,"port",portlist)
port_str :=""
for i:=0; i<len(portlist); i++{
_, err := net.DialTimeout("tcp", ip+":"+portlist[i], time.Second*3) if err != nil{
continue
}
port_str+=portlist[i]+" " } if len(port_str) >0{
//说明有打开的端口
// Info.Println(ip+":"+port_str+"open")
result <- ip+"----"+"1"+"----"+"open port:"+port_str }else{ result <- ip+"----"+"0"+"----"+"ok"
} } }

 

最后

关注公众号:七夜安全博客

  • 回复【1】:领取 Python数据分析 教程大礼包
  • 回复【2】:领取 Python Flask 全套教程
  • 回复【3】:领取 某学院 机器学习 教程
  • 回复【4】:领取 爬虫 教程
  • 回复【5】:领取 编译原理 教程
  • 回复【6】:领取 渗透测试 教程
  • 回复【7】:领取 人工智能数学基础 教程
本文章属于原创作品,欢迎大家转载分享,禁止修改文章的内容。尊重原创,转载请注明来自:七夜的故事 http://www.cnblogs.com/qiyeboy/

golang高性能端口扫描的更多相关文章

  1. ★Kali信息收集★8.Nmap :端口扫描

    ★Kali信息收集~ 0.Httrack 网站复制机 http://www.cnblogs.com/dunitian/p/5061954.html ★Kali信息收集~ 1.Google Hackin ...

  2. Python3实现TCP端口扫描

    在渗透测试的初步阶段通常我们都需要对攻击目标进行信息搜集,而端口扫描就是信息搜集中至关重要的一个步骤.通过端口扫描我们可以了解到目标主机都开放了哪些服务,甚至能根据服务猜测可能存在某些漏洞. TCP端 ...

  3. 端口扫描base

    #coding:utf8 import os import socket import sys def IsOpen(ip,port): s = socket.socket(socket.AF_INE ...

  4. Android NDK学习之第一个实例---端口扫描

    为什么要写一个端口扫描的程序,Java来写不是很方便吗?因为我也没有想到什么例子能够方便的来练习.于是想到以前找到的端口扫描的C代码,于是想用他们来练习.扫描服务端端口的方式有许多种,最简单的就是直接 ...

  5. 端口扫描之王——nmap入门精讲(一)

    端口扫描在百度百科上的定义是: 端口扫描是指某些别有用心的人发送一组端口扫描消息,试图以此侵入某台计算机,并了解其提供的计算机网络服务类型(这些网络服务均与端口号相关),但是端口扫描不但可以为黑客所利 ...

  6. 使用Metasploit进行端口扫描

    Metasploit中不仅能够使用第三方扫描器Nmap等,在其辅助模块中也包含了几款内建的端口扫描器. 查看Metasploit框架提供的端口扫描工具: msf > search portsca ...

  7. 小白日记10:kali渗透测试之端口扫描-UDP、TCP、僵尸扫描、隐蔽扫描

    端口扫描 二三四层发现的目的只是为了准确发现所有活着主机IP,确定攻击面,端口扫描即发现攻击点,发现开放端口.端口对应网络服务及应用端程序,服务端程序的漏洞通过端口攻入.[所有的扫描结果,都不要完全相 ...

  8. 『安全工具』Nmap 强悍的端口扫描工具

    作为时下流行的端口扫描工具,Nmap有因其扫描的隐密性有“端口扫描之王”之称 上图是黑客帝国(The Matrix)中崔妮蒂用Nmap入侵核发电站的能源管理系统 0x 01 Nmap介绍 Nmap是一 ...

  9. Hacker(16)----防范端口扫描与嗅探

    端口扫描与嗅探都是黑客常用的招数,其目的是定位目标计算机和窃取隐私信息.为确保自己计算机的安全,用户需要掌握防范嗅探与端口扫描的常见措施,保障个人隐私信息安全. 一.掌握防范端口扫描的常用措施 防范端 ...

随机推荐

  1. Angular JS (一)

    AngularJS是一个js框架,以js编写的库.跟knockoutJS类似. AngularJS扩展了html 通过ng-directives扩展了html:ng-app定义一个angularJS应 ...

  2. unittest 常用的断言方法

    1.assertEqual(self, first, second, msg=None) --判断两个参数相等:first == second 2.assertNotEqual(self, first ...

  3. 【未完成】[Spark SQL_2] 在 IDEA 中编写 Spark SQL 程序

    0. 说明 在 IDEA 中编写 Spark SQL 程序,分别编写 Java 程序 & Scala 程序 1. 编写 Java 程序 待补充 2. 编写 Scala 程序 待补充

  4. [Spark Core] Spark 实现气温统计

    0. 说明 聚合气温数据,聚合出 MAX . MIN . AVG 1. Spark Shell 实现 1.1 MAX 分步实现 # 加载文档 val rdd1 = sc.textFile(" ...

  5. Oracle 导出用户下的所有索引创建语句

    SELECT dbms_lob.substr(dbms_metadata.get_ddl('INDEX', INDEX_NAME))||';'  from dba_indexes where owne ...

  6. Django商城项目笔记No.8用户部分-注册接口实现

    Django商城项目笔记No.8用户部分-注册接口实现 users的view.py中增加如下代码 class RegisterUserView(CreateAPIView): "" ...

  7. C#实现之(自动更新)

    做开发的人,尤其是做客户端(C/S)系统开发的人都会遇到一个头疼的问题,就是软件的自动更新:系统发布后怎样自动的更新程序,在下有幸开发过一个自动更新程序,更新程序与任何宿主程序是完全独立的:只要在主程 ...

  8. linux ssh 应用

    linux 服务器 连接另一个linux服务器 ssh 用户名@IP地址 linux 服务器传输文件到另一个linux服务器 scp 文件名(可多个)  用户名@IP地址:传到的目录 /home

  9. Oracle RMAN 恢复数据库到不同主机(二)

    我们在recover database时报一个错误: RMAN-06054: media recovery requesting unknown archived log for thread 1 w ...

  10. CentOS7下安装NVIDIA独立显卡驱动出现X service error问题解决方法

    问题症状: 最近在CentOS7下安装NVIDIA独立显卡驱动的过程中出现X service error问题,如下图所示: 解决方法: 0.到NVIDIA 官网上下载驱动文件(.run 格式) : N ...