close

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:

          ScanPort.jpg

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 yunjuihuang 的頭像
    yunjuihuang

    瑞の資訊備忘錄

    yunjuihuang 發表在 痞客邦 留言(0) 人氣()