gpt4 book ai didi

c - 有没有办法从 C 中收到的数据包中读取 url?

转载 作者:行者123 更新时间:2023-11-30 17:32:50 25 4
gpt4 key购买 nike

我一直在使用lpcap并成功接收进出我的计算机的数据包。

但是,我只能获取每个数据包源的主机名和 IP 地址,而不一定获取与它们关联的 URL。

例如,我将运行我的代码并查看源 IP,然后以 Google 为例,我将看到 74.125.226.163 和 lga15s45-in-f3.1e100.net,而不是 google.com。

我一直在接收TCP数据包,并从IP头信息中获取先验信息。

我之前读过,HTTP header 中的 AVP 经常包含此信息,但是我不知道如何从 TCP 信息中获取这些 HTTP header ,或者是否有使用 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;
}

最佳答案

For example, I will run my code and see a source IP, and then Google for example I would see 74.125.226.163 and lga15s45-in-f3.1e100.net as opposed to google.com.

你所要求的是不可能的。没有任何规定规定 IP 地址的反向 DNS 查找必须与正向 DNS 查找中最初使用的域名相匹配才能获取相关 IP 地址:

这是因为出于负载平衡和地理分布的原因,google.com 可能会解析为大量 IP 地址。所以域名和IP地址是一对多的关系。

但是,每个 IP 地址(绑定(bind)到特定的网络服务器或负载均衡器)在互联网上仍然具有唯一的身份,这可以通过其反向查找来证明。因此,从 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

另一个例子是共享托管服务器,其中一台物理机器(以及公共(public) 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.com

关于c - 有没有办法从 C 中收到的数据包中读取 url?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23987169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com