go语言制作端口扫描器

| 收藏本文 下载本文 作者:诚域油画

下面就是小编整理的go语言制作端口扫描器(共含5篇),希望大家喜欢。同时,但愿您也能像本文投稿人“诚域油画”一样,积极向本站投稿分享好文章。

go语言制作端口扫描器

篇1:go语言制作端口扫描器

本文给大家分享的是使用go语言编写的TCP端口扫描器,可以选择IP范围,扫描的端口,以及多线程,有需要的小伙伴可以参考下,

GO语言编写的TCP端口扫描器,本人的第一个GO程序。

Git@OSC:git.oschina.net/youshusoft/GoScanner

使用命令:

Scanner startIp [endIp] port thread

参数说明:

startIp 开始IP

endIp 结束IP,可选,不输入表示只扫描startIp

port 扫描端口,单个端口:3389;多个端口:1433,3389;连续端口:135-3389

thread 最大并发线程数,最高2048

扫描结果保存在同目录下的 result.txt 中,每次启动都会清掉之前的内容。

例子一:

Scanner 58.96.172.22 58.96.172.220 80 512

扫描58.96.172.22到58.96.172.220中的80端口,最大并发线程512。

例子二:

Scanner 58.96.172.22 58.96.172.220 21,5631 512

扫描58.96.172.22到58.96.172.220中的21和5631端口,最大并发线程512。

例子三:

Scanner 58.96.172.22 58.96.172.220 1-520 512

扫描58.96.172.22到58.96.172.220中的1到520端口,最大并发线程512。

例子四:

Scanner 58.96.172.22 1-520 512

扫描58.96.172.22中的1到520端口,最大并发线程512。

package mainimport (“fmt”“strconv”“flag”“strings”“net”“os”)/** 扫描地址*/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;}//获取下一个IPfunc 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{//+1n++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”)}

以上所述就是本文的全部内容了,希望大家能够喜欢,

篇2:GO语言实现的端口扫描器

这篇文章主要介绍了GO语言实现的端口扫描器分享,本文直接给出实现代码,代码中包含大量注释,需要的朋友可以参考下

代码如下:

//GO语言 实现端口扫描

//缺陷

//port 无法设置成全局变量不知道怎么设置的

//var l = list.New()  这个是数组操作并不是消息队列   跟消息队列功能类似

//实现功能

//实现生成 IP段

//实现端口扫描

//实现参数传入

//写入文件到本地

//main.go 58.215.20.30 58.215.201.30 80

//文件名 开始IP 结束IP 扫描端口

//QQ29295842  希望认识更多的朋友技术交流

//QQ群367196336  go  golang WEB安全开发

package main

import (

“container/list”

“fmt”

“net”

“os”

“strconv”

“strings”

“time”

)

func ip2num(ip string) int {

canSplit := func(c rune) bool { return c == ‘.‘ }

lisit := strings.FieldsFunc(ip, canSplit) //[58 215 20 30]

//fmt.Println(lisit)

ip1_str_int, _ := strconv.Atoi(lisit[0])

ip2_str_int, _ := strconv.Atoi(lisit[1])

ip3_str_int, _ := strconv.Atoi(lisit[2])

ip4_str_int, _ := strconv.Atoi(lisit[3])

return ip1_str_int<<24 | ip2_str_int<<16 | ip3_str_int<<8 | ip4_str_int

}

func num2ip(num int) string {

ip1_int := (num & 0xff000000) >>24

ip2_int := (num & 0x00ff0000) >>16

ip3_int := (num & 0x0000ff00) >>8

ip4_int := num & 0x000000ff

//fmt.Println(ip1_int)

data := fmt.Sprintf(“%d.%d.%d.%d”, ip1_int, ip2_int, ip3_int, ip4_int)

return data

}

func gen_ip(Aip1 int, Aip2 int) {

index := Aip1

for index < Aip2 {

//fmt.Println(num2ip(index))

// 入队, 压栈

ip_data := num2ip(index)

//fmt.Println(ip_data)

l.PushBack(ip_data)

index++

}

}

func text_add(name string, data string) { //向文件中写入数据  text_add(“file2.txt”, “qqqqqqqqqqqqqqqqqqqqqqq”)

f, err := os.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0x644)

if err != nil {

panic(err)

}

defer f.Close()

_, err = f.WriteString(data)

_, err = f.WriteString(“\r\n”)

if err != nil {

panic(err)

}

}

//text_add(“file2.txt”, “qqqqqqqqqqqqqqqqqqqqqqq”)

