GO語言實(shí)現(xiàn)的端口掃描器分享
//GO語言 實(shí)現(xiàn)端口掃描
//缺陷
//port 無法設(shè)置成全局變量不知道怎么設(shè)置的
//var l = list.New() 這個(gè)是數(shù)組操作并不是消息隊(duì)列 跟消息隊(duì)列功能類似
//實(shí)現(xiàn)功能
//實(shí)現(xiàn)生成 IP段
//實(shí)現(xiàn)端口掃描
//實(shí)現(xiàn)參數(shù)傳入
//寫入文件到本地
//main.go 58.215.20.30 58.215.201.30 80
//文件名 開始IP 結(jié)束IP 掃描端口
//QQ29295842 希望認(rèn)識(shí)更多的朋友技術(shù)交流
//QQ群367196336 go golang WEB安全開發(fā)
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))
// 入隊(duì), 壓棧
ip_data := num2ip(index)
//fmt.Println(ip_data)
l.PushBack(ip_data)
index++
}
}
func text_add(name string, data string) { //向文件中寫入數(shù)據(jù) 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) //轉(zhuǎn)換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 { //死循環(huán)
if l.Len() <= 0 {
fmt.Println("跳出循環(huán)")
break //#跳出
}
// 出隊(duì) 從前讀取
i1 := l.Front()
l.Remove(i1)
IP, _ := i1.Value.(string)
if socket_ip(IP, port) {
//OK
//獲取當(dāng)前 日期作為文件名 在把IP寫入進(jìn)去
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) //納秒為單位
}
}
}
相關(guān)文章
golang獲取prometheus數(shù)據(jù)(prometheus/client_golang包)
本文主要介紹了使用Go語言的prometheus/client_golang包來獲取Prometheus監(jiān)控?cái)?shù)據(jù),具有一定的參考價(jià)值,感興趣的可以了解一下2025-03-03
Golang根據(jù)job數(shù)量動(dòng)態(tài)控制每秒?yún)f(xié)程的最大創(chuàng)建數(shù)量方法詳解
這篇文章主要介紹了Golang根據(jù)job數(shù)量動(dòng)態(tài)控制每秒?yún)f(xié)程的最大創(chuàng)建數(shù)量方法2024-01-01
解決Go中攔截HTTP流數(shù)據(jù)時(shí)字段丟失的問題
在開發(fā)高并發(fā)的Web應(yīng)用時(shí),尤其是在處理HTTP代理和流數(shù)據(jù)攔截的場(chǎng)景下,遇到數(shù)據(jù)丟失的問題并不罕見,最近,在一個(gè)項(xiàng)目中,我遇到了一個(gè)棘手的問題:在攔截并轉(zhuǎn)發(fā)HTTP流數(shù)據(jù)的過程中,某些數(shù)據(jù)字段因?yàn)樘幚磉^快而被丟失,所以本文給大家介紹如何解決這個(gè)問題2024-08-08
Golang 標(biāo)準(zhǔn)庫 tips之waitgroup詳解
本篇文章給大家介紹Golang 標(biāo)準(zhǔn)庫 tips之waitgroup的相關(guān)知識(shí),包括使用 channel 實(shí)現(xiàn) WaitGroup 的功能介紹,感興趣的朋友跟隨小編一起看看吧2021-07-07

