這次呢, 咱們來實現乙個簡單的tcp埠掃瞄器!
也來體驗一下黑客的風采!
我們在使用tcp進行連線時,需要知道對方機器的ip:port
連線成功的話,流程如下。
有正常,就有失敗,如果被連線方關閉的話,流程如下。
還有一種可能是,埠開放,但是**防火牆攔截,**流程如下。
本質理解之後,就可以開始擼**了。
在go中,我們通常使用net.dial
進行tcp連線。
它就兩種情況
相對來說,剛開始時,我們可能都不是太膽大,都是先寫原型,也不考慮效能。
**
package main
import
("fmt"
"net"
)func
main()
conn.
close()
fmt.
println
(address,
"開啟")}
}
執行結果![](https://pic.w3help.cc/9d4/30e1a266cb8f2cfa2cdc9d4b1b02c.jpeg)
但是這個過程是非常緩慢的。
因為net.dial
如果連線的是未開放的埠,乙個埠可能就是20s+,所以,我們為什麼學習多執行緒懂了把!!!
上述是通過迴圈去乙個個連線ip:port
的,那我們就知道了,在乙個個連線的位置,讓多個人去幹就好了。
所以,多執行緒如下。
**
package main
import
("fmt"
"net"
"sync"
"time"
)func
main()
conn.
close()
fmt.
println
(address,
"開啟")}
(j)}
//等待wg
wg.wait()
var elapsetime = time.
now().
sub(begin)
fmt.
println
("耗時:"
, elapsetime)
}
執行結果![](https://pic.w3help.cc/37c/068e7497ef6d86958d3678cf80b2f.jpeg)
其實是同時開啟了6w多個執行緒,去掃瞄每個ip:port
。
所以耗時最長的執行緒結束的時間,就是程式結束的時間。
感覺還行,20s+掃瞄完6w多個埠!!!
上面我們簡單粗暴的方式為每個ip:port
都建立了乙個協程。
雖然在go中,理論上協程開個幾十萬個都沒問題,但是還是有一些壓力的。
所以我們應該採用一種相對節約的方式進行精簡**,一般採用執行緒池方式。
本次使用的執行緒池包:gohive
簡單介紹
//執行緒池方式
//位址管道,100容量
var addresschan =
make
(chan
string
,100
)//工人
func
worker()
"address:", address)
conn, err := net.
dial
("tcp"
, address)
//conn, err := net.dialtimeout("tcp", address, 10)
if err !=
nil conn.
close()
fmt.
println
("open:"
, address)}}
func
main()
//傳送完關閉 addresschan 管道
close
(addresschan)}(
)//啟動pool_size工人,處理addresschan種的每個位址
for work :=
0; work < pool_size; work++
//等待結束
wg.wait()
//計算時間
var elapsetime = time.
now().
sub(begin)
fmt.
println
("耗時:"
, elapsetime)
}執行結果
我設定的執行緒池大小是7w個,所以也是一下子開啟6w多個協程的,但是我們已經可以進行執行緒大小約束了。
假設現在有這樣的去求,有100個ip
,需要掃瞄每個ip
開放的埠,如果採用簡單粗暴開執行緒的方式.
那就是100+65535=6552300
,600多w個執行緒,還是比較消耗記憶體的,可能系統就會崩潰,如果採用執行緒池方式。
將執行緒池控制在50w個,或許情況就會好很多。
但是有一點的是,在go中,執行緒池通常需要配合chan
使用,可能需要不錯的基礎。
本篇更偏向於樂趣篇,了解一下好玩的玩意。
其實還可以通過net.dialtimeout
連線ip:port
,這個可以設定超時時間,比如超時5s就判定埠未開放。
此處就不做舉例了。
咱們主要使用三種方式來實現功能。
通常情況下,如果基礎可以,更推薦使用協程池方式。
用微笑告訴別人,今天的我比昨天強,今後也一樣。
我是碼農星期八,如果覺得還不錯,記得動手點讚一下哈。
感謝你的**。
TCP埠掃瞄器
乙個基於python3的tcp埠掃瞄器 原理 就是和不同的埠進行tcp連線,能連線成功就表示此埠是開放的,不能連線成就表示此埠是關閉的。import socket import re import threading import time lock threading.lock threads l...
埠掃瞄器(masscan)
s.exe號稱史上最快 3分鐘掃完全網 掃瞄器小巧而精緻,大小僅僅8k,但是使用上有諸多限制,例如僅支援再winserver2003 上無條件使用,放到其它系統上就要對系統做一些配置,不然無法支援syn方式掃瞄,這顯然不夠友好。nmap掃瞄器,能探知系統型別是否存活等,但是同時獲得更詳細的資訊也就意...
Python指令碼 埠掃瞄器
乙個用python寫的簡單的埠掃瞄器,python環境為 3.7.0,windows系統 掃瞄給定主機是否開放了指定的埠tcp連線掃瞄是利用tcp的三次握手來確定主機的埠是否開放。確定主機埠開放之後,給埠傳送訊息,接收埠返回的訊息,然後判斷該埠執行的服務。使用時,h 引數可以提供主機的網域名稱或者i...