2013-03-08 55 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源代码。

相关问题