前言

最近有个小项目的需要,使用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. C# socket 发送图片和文件

    先说服务端:界面:如图: 界面设计源码 namespace SocketJPGToTxt { partial class Form1 { /// <summary> /// 必需的设计器变 ...

  2. 从MySQL slave system lock延迟说开去

    本文主要分析 sql thread中system lock出现的原因,但是笔者并明没有系统的学习过master-slave的代码,这也是2018年的一个目标,2018年我都排满了,悲剧.所以如果有错误 ...

  3. 176条DevOps人员常用的linux命令速查表

      线上查询及帮助命令 文件和目录操作命令 查看文件及内容处理命令 文件压缩及解压缩命令 信息显示命令 搜索文件命令 用户管理命令 基础网络操作命令 深入网络操作命令 有关磁盘与文件系统的命令 系统权 ...

  4. Cisco ASA 使用ASDM 配置管理口 方法

    CISCO ASA防火墙ASDM安装和配置 准备一条串口线一边接台式机或笔记本一边接防火墙的CONSOLE 接口,通过CRT或者超级终端连接ASA在用ASDM图形管理界面之前须在串口下输入一些命令开启 ...

  5. tomcat 闪退处理

    参考文章:https://www.cnblogs.com/lanjianhappy/p/6491436.html 首先确保JDK环境变量已经配置好! 设置jdk环境 变量:https://jingya ...

  6. October 11th 2017 Week 41st Wednesday

    If you don't know where you are going, you might not get there. 如果你不知道自己要去哪里,你可能永远到不了那里. The reward ...

  7. jsencrypt加密

    在登录时,前台页面的用户名.密码都是明文传输到后台的,漏洞扫描认为这样子不安全,就想到了前台js加密,后台解密的方法,要用到jsencrypt.js,具体代码如下: 前台页面: <!DOCTYP ...

  8. sql语句查询月份的数据

    在实际项目中,经常需要按月查询数据,在这里把我用到的sql整理一下,以便日后查看. 例如,查询当月的数据 ),addtime,)),) 查询结果: 查询上月的数据,需要用另一个sql函数,datead ...

  9. CSS3的新增选择器

    一.兄弟选择器:选择E元素所有兄弟元素F. <style> p~p{ color:#f00;} </style> </head> <body> < ...

  10. 【Java集合源代码剖析】ArrayList源代码剖析

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/mmc_maodun/article/details/35568011 转载请注明出处:http:// ...