当前位置: 首页 > article >正文

使用go语言进行端口扫描

端口扫描的原理:

端口扫描的核心原理是基于 TCP 协议的三次握手过程。当你尝试连接一个端口时,操作系统会通过 TCP 三次握手来建立连接。如果目标端口响应了握手请求(即返回 SYN-ACK 响应),则可以认为该端口是开放的;如果没有响应,或者连接超时,则认为端口是关闭的。
GO语言和Python语言都是写脚本的最佳选择,这里使用了go语言简单的写了一个端口扫描脚本。

package main

import (
	"fmt"
	"net"
	"os"
	"sync"
	"time"
)

// checkPort 函数用于检查指定 IP 地址和端口是否开放
func checkPort(ip net.IP, port int, wg *sync.WaitGroup, ch chan string, timeout chan string) {
	defer wg.Done() // 确保协程结束时,调用 Done() 函数,表示任务完成
	address := fmt.Sprintf("%s:%d", ip.String(), port)
	// 尝试连接目标 IP 和端口,连接超时时间为 20 秒
	conn, err := net.DialTimeout("tcp", address, 20*time.Second)
	if err != nil {
		// 如果连接失败,则返回(即此端口未开放)
		return
	}
	conn.Close()
	ch <- fmt.Sprintf("端口 %d 开放", port)
}

// checkIp 函数用于验证传入的 IP 地址是否合法
func checkIp(ip string) bool {
	// 解析字符串 IP 地址
	parsedIp := net.ParseIP(ip)
	// 如果解析失败,则说明 IP 地址无效
	if parsedIp == nil {
		fmt.Println("非法ip地址")
		return false
	}
	return true
}

func main() {
	// 检查命令行参数是否包含目标 IP 地址
	if len(os.Args) < 2 {
		fmt.Println("请输入目标 IP 地址")
		return
	}
	// 获取命令行中的 IP 地址
	ip := os.Args[1]
	if !checkIp(ip) {
		return
	}
	//声明一个 WaitGroup 用于等待所有 goroutine线程 执行完毕
	var wg sync.WaitGroup
	ch := make(chan string)
	timeout := make(chan string)
	start := time.Now()
	// 启动多个 goroutine 来检查 1 到 100000 之间的端口
	for port := 1; port <= 100000; port++ {
		// 每启动一个 goroutine,WaitGroup 的计数器加 1
		wg.Add(1)
		// 启动一个 goroutine 来检查该端口
		go checkPort(net.ParseIP(ip), port, &wg, ch, timeout)
	}

	// 启动一个 goroutine,在所有端口扫描完成后关闭 channels
	go func() {
		wg.Wait()     
		close(ch)     
		close(timeout)
	}()

	// 从 ch channel 中读取扫描结果并输出
	for msg := range ch {
		fmt.Println(msg) // 输出端口开放的消息
	}
	fmt.Println("扫描完成,耗时:", time.Since(start))
}

执行结果

在这里插入图片描述


http://www.kler.cn/a/409650.html

相关文章:

  • Linux应用编程(C语言编译过程)
  • Spring Boot项目集成Redisson 原始依赖与 Spring Boot Starter 的流程
  • Java 8 Stream API 在数据转换中的应用 —— 将列表转换为映射
  • 【FPGA开发】Vivado自定义封装IP核,绑定总线
  • 数据库-基础理论
  • C0034.在Ubuntu中安装的Qt路径
  • YOLOv8-ultralytics-8.2.103部分代码阅读笔记-tasks.py
  • 【JavaEE】Maven的介绍及配置
  • Flutter:启动屏逻辑处理02:启动页
  • 【从0学英语】字母发音指南:一套掌握所有字母的发音组合
  • NFS文件服务器
  • 基于开源 AI 智能名片 2+1 链动模式 S2B2C 商城小程序源码的社交新零售利益共同体构建与发展研究
  • Altium Designer学习笔记 21.PCB板框的评估及叠层设置
  • 视频监控实现画面缩放功能
  • 【数据结构-队列】力扣622. 设计循环队列
  • java-加密算法
  • 掌握 Vue key:剖析其原理及与无 key 的区别
  • 【Hive是什么?】Hadoop和Hive是什么关系?Hive在Hadoop上是怎么运行的?用大白话理解Hive和Hadoop的关系。
  • 亚马逊IP关联是什么?我们该怎么解决呢?
  • 【Leetcode Top 100】240. 搜索二维矩阵 II
  • 电脑无故提示提示“MSVCP140.dIl”文件丢失的原因以及六大解决方法!
  • Python入门(13)--并发编程
  • 银行卡OCR 识别 API 接口的影响因素分析
  • C++ —— 以真我之名 如飞花般绚丽 - 智能指针
  • python继承和反射
  • 今天你学C++了吗?——C++中的类与对象(第二集)