有没有办法从C中收到的数据包中读取网址?

时间:2014-06-02 04:02:01

标签: c http url networking tcp

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

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

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

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

我之前已经读过,HTTP标头中的AVP经常包含这些信息,但是我不知道如何从TCP信息中获取这些HTTP标头,或者是否有使用lpcap的方法。

底线是否有办法从我的数据包源自哪里读取网址?

包含一些代码供参考。 我的处理方法:

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;
}

1 个答案:

答案 0 :(得分:0)

  

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

你要求的是不可能的。没有任何说明IP地址的反向DNS查找必须与最初在正向DNS查找中使用的域名匹配才能获得有问题的IP地址:

这是因为google.com可能会因为负载平衡和地理分布原因而解析为大量IP地址。因此,从域名到IP地址存在一对多的关系。

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