2013-03-08 58 views
0

我正在用C編寫端口掃描器,並且想要檢測在開放端口及其版本上運行的是什麼服務。
我已經寫了掃描器代碼,但現在我不知道如何檢測正在運行的服務。
我能做什麼?C檢查在開放端口上運行的是什麼服務

+1

您可以在這裏查看http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers – Blood 2013-03-08 21:25:07

+0

考慮[IANA知名港口](http://www.iana.org/assignments/service-names-port - 值/服務名稱,端口numbers.xml)。 – 2013-03-08 21:26:17

+0

我知道哪些服務*在端口(22-> ssh)上運行,但我想知道的是:我如何檢查*確定*服務運行的是什麼以及它的版本。 – polslinux 2013-03-08 21:26:55

回答

4

如果您決定在自己的代碼中執行此操作,則可以連接到端口,查看是否有任何數據,如果沒有,則發送幾個字節,然後再次檢查。

然後將其與預期響應進行匹配。

想要知道你在找什麼,你可以用telnet手動連接到端口,並戳它。在許多情況下(Web服務器就是一個簡單的例子),您必須發送一些格式正確的數據才能獲得可用的響應。

NMAP做這一切以及更多(例如廣泛的檢查,如尋找字節順序和ARP通信量的時間)

UPDATE:幾個人都提到衆所周知的端口,但不會幫助你發現標準服務運行在非標準端口上,例如運行在自定義端口上的ssh或http服務器。

+0

我同意這裏的所有內容,但會重複我在上述評論中所說的內容:即使您爲每個人所知的協議編寫「最小客戶端」,也無法以100%的準確率實現此目標。 – 2013-03-08 21:30:57

+0

@NikBougalis絕對如此。檢測和發送數據以獲取響應的方式幾乎是無止境的。我不會承擔這樣的項目,除了a)爲了好玩,或者b)爲nmap不知道的內部定製服務 – 2013-03-08 21:49:12

1

如果服務器先發送一些東西,用它來標識協議。

如果沒有,請根據某些協議(例如http)發送內容,然後查看回送的服務器(有效響應或錯誤)。您可能需要使用不同的協議進行多次嘗試,並且良好的順序對於減少連接數量非常重要。

某些協議可能很難識別,並且很容易使用您不知道的獨特協議定製服務器,甚至隱藏真正的服務器,如http等簡單的假冒服務器。

如果你只是想知道端口通常是什麼,請檢查"well known ports"和官方reserved ports

另請參閱nmap源代碼。

相關問題