有没有办法从C语言中接收的数据包中读取URL?
我一直在使用lpcap,并成功地接收到进出我的计算机的数据包 但是,我只能得到每个数据包的主机名和源IP地址,而不一定是与它们相关联的URL 例如,我将运行我的代码并查看一个源IP,然后Google例如我将看到74.125.226.163和lga15s45-in-f3.1e100.net,而不是Google.com 我一直在接收TCP数据包,并从IP头信息中获得了先前的信息 我之前读过,HTTP头中的AVP经常包含这些信息,但是我不知道如何从TCP信息中获取这些HTTP头,或者是否有使用lpcap的方法 底线是,有没有一种方法可以从我的数据包的起始位置读取url 包括一些代码供参考。 我的处理方法:有没有办法从C语言中接收的数据包中读取URL?,c,http,url,networking,tcp,C,Http,Url,Networking,Tcp,我一直在使用lpcap,并成功地接收到进出我的计算机的数据包 但是,我只能得到每个数据包的主机名和源IP地址,而不一定是与它们相关联的URL 例如,我将运行我的代码并查看一个源IP,然后Google例如我将看到74.125.226.163和lga15s45-in-f3.1e100.net,而不是Google.com 我一直在接收TCP数据包,并从IP头信息中获得了先前的信息 我之前读过,HTTP头中的AVP经常包含这些信息,但是我不知道如何从TCP信息中获取这些HTTP头,或者是否有使用lpca
void processPacket(u_char *args, const struct pcap_pkthdr* header, const u_char *packet) {
const struct ip_hdr *ip;
const struct eth_hdr * eth;
char* src;
char* dst;
char src_host[NI_MAXHOST];
char dst_host[NI_MAXHOST];
eth = (struct eth_hdr*)(packet);
ip = (struct ip_hdr*)(packet+SIZE_ETHERNET);
src = inet_ntoa(ip->ip_src);
dst = inet_ntoa(ip->ip_dst);
memset(src_host, 0, NI_MAXHOST);
memset(dst_host, 0, NI_MAXHOST);
getDNS(inet_ntoa(ip->ip_src), src_host);
getDNS(inet_ntoa(ip->ip_dst), dst_host);
printf("Eth Dest Host: %s\n", eth->eth_destHost);
printf("Eth Send Host: %s\n", eth->eth_sendHost);
printf("Source: IP: %s Host: %s\n", inet_ntoa(ip->ip_src), src_host);
printf("Destination: IP: %s Host: %s\n", inet_ntoa(ip->ip_dst), dst_host);
}
这是我的收集方法
int collect(pcap_t *handler, char* device, char* conditions) {
struct pcap_pkthdr pkthdr;
const unsigned char *packet = NULL;
char* args = (char*)malloc(32);
int count = 0;
char errbuf[PCAP_ERRBUF_SIZE];
bpf_u_int32 netaddr = 0, mask=0;
//prepping conditions for collection
memset(errbuf, 0, PCAP_ERRBUF_SIZE);
if (device == NULL) {
printf("Error device not found exiting...");
return -1;
}
//stores network address and mask in netaddr and mask, exits if not found
if (pcap_lookupnet(device, &netaddr, &mask, errbuf) == -1) {
printf("Error net address and mask not found exiting...");
return -1;
}
//opens the session allowing all net traffic to be read, exits if it cannot
handler = pcap_open_live(device, MAXBYTES2CAPTURE, 1, 512, errbuf);
if (pcap_lookupnet(device, &netaddr, &mask, errbuf) == -1) {
printf("Error opening session exiting...");
return -1;
}
if (conditions != NULL) {
printf("Implementing Filter...\n");
if (startFilter(conditions, handler, mask) == -1) {
printf("Error initializing Filter");
return -1;
}
}
//executing collection
printf("Starting loop...\n");
pcap_loop(handler, -1, processPacket, (u_char*)&count);
return -1;
}
例如,我将运行我的代码并查看一个源IP,然后Google例如我将看到74.125.226.163和lga15s45-in-f3.1e100.net,而不是Google.com
你所要求的是不可能的。没有任何内容表明IP地址的反向DNS查找必须与最初在正向DNS查找中使用的域名相匹配,才能获得有问题的IP地址:
这是因为出于负载平衡和地理分布的原因,google.com
可能会解析为大量的IP地址。因此,从域名到IP地址之间存在一对多的关系
但是,这些IP地址(绑定到特定的Web服务器或负载平衡器)中的每一个在internet上仍然具有唯一的标识,这可以通过反向查找得到证明。因此,从IP地址到反向DNS查找(通常)存在一对一的关系
看看这个例子:
C:\Users\Jonathon>nslookup
默认服务器:192.168.1.1
地址:192.168.1.1
>谷歌网站
服务器:192.168.1.1
地址:192.168.1.1
非权威性回答:
名称:google.com
地址:2607:f8b0:4009:800::1007
173.194.46.68
173.194.46.69
173.194.46.70
173.194.46.71
173.194.46.72
173.194.46.73
173.194.46.78
173.194.46.64
173.194.46.65
173.194.46.66
173.194.46.67
> 173.194.46.68
服务器:192.168.1.1
地址:192.168.1.1
名称:ord08s11-in-f4.1e100.net
地址:173.194.46.68
另一个例子是共享托管服务器,其中使用一台物理机器(从而使用公共IP地址)为具有不同域名的许多网站提供服务
例如:
正向查找多个域:
示例-01.com--\
示例-02.com----->127.64.23.17
示例-03.com--/
反向查找:
127.64.23.17-->23-17.www.some-isp.example.com
您了解TCP和HTTP之间的关系吗?您是否能够读取HTTP标头中“主机”属性的值?我无法读取HTTP标头中的主机属性,我将如何执行此操作?您没有回答我的第一个问题。如果答案是“否”,那么你需要做一些阅读。我确实理解TCP和HTTP之间的基本区别,我只是对如何读取HTTP头有点困惑。有没有办法重建TCP流以创建某种HTTP头信息?我意识到我只是在试着完成我的过程,我真的在问是否有办法找到与我正在收集的数据包相关联的URL。感谢您的回复和帮助。