1 、TCP connect Scan是所有Scan Port中最簡單的方式,它是使用一個完整的TCP Connect
(SYN,SYN/ACK,ACK)的方式來確認目標機器是否存在且開啟特定的埠,因此將會在目標機器
上留下連線記錄。但由於在Windows XP SP2 之後的版本已經不能直接使用Socket自訂TCP
Header 來傳送TCP 封包因此無法直接使用Socket實作其他如:TCP Syn Scan、TCP Fin
Scan…等不完全connect的方式,但是可以使用其他的方式來完成上述特殊的連線方式,相關
的方式如下:
1-1、Winpcap (Windows version of Libpcap): (按此連接相關範例)
使用Winpcap library傳送或接收raw packet來操作Connect的流程及訊息。
1-2、NDIS Protocol Driver (連接NIC和應用程式):(按此連接相關範例)
使用NDIS Protocol Driver來傳送或接收raw packet來操作Connect的流程及訊息。
2、 C#使用Windows API時必須先使用DllImport來Include Library,主要使用下列18個網路相關的API:
2-01、int WSAStartup(ushort wVersionrequested,ref WSDATA lpWSAData)
一 使用Windows Socket必須成功的調用此函式,才可以完成其他一系列的初始化。
2-02、int socket(int af,int type,int protocol) 一 建立一個具體傳輸服務的Socket。
2-03、int WSAGetLastError() 一 擷取使用Windows Socket函式失敗時的錯誤訊息。
2-04、uint GetIpAddrTable(IntPtr pIpAddrTable,ref int pdwSize,bool bOrder)
一 取得目前主機有多少介面有IPv4 Address。
2-05、uint inet_addr(Intptr cp) 一 將帶有dot的字串IP轉換成網路格式(big-endian)的uint。
2-06、string inet_ntoa(uint sin_addr) 一 將網路格式(big-endian)的ushort轉換成帶有dot的字串IP。
2-07、ushort htons(ushort hostshort) 一 將Inter Processors格式轉換成TCP/IP的網路格式
2-08、ushort htonl(uint hostlong) 一 將Inter Processors格式轉換成TCP/IP的網路格式
2-09、ushort ntohs(ushort netshort) 一 將TCP/IP的網路格式轉換成Inter Processors格式
2-10、ushort ntohl(uint netlong) 一 將TCP/IP的網路格式轉換成Inter Processors格式
PS:big-endian - TCP/IP的網路格式 little-endian - Inter Processor格式
Ex. 0x1000 (big-endian) = 0x0010 (little-endian) = 4 (Decimal)
2-11、int bind(int s,ref SOCKADDR_IN name,int namelen)
一 設定Socket連結固定的Address和Port
2-12、 int connect(int s,ref SOCKADDR_IN name,int namelen)
一 建立一個連線到一個具體的Socket。
2-13、int ioctlsocket(int s,uint cmd,IntPtr argp) 一 控制Socket的I/O模式
2-14、int select ( int nfds,
ref fd_set readfds,
ref fd_set writefds,
ref fd_set exceptfds,
ref timeval timeout
);
一 確定一個或多個Socket的等待狀態,主要用於執行同步I/O
2-15、int getsockopt(int s,int level,int optname,IntPtr optval,ref int optlen)
一 檢索Socket的選項。
Ex. getsockopt(openSocket,SOL_SOCKET,SO_ERROR,tmpPtr,ref message);
-檢索openSocket的最後錯誤訊息。
2-16、int setsockopt(int s,int level,int optname,IntPtr optval,int optlen)
一 設定Socket的選項。
EX. setsockopt(openSocket,SOL_SOCKET,SO_REUSEADDR,tmpPtr,sizeof(int));
允許前次Socket在關閉後處於TIME_WAIT狀態時,可以讓新的Socket Bind相同的
位址及埠。
2-17、int shutdown(int s,int how) 一 關閉Socket的傳送或接收
2-18、int closesocket(int s) 一 關閉指定的Socket。
2-19、int WSACleanup() 一 終止使用Windows Socket 2 DLL (to close WSAStartup)
3、在調用WSAStartup函式成功後,實作TCP Connect Scan的流程如下:
3-1、根據Thread的數量分配掃描的位址
3-2、在每個Thread內建立一個具體傳輸服務的Socket
3-3、為了能自行設定Connect 失敗的時間,則設定該Socket為非阻塞模式。
3-4、判斷是否要對特定有網路位址的網路卡使用Bind函式。
3-5、使用Connect函式連接目標機器來判斷特定的埠是否開啟。
3-6、使用select函式設定連線timeout的時間。
3-7、關閉socket並顯示訊息。
3-8、判斷是否掃描完成所分配的位址及埠,若無則回到步驟3-2
Downlaod: Scan Port(Source Code) Scan Port (EXE)
Result: