前言

最近有个小项目的需要,使用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。

关键源代码

  1. //首先从命令行中读取线程数和配置文件路径
  2. //从配置文件中解析出ip和port
  3. //配置文件格式为
  4. // [ip]
  5. // 127.0.0.1
  6. // [port]
  7. // 22
  8. // 36000
  9. // 56000
  10. // 3306
  11. //根据开启的线程数对指定ip和端口进行tcp连接
  12. //如果端口开启,把ip:port按照格式返回
  13.  
  14. func Scanner(configFile string, functionid string, sendInfoFile string,limit int){
  15.  
  16. runtime.GOMAXPROCS(runtime.NumCPU())
  17. data, err := ioutil.ReadFile(configFile)
  18. portlist := make([]string,0,10)
  19.  
  20. if err != nil{
  21. log.Fatal(err)
  22. panic(err)
  23. }
  24.  
  25. ip_index := bytes.Index(data,[]byte("[ip]"))
  26.  
  27. port_index := bytes.Index(data,[]byte("[port]"))
  28.  
  29. if ip_index < 0{
  30.  
  31. Info.Println("文件格式有误: missing [ip]")
  32. return
  33. }
  34.  
  35. if port_index <0{
  36.  
  37. portlist = append(portlist,"22")
  38. portlist = append(portlist,"36000")
  39. portlist = append(portlist,"56000")
  40. portlist = append(portlist,"3306")
  41.  
  42. }else{
  43. reg_port := regexp.MustCompile(`\d+`)
  44. var ports [][]byte
  45.  
  46. if ip_index>port_index{
  47. ports = reg_port.FindAll(data[:ip_index],-1)
  48.  
  49. }else{
  50.  
  51. ports = reg_port.FindAll(data[port_index:],-1)
  52. }
  53.  
  54. for _,v := range(ports){
  55.  
  56. portlist = append(portlist,string(v))
  57.  
  58. }
  59.  
  60. }
  61.  
  62. 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)))`)
  63.  
  64. ips := reg_ip.FindAll(data,-1)
  65.  
  66. input := make(chan []byte, len(ips))
  67.  
  68. result := make(chan string, len(ips))
  69.  
  70. defer close(input)
  71. defer close(result)
  72.  
  73. for _, v := range(ips){
  74. input <- v
  75. }
  76. //控制多少并发
  77. for i:=0; i<limit;i++{
  78. //这个时候可以启动扫描函数
  79. go ScanPort(portlist,input,result)
  80. }
  81.  
  82. for i :=0; i< len(ips);i++{
  83.  
  84. //将扫描的结果输出
  85. ip_result,ok:= <-result
  86.  
  87. if !ok {
  88. break;
  89. }
  90.  
  91. }
  92.  
  93. }
  94.  
  95. func ScanPort(portlist []string,intput chan []byte,result chan string ) {
  96.  
  97. for{
  98. task,ok := <-intput
  99.  
  100. if !ok{
  101.  
  102. return
  103. }
  104. ip := string(task)
  105. Info.Println("scaning ",ip,"port",portlist)
  106. port_str :=""
  107. for i:=0; i<len(portlist); i++{
  108. _, err := net.DialTimeout("tcp", ip+":"+portlist[i], time.Second*3)
  109.  
  110. if err != nil{
  111. continue
  112. }
  113. port_str+=portlist[i]+" "
  114.  
  115. }
  116.  
  117. if len(port_str) >0{
  118. //说明有打开的端口
  119. // Info.Println(ip+":"+port_str+"open")
  120. result <- ip+"----"+"1"+"----"+"open port:"+port_str
  121.  
  122. }else{
  123.  
  124. result <- ip+"----"+"0"+"----"+"ok"
  125. }
  126.  
  127. }
  128.  
  129. }

 

最后

关注公众号:七夜安全博客

  • 回复【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. [luogu P4230]连环病原体

    [luogu P4230] 连环病原体 题意 给定一个长度为 \(n\) 的边序列, 当这个序列的一个子区间内的边都加入图中时产生了环则称其为"加强区间", 求序列中的每条边在多少 ...

  2. Vmware Vcenter6.5 全新安装及群集配置介绍

    转 Vmware Vcenter6.5 全新安装及群集配置介绍 2016年12月31日 14:27:12 ccitzy01 阅读数:97772 标签: vmware   [摘要] VMwarevCen ...

  3. 3.Solr4.10.3目录结构

    转载请出自出处:http://www.cnblogs.com/hd3013779515/ 1.整个目录结构 (1)bin:是脚本的启动目录 (2)contrib:第三方包存放的目录 (3)dist:编 ...

  4. canvas实例_时钟

    效果图:是一个会动的时钟 一.时钟的组成 1.表盘(蓝色)  2.刻度(黑色)  3.时针(黑色)  4.分针(黑色)  5.秒针(红色)需美化     二.主要应用的技术 Canvas画线 Canv ...

  5. STM32学习之路-LCD(2)

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u011791262/article/details/27711881 这些天一直在研究LCD的初始化 ...

  6. 死磕nginx系列--配置文档解读

    nginx配置文件主要分为四个部分: main(全局设置) http ( ) upstream(负载均衡服务器设置) server(主机设置) location(URL匹配特点位置的设置) serve ...

  7. Moleskine智能笔+专用本:写完随时传到手机

    http://www.totiot.com/61805.html Moleskine公司生产的速写本和速写板一直是涂鸦爱好者和速记员们的首选.该公司还联合Adobe. Livescribe. Ever ...

  8. ERC 725 and ERC 735 的实现及关系

    https://github.com/OriginProtocol/origin-playground 通过ERC 725 and ERC 735 的实现来说明它们到底是做什么的: 看了这个例子后才大 ...

  9. Java之Https请求

    import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import ...

  10. OpenCV——膨胀与腐蚀