我想编写一个程序,通过数据包捕获来提取系统访问的网站的URL(IP地址)。我认为这个URL将出现在数据部分(即不在任何标题中 - 以太网) / ip / tcp-udp)..(这些程序有时被称为http嗅探器,我不应该使用任何可用的工具)。作为初学者,我刚刚完成了这个基本的嗅探器程序:sniffex.c ..有谁能告诉我我应该朝哪个方向前进..
答案 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)
看看PasTmon。 http://pastmon.sourceforge.net
答案 5 :(得分:0)
我正在研究类似的事情并且遇到过这个问题。 希望如果您使用的是linux - justniffer,这可能是一个好的开始。
http://justniffer.sourceforge.net/
还有一个很好的http流量抓取python脚本,如果您希望从HTTP请求中获取信息,这将有所帮助。