var l = list.New()

func socket_ip(host string, port string) bool {

var (

remote = host + “:” + port

)

tcpAddr, _ := net.ResolveTCPAddr(“tcp4”, remote) //转换IP格式

//fmt.Printf(“%s”, tcpAddr)

conn, err := net.DialTCP(“tcp”, nil, tcpAddr) //查看是否连接成功

if err != nil {

fmt.Printf(“no==%s:%s\r\n”, host, port)

return false

}

defer conn.Close()

fmt.Printf(“ok==%s:%s\r\n”, host, port)

return true

}

func for_ip(port string) {

now := time.Now()

year, mon, day := now.UTC().Date()

file_name := fmt.Sprintf(“%d-%d-%d_%s”, year, mon, day, port)

for { //死循环

if l.Len() <= 0 {

fmt.Println(“跳出循环”)

break //#跳出

}

// 出队 从前读取

i1 := l.Front()

l.Remove(i1)

IP, _ := i1.Value.(string)

if socket_ip(IP, port) {

//OK

//获取当前 日期作为文件名 在把IP写入进去

text_add(file_name+“_ok.txt”, IP)

} //else {

// text_add(file_name+“_no.txt”, IP)

// }

time.Sleep(time.Millisecond * 500) //纳秒为单位

}

}

func main() {

argsLen := len(os.Args)

//fmt.Println(argsLen)

if argsLen != 4 {

fmt.Println(“main.go 58.215.20.30 58.215.201.30 80”)

} else {

gen_ip(ip2num(os.Args[1]), ip2num(os.Args[2]))

for index := 0; index < 200; index++ {

go for_ip(os.Args[3])

}

for {

time.Sleep(1 * time.Second) //纳秒为单位

}

}

}

篇3:Linux C语言写的超级简单端口扫描器linux操作系统

本文章来给各位同学介绍关于 Linux C语言写的超级简单端口扫描器,希望方法对各位同学有帮助,

代码如下复制代码#include

#include

#include

#include

#include

#include

#include

void msg

{

printf(“EP:scan ip startport endportnEP:scan ip 127.0.0.1 20 n”);

}

int main(int argc,char** argv)

