一、tcp掃瞄技術
為了提高掃瞄速度,本程式採用了多執行緒技術和非阻塞i/o的技術。程式的主介面是乙個對話方塊,下面是程式框架示意圖:
1、全域性變數:
以下是所有全域性變數的定義:
hwnd g_hwnd = null; //處理訊息的視窗控制代碼2、startscan 執行緒:unsigned long g_uladdr = inaddr_none; //掃瞄的主機位址
dword g_dwtimeout = 1000; //連線超時時間,以ms計
bool g_bterminate = false; //是否使用者發出結束掃瞄的標誌
short g_nmaxthread = 200; //最大允許的掃瞄線程數,經試驗不宜大於200
short g_nthreadcount = 0; //當前正在掃瞄的程序數
這個執行緒完成的任務是啟動具體的掃瞄doscanport執行緒,對某乙個埠進行掃瞄。該程序啟動的doscanport執行緒的最大數量在設定的值範圍內,如果執行緒數已達最大,則會等待某些執行緒結束後再啟動新的執行緒。如果使用者發出結束掃瞄資訊,則不再啟動新的執行緒,而等待已啟動的執行緒結束後返回。下面是這執行緒的執行體**:
dword winapi startscan(lpvoid lpparam)3、doscanport 執行緒:while(g_nthreadcount >= g_nmaxthread)
if (createthread(null,
0,doscanport,
(lpvoid)new short(pscanparam->narrofports[i]),
0,&dwthreadid) != null)
} } else
while(g_nthreadcount >= g_nmaxthread)
if (createthread(null, 0, doscanport, (lpvoid)new short(i), 0, &dwthreadid) != null)
} }
//等待各埠掃瞄執行緒結束
while (g_nthreadcount > 0)
::sendmessage(g_hwnd, scan_thread, startscan_complete, 0);
delete pscanparam;
return error_success;
}
這個執行緒負責具體掃瞄指定的埠,並將結果sendmessage給主對話方塊。下面是其**:
dword winapi doscanport(lpvoid lpparam)三、執行結果else
else
; }
closesocket(sock);
} g_nthreadcount --;
if (dwret == error_success)
else
return dwret;
}
本程式在vc6+winxp下編寫除錯執行正確,在win98下執行正確。
在我的計算機掃瞄本機1-5000號埠,超時設定1000ms,200個最大執行緒數,約需要45秒。當超時設定再短一些時速度可達每秒150個埠的速度。
四、結束語
事實上,速度要想再提高,可能需要其它方法了。如果執行緒數開得過多,則由於執行緒的排程開銷過大,速度反而會降低。如果超時設定過短,可能引起掃瞄的結果不正確(這須視網路情況決定),並且由於是多執行緒,超時等待的時間也可能小於因執行緒排程而等待的時間,則也不能提高速度。
另外我還發現了乙個問題,就是掃瞄本機時,如果以ip位址127.0.0.1時,則139#埠沒有開放;如果設定為本機的實際ip時則139#埠是開放的,這不知是何原因,還望高手指點。
本程式還有乙個需要改進的地方,就是不象大多數埠掃瞄器可掃瞄指定的ip段,而只設計成掃瞄指定的某一台主機。
(網路程式設計)乙個簡單的埠掃瞄程式
1 本次實驗使用的是visual studio 2019 2 該程式的功能是使用多執行緒掃瞄主機埠是否開啟 using system using system.collections.generic using system.componentmodel using system.data usin...
用JAVA實現乙個簡單的埠掃瞄功能
思路,使用socket物件的connect方法,輸入準備掃瞄的主機名和埠號,根據方法執行階段是否丟擲異常來判斷該埠能否正確訪問,具體 如下 param domain 主機網域名稱或者ip param startport 開始埠 param endport 結束埠 private static voi...
用Python實現乙個埠掃瞄,只需簡單幾步就好
0 秘密掃瞄 秘密掃瞄是一種不被審計工具所檢測的掃瞄技術。它通常用於在通過普通的防火牆或路由器的篩選 filtering 時隱藏自己。秘密掃瞄能躲避ids 防火牆 包過濾器和日誌審計,從而獲取目標埠的開放或關閉的資訊。由於沒有包含tcp 3次握手協議的任何部分,所以無法被記錄下來,比半連線掃瞄更為隱...