golang高性能端口扫描
前言
最近有个小项目的需要,使用golang写了个端口扫描工具,不得不说golang的效率确实比python快的太多了。在使用一段时间golang之后,感觉有三个方面是优于python的:
一个方面是性能优越
第二方面是兼容性好
第三方面是可以跨平台编译成本地二进制文件,发布项目很方便。
接下来我把这个工具的源代码,以及使用方式给大家给大家分享一下。
PortScan
工具名称:PortScan
采用Go语言开发,支持从config.txt文件中读取目的ip和端口,对指定的目的服务器进行端口扫描
config.txt支持配置端口列表,默认为22、36000、56000、3306
在服务器上连接目的服务器端口,仅做一次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】:领取 人工智能数学基础 教程
golang高性能端口扫描的更多相关文章
- ★Kali信息收集★8.Nmap :端口扫描
★Kali信息收集~ 0.Httrack 网站复制机 http://www.cnblogs.com/dunitian/p/5061954.html ★Kali信息收集~ 1.Google Hackin ...
- Python3实现TCP端口扫描
在渗透测试的初步阶段通常我们都需要对攻击目标进行信息搜集,而端口扫描就是信息搜集中至关重要的一个步骤.通过端口扫描我们可以了解到目标主机都开放了哪些服务,甚至能根据服务猜测可能存在某些漏洞. TCP端 ...
- 端口扫描base
#coding:utf8 import os import socket import sys def IsOpen(ip,port): s = socket.socket(socket.AF_INE ...
- Android NDK学习之第一个实例---端口扫描
为什么要写一个端口扫描的程序,Java来写不是很方便吗?因为我也没有想到什么例子能够方便的来练习.于是想到以前找到的端口扫描的C代码,于是想用他们来练习.扫描服务端端口的方式有许多种,最简单的就是直接 ...
- 端口扫描之王——nmap入门精讲(一)
端口扫描在百度百科上的定义是: 端口扫描是指某些别有用心的人发送一组端口扫描消息,试图以此侵入某台计算机,并了解其提供的计算机网络服务类型(这些网络服务均与端口号相关),但是端口扫描不但可以为黑客所利 ...
- 使用Metasploit进行端口扫描
Metasploit中不仅能够使用第三方扫描器Nmap等,在其辅助模块中也包含了几款内建的端口扫描器. 查看Metasploit框架提供的端口扫描工具: msf > search portsca ...
- 小白日记10:kali渗透测试之端口扫描-UDP、TCP、僵尸扫描、隐蔽扫描
端口扫描 二三四层发现的目的只是为了准确发现所有活着主机IP,确定攻击面,端口扫描即发现攻击点,发现开放端口.端口对应网络服务及应用端程序,服务端程序的漏洞通过端口攻入.[所有的扫描结果,都不要完全相 ...
- 『安全工具』Nmap 强悍的端口扫描工具
作为时下流行的端口扫描工具,Nmap有因其扫描的隐密性有“端口扫描之王”之称 上图是黑客帝国(The Matrix)中崔妮蒂用Nmap入侵核发电站的能源管理系统 0x 01 Nmap介绍 Nmap是一 ...
- Hacker(16)----防范端口扫描与嗅探
端口扫描与嗅探都是黑客常用的招数,其目的是定位目标计算机和窃取隐私信息.为确保自己计算机的安全,用户需要掌握防范嗅探与端口扫描的常见措施,保障个人隐私信息安全. 一.掌握防范端口扫描的常用措施 防范端 ...
随机推荐
- python常用模块之subprocess
python常用模块之subprocess python2有个模块commands,执行命令的模块,在python3中已经废弃,使用subprocess模块来替代commands. 介绍一下:comm ...
- Mysql使用优化之处(转)
1 开启事务之前需要rollback 连接句柄.(清理垃圾)2 mysql_ping 失败,程序需要处理重连逻辑:3 mysql_query()执行的SQL语句是一个以‘/0’结尾的字符串,而mysq ...
- AD用户移除所属组
AD用户移除所属组: $Membership = Get-ADPrincipalGroupMembership $Users $Membership.distinguishedName Remove- ...
- Linux查看系统负载(CPU和MEM考虑)
查看占用CPU最高的10个进程 [tidb@:vg_adn_tidbCkhsTest:| head mysql ? Sl Nov22 : /usr/local/mysql/bin/mysqld --b ...
- 如何删除sharepoint列表List中的全部数据。
可以使用excel,但是powershell会比较方便 (admin mode - Sharepoint powershell) [System.reflection.Assembly]::LoadW ...
- [luogu T71973]卡常者π酱
[luogu T71973]卡常者π酱 题意 给定一个长度为 \(n\) 的字符串, 要求将字符串分割为若干段, 每一段要么是一个字符要么是前面几段的并的子串. 如果某一段是一个单独字符, 则产生 \ ...
- Jenkins 在mac平台的安装与配置
1. 安装: 强烈推荐直接下载war包方式安装,方便修改项目工作目录.首先确保电脑上安装了java,接着下载tomcat(任意版本).将tomcat安装在任意想要的目录,然后下载jenkins war ...
- Gitkraken的使用
一个优秀的团队合作离不开git,一个优秀的程序员也离不开git.gitkraken是我在进行软工实践这门课接触到的git的UI界面的工具,它给我留下的印象就是非常好用和方便 怎么个方便法呢? 方便的安 ...
- [python] 列表解析式的高效与简洁
方法一(列表解析式): list1 = ["abc","efg","hij"] list2 = [i[0] for i in list1] ...
- 【Ansible 文档】【译文】Ad-Hoc 命令介绍
Introduction To Ad-Hoc Commands Ad-Hoc命令介绍 下面的例子展示了如何使用 /usr/bin/ansible 来运行ad hoc任务. 什么是ad hoc命令? 一 ...