我想编写一个程序来通过数据包捕获提取系统访问的网站的 URL(IP 地址)。我认为这个 URL 将出现在数据部分(即不在任何标题中 - ethernet / ip / tcp-udp )..(这些程序有时被称为 http 嗅探器,我不应该使用任何可用的工具)。作为一个初学者,我刚刚完成了这个基本的嗅探器程序:sniffex.c .. 谁能告诉我应该朝哪个方向前进..
6 回答
不,没有足够的信息。一个 IP 可以对应于任意数量的域名,并且每个域名都可以有无数个 URL。
但是,请查看 gethostbyaddr(3) 以了解如何对 ip 进行反向 dns 查找,以至少获得该 ip 的规范名称。
更新:当您编辑问题时,@aehiilrs 有一个更好的答案。
注意:在下面的信息中,假设 GET 还包括 POST 和其他 HTTP 方法。
这肯定比查看一个数据包要多得多,但是如果您捕获整个流,您应该能够从发出的 HTTP 标头中获取它。
尝试查看 Host 标头(如果提供),以及 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
在第二个示例中,实际 URL 是http://example.com/ccnet/XmlStatusReport.aspx
您可能想要的是反向 DNS 查找。为此,请致电 gethostbyaddr。
如果您使用的是 Linux,您可以在 iptables 中添加一个过滤器以添加一个新规则,该规则查找包含 HTTP 获取请求的数据包并获取 url。
所以规则看起来像这样。
对于从本地主机到端口 80 的每个数据包 -> 检查数据包是否包含 GET 请求 -> 检索 url 并保存它
这种方法应该适用于所有情况,即使对于 HTTPS 标头也是如此。
看看PasTmon。http://pastmon.sourceforge.net
我正在研究类似的东西并遇到了这个。如果您使用的是 linux - justniffer,希望这可能是一个好的开始。
http://justniffer.sourceforge.net/
如果您希望从 HTTP 请求中获取信息,还有一个不错的 http 流量抓取 python 脚本会有所帮助。