golang快速扫描
利用golang的并发优势快速扫描端口
Scanner startIp [endIp] port thread
package main import ( "flag" "fmt" "net" "os" "strconv" "strings"
) /**
扫描地址
*/
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")
}
golang快速扫描相关推荐
- 存储型xss漏洞怎么解决_FinDOMXSS:一款针对DOM型XSS漏洞的快速扫描工具
FinDOM-XSS FinDOM-XSS是一款针对DOM型XSS漏洞的快速扫描工具,广大安全研究人员可以利用FinDOM-XSS快速地发现/扫描出目标应用中潜在的DOM型XSS漏洞. 工具安装 广大 ...
- 优缺点 快速扫描 硬盘监测_机械硬盘坏道如何检测与修复?看完这篇你就知道了...
电脑硬盘使用几年之后,特别是经常不正确关闭计算机(非法关机)的用户,如果出现电脑不明原因卡顿.经常提示系统文件丢失.蓝屏等故障,说明电脑硬盘已经出现逻辑坏道了,如果发现得早,是可以利用硬盘管理工具Di ...
- 【Golang 快速入门】项目实战:即时通信系统
Golang 快速入门 即时通信系统 - 服务端 版本一:构建基础 Server 版本二:用户上线功能 版本三:用户消息广播机制 版本四:用户业务层封装 版本五:在线用户查询 版本六:修改用户名 版本 ...
- 【Golang 快速入门】高级语法:反射 + 并发
Golang 快速入门 Golang 进阶 反射 变量内置 Pair 结构 reflect 结构体标签 并发知识 基础知识 早期调度器的处理 GMP 模型 调度器的设计策略 并发编程 goroutin ...
- 使用 arp-scan 快速扫描局域网 IP -> raspberry pi ssh vnc
简介 在使用 ssh/vnc 对树莓派进行远程操作的时候,都需要获取树莓派的 IP.常见的办法是路由器管理页面或者使用 Advanced IP Scanner.但是我既没有路由器,也没搞懂这个软件怎么 ...
- 端口扫描程序 快速扫描 多线程、范围端口、范围IP、查看历史记录 Windows/MacOS
支持平台 Windows7.Windows8.Windows10.MacOS10.15以上(MacOS10.15以下会有权限问题) 简介 设计思路: 1.对指定IP段的端口进行扫描. 2.基于多线程, ...
- 【检测工具】奇安信CVE-2020-0796快速扫描检测工具使用手册
奇安信 CVE-2020-0796 漏洞快速扫描检测工具是奇安信公司针对"Microsoft SMBv3 远程代码执行漏洞 CVE-2020-0796"推出的一款远程扫描工具. 一 ...
- 使用 Python 快速扫描局域网中活动的 IP
部分数据来源:ChatGPT 本文仅用于信息安全的学习,请遵守相关法律法规,严禁用于非法途径.若观众因此作出任何危害网络安全的行为,后果自负,与本人无关. 简介 如果你需要在局域网中查找活动的 IP ...
- golang快速入门[8.3]-深入理解IEEE754浮点数
前文 golang快速入门[1]-go语言导论 golang快速入门[2.1]-go语言开发环境配置-windows golang快速入门[2.2]-go语言开发环境配置-macOS golang快速 ...
最新文章
- 地图与定位之大头针视图
- 基于外卖评论的舆情风控
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(51)-系统升级
- Realme真我X7系列首发骁龙860? 副总裁辟谣:大家散了吧
- 2020-5-9 开始阅读深入理解java虚拟机
- 公基会考计算机知识,公基计算机基础知识汇总70.doc
- 更新管理器_Excel2016数据透视表06:名称管理器实现透视表的动态更新
- ACM新手入门之杭电150题使用指南及C语言学习推荐
- maikr博客伴侣全新发布,支持博客备份和博客搬家
- 3DGIS合伙人招募
- win7计算机管理员与超级,win7系统家庭版开启Administrator超级管理员帐户的详细技巧...
- 小程序---验证input输入不能为空
- UE4快速实现涂鸦功能
- Buy and Resell(贪心好题!)
- web常用模块测试用例
- txt文本的魔数到底是多少
- MATLAB中的快速傅里叶变换FFT与IFFT
- 【系】微信小程序云开发实战坚果商城-扩展篇
- Today is a special day
- Uniapp——使用安卓原生插件