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)----防范端口扫描与嗅探
端口扫描与嗅探都是黑客常用的招数,其目的是定位目标计算机和窃取隐私信息.为确保自己计算机的安全,用户需要掌握防范嗅探与端口扫描的常见措施,保障个人隐私信息安全. 一.掌握防范端口扫描的常用措施 防范端 ...
随机推荐
- [luogu P4230]连环病原体
[luogu P4230] 连环病原体 题意 给定一个长度为 \(n\) 的边序列, 当这个序列的一个子区间内的边都加入图中时产生了环则称其为"加强区间", 求序列中的每条边在多少 ...
- Vmware Vcenter6.5 全新安装及群集配置介绍
转 Vmware Vcenter6.5 全新安装及群集配置介绍 2016年12月31日 14:27:12 ccitzy01 阅读数:97772 标签: vmware [摘要] VMwarevCen ...
- 3.Solr4.10.3目录结构
转载请出自出处:http://www.cnblogs.com/hd3013779515/ 1.整个目录结构 (1)bin:是脚本的启动目录 (2)contrib:第三方包存放的目录 (3)dist:编 ...
- canvas实例_时钟
效果图:是一个会动的时钟 一.时钟的组成 1.表盘(蓝色) 2.刻度(黑色) 3.时针(黑色) 4.分针(黑色) 5.秒针(红色)需美化 二.主要应用的技术 Canvas画线 Canv ...
- STM32学习之路-LCD(2)
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u011791262/article/details/27711881 这些天一直在研究LCD的初始化 ...
- 死磕nginx系列--配置文档解读
nginx配置文件主要分为四个部分: main(全局设置) http ( ) upstream(负载均衡服务器设置) server(主机设置) location(URL匹配特点位置的设置) serve ...
- Moleskine智能笔+专用本:写完随时传到手机
http://www.totiot.com/61805.html Moleskine公司生产的速写本和速写板一直是涂鸦爱好者和速记员们的首选.该公司还联合Adobe. Livescribe. Ever ...
- ERC 725 and ERC 735 的实现及关系
https://github.com/OriginProtocol/origin-playground 通过ERC 725 and ERC 735 的实现来说明它们到底是做什么的: 看了这个例子后才大 ...
- Java之Https请求
import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import ...
- OpenCV——膨胀与腐蚀