Exemple #1
0
int main(int argc, char **argv) { 

    char *dev = NULL; 
    char errbuf[PCAP_ERRBUF_SIZE]; 
    pcap_t *descr;
    
    memset(&descr, 0, sizeof(descr)); 
    const u_char *packet = NULL;

    struct ether_header *eptr; /* net/ethernet.h */
    memset(&eptr, 0, sizeof(eptr));

    struct bpf_program fp;     /*выражение фильтрации в составленном виде */ 
    memset(&fp, 0, sizeof(fp));

    bpf_u_int32 maskp = 0;         /*маска подсети */ 
    bpf_u_int32 netp = 0;          /* ip */ 

    if (argc != 2) {

        fprintf(stdout, "Usage: %s \"expression\"\n", argv[0]); //Если кол-во аргументов <> 2, показываем пользователю, как работать с программой
        exit(0);

    } 

    /* Получение имени сетевого адаптера */
    dev = Pcap_lookupdev(errbuf); //Все функции-обертки для этого задания см. в файле unp.h (line 245+)

    /* Получение ip и маски сети для выбранного адаптера */ 
    Pcap_lookupnet(dev, &netp, &maskp, errbuf); 

    /* Открытие устройства в promiscuous-режиме (требуются права администратора) */ 
    descr = Pcap_open_live(dev, BUFSIZ, 1,-1, errbuf);

    printf("DEVICE: %s \n", dev);

    /* Собираем фильтр */ 
    Pcap_compile(descr, &fp, argv[1], 0, netp);

    /* Применяем фильтр*/ 
    Pcap_setfilter(descr, &fp);

    /* Обратный вызов */ 
    Pcap_loop(descr, -1, callback, NULL);

    pcap_close(descr);

    return 0; 

}
Exemple #2
0
int main(int argc, char *argv[])
{
	bpf_u_int32 netaddr=0, mask=0;
	struct bpf_program filter;
	pcap_t *descr = NULL;
	struct pcap_pkthdr pkthdr;
	const unsigned char *packet = NULL;
	struct ip *ipptr = NULL;
	struct tcphdr *tcpptr = NULL;

	if (argc < 2 || argc > 3 || (argv[1][0] == '-' && argv[1][1] == 'h')){
		printf("Usage: tcpsniffer <interface> | tcpsniffer -f <dumpfile>\n");
		exit(1);
	}

    if (argc == 2) {
	    descr = Pcap_open_live(argv[1], MAXBYTES2CAPTURE, 1, 512);
	    Pcap_lookupnet(argv[1], &netaddr, &mask);
    } else {    // argc == 3
	    descr = Pcap_open_offline(argv[2]);
    }
	Pcap_compile(descr, &filter, "tcp", 1, mask);
	Pcap_setfilter(descr, &filter);

	while (1){
		packet = Pcap_next(descr, &pkthdr);
		if (packet == NULL) {
            if (pcap_file(descr) != NULL) {
                printf("\nend of dumpfile!\n");
            } else {
                printf("\n loop was broken out of with pcap_breakloop!\n");
            }
            exit(1);
        }

		ipptr = (struct ip *)(packet + 14);
		printf("\n\nReceived Packet Size: %d bytes\n", pkthdr.len);
		printf("\n\nthe IP packets version: %d\n", ipptr->ip_v); 
		printf ("the IP packets total_length is :%d\n", ntohs(ipptr->ip_len));
		printf ("the IP protocol is %d\n", ipptr->ip_p);
		printf ("Destination IP: %s\n", inet_ntoa(ipptr->ip_dst));    
		printf ("Source IP: %s\n", inet_ntoa(ipptr->ip_src));

		tcpptr = (struct tcphdr *) (packet + 14 + ipptr->ip_hl*4);
		printf ("Destination port : %d\n", ntohs(tcpptr->th_dport));
		printf ("Source port : %d\n", ntohs(tcpptr->th_sport));
		printf ("the seq of packet is %u\n", ntohl(tcpptr->th_seq));
	}
	return 0;
}
Exemple #3
0
int main()
{
    int count = 0;
    char *device = NULL;
	pcap_t *descr = NULL;

	/*获取第一个适合捕获的网络设备名称*/
	device = Pcap_lookupdev();
	printf("Opening device %s\n", device);

	/*以混杂模式打开网络设备*/
	descr = Pcap_open_live(device, MAXBYTES2CAPTURE, 1, 512);

	/*死循环并在每一次接收到数据包时调用回调函数processPacket()*/
	pcap_loop(descr, -1, processPacket, (u_char *)&count);

	return 0;
}