我一直在使用lpcap,并成功地接收到进出我计算机的数据包。
但是,我只能获得这些包的源的HostName和IP地址,而不一定是与它们相关的URL。
例如,我将运行我的代码并看到一个源IP,然后谷歌例如我将看到74.125.226.163和lga15s45-in-f3.1e100.net,而不是google.com。
我一直在接收TCP数据包,并从IP报头信息中获取了先验信息。
我以前读过,HTTP报头中的AVP经常包含这些信息,但是我不知道如何从TCP信息中获得这些HTTP报头,或者是否有使用lpcap的方法。
最重要的是,有没有办法读取我的数据包来源的url?
包含了一些代码以供参考。我的处理方法:
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;
}发布于 2014-06-02 12:32:03
例如,我将运行我的代码并看到源IP,然后谷歌例如我将看到74.125.226.163和lga15s45-in-f3.1e100.net,而不是google.com。
你所要求的是不可能的。IP地址的反向DNS查找必须与最初在正向DNS查找中使用的域名匹配才能获得有问题的IP地址,这一点没有规定:
这是因为出于负载平衡和地理分布的原因,google.com可能会解析为大量的IP地址。因此,从域名到IP地址是一对多的关系。
然而,这些IP地址中的每一个(绑定到特定的its服务器或负载均衡器)在internet上仍然具有唯一的身份,这可以通过其反向查找来证明。因此,存在(通常)从IP地址到其反向DNS查找的一对一关系。
看看这个例子:
C:\Users\Jonathon>nslookup
Default Server: 192.168.1.1
Address: 192.168.1.1
> google.com
Server: 192.168.1.1
Address: 192.168.1.1
Non-authoritative answer:
Name: google.com
Addresses: 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
Server: 192.168.1.1
Address: 192.168.1.1
Name: ord08s11-in-f4.1e100.net
Address: 173.194.46.68另一个例子是共享托管服务器,其中一台物理机(以及公共IP地址)用于为具有不同域名的多个网站提供服务。
举个例子:
Forward lookup of several domains:
example-01.com --\
example-02.com ------> 127.64.23.17
example-03.com --/
Reverse lookup:
127.64.23.17 ----> 23-17.www.some-isp.example.comhttps://stackoverflow.com/questions/23987169
复制相似问题