写一个http嗅探器

时间:2010-01-15 16:38:11

标签: http url network-programming packet-capture packet-sniffers

我想编写一个程序,通过数据包捕获来提取系统访问的网站的URL(IP地址)。我认为这个URL将出现在数据部分(即不在任何标题中 - 以太网) / ip / tcp-udp)..(这些程序有时被称为http嗅探器,我不应该使用任何可用的工具)。作为初学者,我刚刚完成了这个基本的嗅探器程序:sniffex.c ..有谁能告诉我我应该朝哪个方向前进..

6 个答案:

答案 0 :(得分:4)

不,没有足够的信息。单个IP可以对应任意数量的域名,并且每个域可以实际上具有无限数量的URL。

但是,请查看gethostbyaddr(3)以了解如何在ip上执行反向dns查找,以至少获取该ip的规范名称。

更新:正如您编辑的问题,@ aehiilrs有一个much better answe r。

答案 1 :(得分:4)

注意:在下面的信息中,假设GET也包括POST和其他HTTP方法。

这肯定比查看一个数据包要多得多,但是如果你捕获整个流,你应该可以从发出的HTTP头中获取它。

如果提供了主机标头,请尝试查看主机标头,以及GET实际请求的内容。 GET可以是完整的URL,也可以只是服务器上的文件名。

另请注意,这与从IP地址获取域名无关。如果你想要域名,你必须深入研究数据。

我的机器上的快速示例,来自Wireshark:

GET http://www.google.ca HTTP/1.1
Host: www.google.ca
{other headers follow}

另一个例子,不是来自浏览器,只有GET中的路径:

GET /ccnet/XmlStatusReport.aspx HTTP/1.1
Host: example.com

在第二个示例中,实际网址为http://example.com/ccnet/XmlStatusReport.aspx

答案 2 :(得分:0)

您可能需要的是反向DNS查找。为此调用gethostbyaddr。

答案 3 :(得分:0)

如果您使用的是Linux,则可以在iptables中添加一个过滤器,以添加一条新规则,查找包含HTTP get请求的数据包并获取该URL。

所以规则看起来像这样。

对于从localhost到端口80的每个数据包 - >检查数据包是否包含GET请求 - >检索网址并保存

这种方法应该适用于所有情况,即使对于HTTPS标头也是如此。

答案 4 :(得分:0)

答案 5 :(得分:0)

我正在研究类似的事情并且遇到过这个问题。 希望如果您使用的是linux - justniffer,这可能是一个好的开始。

http://justniffer.sourceforge.net/

还有一个很好的http流量抓取python脚本,如果您希望从HTTP请求中获取信息,这将有所帮助。