{

char *ip;

int startport,endport,sockfd,i;

struct sockaddr_in to;

float costtime;

clock_t start,end;

if(4!=argc)

{

msg();

return 0;

}

ip=argv[1];

startport=atoi(argv[2]);

endport=atoi(argv[3]);

if(startport<1 || endport>65535 || endport

篇4:go语言制作一个gif动态图

这篇文章主要介绍了go制作一个gif动态图的相关资料,需要的朋友可以参考下

如题,关键不是图怎么样,而是说,go可以拿来实现动态图验证码,加上go支持cgi、fcgi,完全可以做个exe拿去增补现有的服务器么,

ball.go

package mainimport ( “github.com/hydra13142/cube” “github.com/hydra13142/geom” “github.com/hydra13142/paint” “image” “image/color/palette” “image/gif” “math” “os”)var ( pln *cube.Plain unx cube.Vector uny cube.Vector)const ( H = 18 W = 36)func init() { pln, _ = cube.NewPlain(cube.Point{}, cube.Vector{4, 4, 3}) uny = cube.FromTo(cube.Point{}, pln.VerticalPoint(cube.Point{0, 0, 10})).Unit() unx = cube.OuterProduct(uny, cube.Vector{4, 4, 3}).Unit()}func main() { var x [H + 1][W]cube.Point var y [H + 1][W]geom.Point dz := math.Pi / H dxy := math.Pi * 2 / W for i := 0; i <= H; i++ { az := float64(i)*dz - math.Pi/2 r := 140 * math.Cos(az) z := 140 * math.Sin(az) for j := 0; j < W; j++ {axy := float64(j) * dxyx[i][j] = cube.Point{math.Cos(axy) * r, math.Sin(axy) * r, z} } } pics := make([]*image.Paletted, 0, 20) img := paint.Image{ FR: paint.Green, BG: paint.White, } stp := dxy / 20 delay := make([]int, 0, 20) for t := 0; t < 20; t++ { img.Image = image.NewPaletted(image.Rect(0, 0, 300, 300), palette.Plan9) for i := 0; i <= H; i++ {for j := 0; j < W; j++ { ox := cube.FromTo(cube.Point{}, x[i][j]) y[i][j] = geom.Point{cube.InnerProduct(ox, unx), cube.InnerProduct(ox, uny)} a, b := x[i][j].X, x[i][j].Y x[i][j].X = a*math.Cos(stp) - b*math.Sin(stp) x[i][j].Y = b*math.Cos(stp) + a*math.Sin(stp)} } for i := 0; i < H; i++ {for j := 0; j < W; j++ { img.Line( 150+int(y[i][j].X), 150-int(y[i][j].Y), 150+int(y[i][(j+1)%W].X), 150-int(y[i][(j+1)%W].Y), ) img.Line( 150+int(y[i][j].X), 150-int(y[i][j].Y), 150+int(y[i+1][j].X), 150-int(y[i+1][j].Y), )} } pics = append(pics, img.Image.(*image.Paletted)) delay = append(delay, 5) } file, _ := os.Create(“ball.gif”) defer file.Close() gif.EncodeAll(file, &gif.GIF{ Image: pics, Delay: delay, LoopCount: 5 * len(delay), })}

woniu.go

package mainimport ( “github.com/hydra13142/cube” “github.com/hydra13142/geom” “github.com/hydra13142/paint” “image” “image/color/palette” “image/gif” “math” “os”)var ( pln *cube.Plain unx, uny cube.Vector)const ( H = 18 W = 96)func init() { pln, _ = cube.NewPlain(cube.Point{}, cube.Vector{2, 2, 1}) uny = cube.FromTo(cube.Point{}, pln.VerticalPoint(cube.Point{0, 0, 10})).Unit() unx = cube.OuterProduct(uny, cube.Vector{2, 2, 1}).Unit()}func main() { var x [H + 1][W]cube.Point var y [H + 1][W]geom.Point dz := math.Pi / H dxy := math.Pi * 4 / W for i := 0; i <= H; i++ { az := float64(i)*dz - math.Pi/2 r := 300 * math.Cos(az) z := 100 * math.Sin(az) for j := 0; j < W; j++ {axy := float64(j) * dxyR := float64(j) * r / Wx[i][j] = cube.Point{math.Cos(axy) * R, math.Sin(axy) * R, z} } } pics := make([]*image.Paletted, 0, 20) img := paint.Image{ FR: paint.Green, BG: paint.White, } stp := math.Pi / W delay := make([]int, 0, 2*W) for t := 0; t < 2*W; t++ { img.Image = image.NewPaletted(image.Rect(0, 0, 600, 300), palette.Plan9) for i := 0; i <= H; i++ {for j := 0; j < W; j++ { ox := cube.FromTo(cube.Point{}, x[i][j]) y[i][j] = geom.Point{cube.InnerProduct(ox, unx), cube.InnerProduct(ox, uny)} a, b := x[i][j].X, x[i][j].Y x[i][j].X = a*math.Cos(stp) - b*math.Sin(stp) x[i][j].Y = b*math.Cos(stp) + a*math.Sin(stp)} } img.Line(300+int(y[0][0].X),150-int(y[0][0].Y),300+int(y[H][0].X),150-int(y[H][0].Y), ) for i := 0; i < H; i++ {for j := 1; j < W; j++ { img.Line( 300+int(y[i][j].X), 150-int(y[i][j].Y), 300+int(y[i][j-1].X), 150-int(y[i][j-1].Y), ) img.Line( 300+int(y[i][j].X), 150-int(y[i][j].Y), 300+int(y[i+1][j].X), 150-int(y[i+1][j].Y), )} } pics = append(pics, img.Image.(*image.Paletted)) delay = append(delay, 5) } file, _ := os.Create(“woniu.gif”) defer file.Close() gif.EncodeAll(file, &gif.GIF{ Image: pics, Delay: delay, LoopCount: 5 * len(delay), })}

rotate.go

package mainimport ( “github.com/hydra13142/cube” “github.com/hydra13142/geom” “github.com/hydra13142/paint” “image” “image/color/palette” “image/gif” “math” “os”)var ( pln *cube.Plain unx, uny cube.Vector)const ( H = 9 W = 36)func init() { pln, _ = cube.NewPlain(cube.Point{}, cube.Vector{4, 4, 3}) uny = cube.FromTo(cube.Point{}, pln.VerticalPoint(cube.Point{0, 0, 10})).Unit() unx = cube.OuterProduct(uny, cube.Vector{4, 4, 3}).Unit()}func main() { var x [H*W + 1]cube.Point var y [H*W + 1]geom.Point dxy := (math.Pi * 2) / W dz := math.Pi / H for i := 0; i <= H*W; i++ { az := float64(i)*dz/W - math.Pi/2 r := 140 * math.Cos(az) z := 140 * math.Sin(az) axy := float64(i) * dxy x[i] = cube.Point{math.Cos(axy) * r, math.Sin(axy) * r, z} } pics := make([]*image.Paletted, 0, 20) img := paint.Image{ FR: paint.Green, BG: paint.White, } stp := math.Pi * 2 / (W * 3) delay := make([]int, 0, 3*W) for t := 0; t < 3*W; t++ { img.Image = image.NewPaletted(image.Rect(0, 0, 300, 300), palette.Plan9) for i := 0; i <= H*W; i++ {ox := cube.FromTo(cube.Point{}, x[i])y[i] = geom.Point{cube.InnerProduct(ox, unx), cube.InnerProduct(ox, uny)}a, b := x[i].X, x[i].Zx[i].X = a*math.Cos(stp) - b*math.Sin(stp)x[i].Z = b*math.Cos(stp) + a*math.Sin(stp) } img.Line(150+int(y[0].X),150-int(y[0].Y),150+int(y[H*W].X),150-int(y[H*W].Y), ) for i := 0; i < H*W; i++ {img.Line( 150+int(y[i].X), 150-int(y[i].Y), 150+int(y[i+1].X), 150-int(y[i+1].Y),) } pics = append(pics, img.Image.(*image.Paletted)) delay = append(delay, 8) } file, _ := os.Create(“rotate.gif”) defer file.Close() gif.EncodeAll(file, &gif.GIF{ Image: pics, Delay: delay, LoopCount: 5 * len(delay), })}

以上就是本文的全部内容了,希望大家能够喜欢,

篇5:go语言制作的zip压缩程序

这篇文章主要介绍了go语言制作的zip压缩程序,其主体思路是首先创建一个读写缓冲,然后用压缩器包装该缓冲,用Walk方法来将所有目录下的文件写入zip,有需要的小伙伴参考下,

可以压缩文件和目录。

package mainimport ( “archive/zip” “bytes” “fmt” “io/ioutil” “os” “path/filepath”)func main() { if err := compress(`gopkg`, `gopkg.zip`); err != nil { fmt.Println(err) }}// 参数frm可以是文件或目录,不会给dst添加.zip扩展名func compress(frm, dst string) error { buf := bytes.NewBuffer(make([]byte, 0, 10*1024*1024)) // 创建一个读写缓冲 myzip := zip.NewWriter(buf) // 用压缩器包装该缓冲 // 用Walk方法来将所有目录下的文件写入zip err := filepath.Walk(frm, func(path string, info os.FileInfo, err error) error { var file []byte if err != nil {return filepath.SkipDir } header, err := zip.FileInfoHeader(info) // 转换为zip格式的文件信息 if err != nil {return filepath.SkipDir } header.Name, _ = filepath.Rel(filepath.Dir(frm), path) if !info.IsDir() {// 确定采用的压缩算法(这个是内建注册的deflate)header.Method = 8file, err = ioutil.ReadFile(path) // 获取文件内容if err != nil { return filepath.SkipDir} } else {file = nil } // 上面的部分如果出错都返回filepath.SkipDir // 下面的部分如果出错都直接返回该错误 // 目的是尽可能的压缩目录下的文件,同时保证zip文件格式正确 w, err := myzip.CreateHeader(header) // 创建一条记录并写入文件信息 if err != nil {return err } _, err = w.Write(file) // 非目录文件会写入数据,目录不会写入数据 if err != nil { // 因为目录的内容可能会修改return err // 最关键的是我不知道咋获得目录文件的内容 } return nil }) if err != nil { return err } myzip.Close() // 关闭压缩器,让压缩器缓冲中的数据写入buf file, err := os.Create(dst) // 建立zip文件 if err != nil { return err } defer file.Close() _, err = buf.WriteTo(file) // 将buf中的数据写入文件 if err != nil { return err } return nil}

以上所述就是本文的全部内容了,希望大家能够喜欢,

Go语言实现选择法排序实例

妈妈的“扫描器”

go是什么意思

与go的短语

Go to the Bookshop 去书店

go的短语爱好

Go语言服务器开发之简易TCP客户端与服务端实现方法

开放防火墙端口的基本步骤

教你如何通过135端口入侵

go的短语搭配初中

go语言制作端口扫描器(共5篇)

欢迎下载DOC格式的go语言制作端口扫描器,但愿能给您带来参考作用!
推荐度: 推荐 推荐 推荐 推荐 推荐
点击下载文档 文档为doc格式

猜你喜欢

NEW
点击下载本文文档