ابزار کاربر

ابزار سایت


libpcap-programming:start

برنامه‌نویسی libpcap

پیش‌نیازها

apt install libpcap-dev

کامپایل

gcc <filename> -lpcap

انتخاب دیوایس شبکه

دستی - hard-code

#include <stdio.h>
#include <pcap.h>
 
int main(int argc, char *argv[])
{
    char *device = "enp3s0";
 
    printf("Device: %s\n", device);
 
    return(0);
}

دستی - پارامتر خط فرمان

#include <stdio.h>
#include <pcap.h>
 
int main(int argc, char *argv[])
{
    char *dev = argv[1];
 
    printf("Device: %s\n", dev);
 
    return(0);
}

اتوماتیک - با استفاده از pcap_findalldevs

// man pcap_findalldevs
// man sockaddr
// man inet_ntop
 
// gcc find_device.c -lpcap
 
#include <stdio.h>
#include <stdlib.h>
#include <pcap/pcap.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdint.h>
 
void showbin32(uint32_t num)
{
    struct byte {
        unsigned char a:1;
        unsigned char b:1;
        unsigned char c:1;
        unsigned char d:1;
        unsigned char e:1;
        unsigned char f:1;
        unsigned char g:1;
        unsigned char h:1;
    };
 
    union {
        uint32_t n;
        struct byte c[4];
    } pack;
 
    pack.n = num;
 
    for (int i = 3; i >= 0; i--) {
        printf("%u%u%u%u%u%u%u%u ",
                pack.c[i].h,
                pack.c[i].g,
                pack.c[i].f,
                pack.c[i].e,
                pack.c[i].d,
                pack.c[i].c,
                pack.c[i].b,
                pack.c[i].a);
    }
    printf("\n");
}
 
void showbinstr(char *s, size_t len)
{
    struct byte {
        unsigned char a:1;
        unsigned char b:1;
        unsigned char c:1;
        unsigned char d:1;
        unsigned char e:1;
        unsigned char f:1;
        unsigned char g:1;
        unsigned char h:1;
    };
 
    union {
        unsigned char n;
        struct byte c;
    } pack;
 
    for (int i = 0; i < len; i++) {
        pack.n = s[i];
        printf("%u%u%u%u%u%u%u%u ",
                pack.c.h,
                pack.c.g,
                pack.c.f,
                pack.c.e,
                pack.c.d,
                pack.c.c,
                pack.c.b,
                pack.c.a);
    }
    printf("\n");
}
 
int main()
{
    char errbuf[PCAP_ERRBUF_SIZE];
    pcap_if_t *alldevsp;
 
    if ((pcap_findalldevs(&alldevsp, errbuf)) == PCAP_ERROR) {
        printf("Error (pcap_findalldevs): %s\n", errbuf);
        exit(EXIT_FAILURE);
    }
 
    pcap_if_t *devp = alldevsp;
    while (devp != NULL) {
        printf("----------------------------------------\n");
        printf("Name: %s\n", devp->name);
        printf("Description: %s\n", devp->description);
 
        printf("Flags: ");
 
        if (devp->flags & PCAP_IF_UP)
            printf("UP ");
        else
            printf("Down ");
 
        if (devp->flags & PCAP_IF_RUNNING)
            printf("Running ");
 
        if (devp->flags & PCAP_IF_WIRELESS)
            printf("Wireless ");
 
        if (devp->flags & PCAP_IF_LOOPBACK)
            printf("Loopback ");
 
        if ((devp->flags & PCAP_IF_CONNECTION_STATUS) ==
                PCAP_IF_CONNECTION_STATUS_CONNECTED)
            printf("Connected\n");
 
        if ((devp->flags & PCAP_IF_CONNECTION_STATUS) ==
                PCAP_IF_CONNECTION_STATUS_DISCONNECTED)
            printf("Disconnected\n");
 
        if ((devp->flags & PCAP_IF_CONNECTION_STATUS) ==
                PCAP_IF_CONNECTION_STATUS_UNKNOWN)
            printf("Unknown\n");
 
        if ((devp->flags & PCAP_IF_CONNECTION_STATUS) ==
                PCAP_IF_CONNECTION_STATUS_NOT_APPLICABLE)
            printf("Not-Applicable\n");
 
        printf("\n");
 
        pcap_addr_t *addrp = devp->addresses;
        while (addrp != NULL) {
 
            if(addrp->addr->sa_family == AF_INET) {
                struct sockaddr_in *v4addrp;
                v4addrp = (struct sockaddr_in *) addrp->addr;
 
                struct in_addr *sin_addrp;
                sin_addrp = &(v4addrp->sin_addr);
 
                char ipv4[INET_ADDRSTRLEN];
                inet_ntop(AF_INET, sin_addrp, ipv4, INET_ADDRSTRLEN);
                printf("IPv4 = %s\n", ipv4);
 
                if (addrp->netmask != NULL) {
                    struct in_addr *netmaskp;
                    netmaskp = &(((struct sockaddr_in *)
                                addrp->netmask)->sin_addr);
                    char netmask[INET_ADDRSTRLEN];
                    inet_ntop(AF_INET, netmaskp, netmask, INET_ADDRSTRLEN);
                    printf("Netmask = %s\n", netmask);
 
                    uint32_t n = htonl(*(uint32_t *)netmaskp);
                    int prefix = 0;
                    while (n > 0) {
                        showbin32(n);
                        n = n << 1;
                        prefix++;
                    }
                    printf("Prefix: /%d\n", prefix);
                }
 
            }
 
            if(addrp->addr->sa_family == AF_INET6) {
                struct sockaddr_in6 *v6addrp;
                v6addrp = (struct sockaddr_in6 *) addrp->addr;
 
                struct in6_addr *sin6_addrp;
                sin6_addrp = &(v6addrp->sin6_addr);
 
                char ipv6[INET6_ADDRSTRLEN];
                inet_ntop(AF_INET6, sin6_addrp, ipv6, INET6_ADDRSTRLEN);
                printf("IPv6 = %s\n", ipv6);
 
                if (addrp->netmask != NULL) {
                    struct in6_addr *netmaskp;
                    netmaskp = &(((struct sockaddr_in6 *)
                                addrp->netmask)->sin6_addr);
                    char netmask[INET6_ADDRSTRLEN];
                    inet_ntop(AF_INET6, netmaskp, netmask, INET6_ADDRSTRLEN);
                    printf("Netmask = %s\n", netmask);
 
                    showbinstr((char *)netmaskp, 16);
                    int prefix = 0;
                    for (int i = 0; i < 16; i++) {
                        unsigned char c = *((char *)netmaskp + i);
 
                        if (c == 0)
                            break;
 
                        while (c > 0) {
                            c = c << 1;
                            prefix++;
                        }
                    }
                    printf("Prefix: /%d\n", prefix);
                }
 
            }
 
            addrp = addrp->next;
        }
 
        devp = devp->next;
    }
 
    pcap_freealldevs(alldevsp);
 
    return 0;
}
----------------------------------------
Name: enp4s0
Description: (null)
Flags: UP Running Connected

IPv4 = 192.168.1.2
Netmask = 255.255.255.0
11111111 11111111 11111111 00000000
11111111 11111111 11111110 00000000
11111111 11111111 11111100 00000000
11111111 11111111 11111000 00000000
11111111 11111111 11110000 00000000
11111111 11111111 11100000 00000000
11111111 11111111 11000000 00000000
11111111 11111111 10000000 00000000
11111111 11111111 00000000 00000000
11111111 11111110 00000000 00000000
11111111 11111100 00000000 00000000
11111111 11111000 00000000 00000000
11111111 11110000 00000000 00000000
11111111 11100000 00000000 00000000
11111111 11000000 00000000 00000000
11111111 10000000 00000000 00000000
11111111 00000000 00000000 00000000
11111110 00000000 00000000 00000000
11111100 00000000 00000000 00000000
11111000 00000000 00000000 00000000
11110000 00000000 00000000 00000000
11100000 00000000 00000000 00000000
11000000 00000000 00000000 00000000
10000000 00000000 00000000 00000000
Prefix: /24
IPv6 = fe80::290:27ff:fe75:22b4
Netmask = ffff:ffff:ffff:ffff::
11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
Prefix: /64
----------------------------------------
Name: enp3s0
Description: (null)
Flags: UP Running Connected

IPv4 = 172.16.20.1
Netmask = 255.255.255.0
11111111 11111111 11111111 00000000
11111111 11111111 11111110 00000000
11111111 11111111 11111100 00000000
11111111 11111111 11111000 00000000
11111111 11111111 11110000 00000000
11111111 11111111 11100000 00000000
11111111 11111111 11000000 00000000
11111111 11111111 10000000 00000000
11111111 11111111 00000000 00000000
11111111 11111110 00000000 00000000
11111111 11111100 00000000 00000000
11111111 11111000 00000000 00000000
11111111 11110000 00000000 00000000
11111111 11100000 00000000 00000000
11111111 11000000 00000000 00000000
11111111 10000000 00000000 00000000
11111111 00000000 00000000 00000000
11111110 00000000 00000000 00000000
11111100 00000000 00000000 00000000
11111000 00000000 00000000 00000000
11110000 00000000 00000000 00000000
11100000 00000000 00000000 00000000
11000000 00000000 00000000 00000000
10000000 00000000 00000000 00000000
Prefix: /24
IPv4 = 1.2.3.1
Netmask = 255.255.255.252
11111111 11111111 11111111 11111100
11111111 11111111 11111111 11111000
11111111 11111111 11111111 11110000
11111111 11111111 11111111 11100000
11111111 11111111 11111111 11000000
11111111 11111111 11111111 10000000
11111111 11111111 11111111 00000000
11111111 11111111 11111110 00000000
11111111 11111111 11111100 00000000
11111111 11111111 11111000 00000000
11111111 11111111 11110000 00000000
11111111 11111111 11100000 00000000
11111111 11111111 11000000 00000000
11111111 11111111 10000000 00000000
11111111 11111111 00000000 00000000
11111111 11111110 00000000 00000000
11111111 11111100 00000000 00000000
11111111 11111000 00000000 00000000
11111111 11110000 00000000 00000000
11111111 11100000 00000000 00000000
11111111 11000000 00000000 00000000
11111111 10000000 00000000 00000000
11111111 00000000 00000000 00000000
11111110 00000000 00000000 00000000
11111100 00000000 00000000 00000000
11111000 00000000 00000000 00000000
11110000 00000000 00000000 00000000
11100000 00000000 00000000 00000000
11000000 00000000 00000000 00000000
10000000 00000000 00000000 00000000
Prefix: /30
IPv6 = fe80::52e5:49ff:fe8b:599
Netmask = ffff:ffff:ffff:ffff::
11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
Prefix: /64
----------------------------------------
Name: ppp0
Description: (null)
Flags: UP Running Not-Applicable

IPv4 = 84.241.46.220
Netmask = 255.255.255.255
11111111 11111111 11111111 11111111
11111111 11111111 11111111 11111110
11111111 11111111 11111111 11111100
11111111 11111111 11111111 11111000
11111111 11111111 11111111 11110000
11111111 11111111 11111111 11100000
11111111 11111111 11111111 11000000
11111111 11111111 11111111 10000000
11111111 11111111 11111111 00000000
11111111 11111111 11111110 00000000
11111111 11111111 11111100 00000000
11111111 11111111 11111000 00000000
11111111 11111111 11110000 00000000
11111111 11111111 11100000 00000000
11111111 11111111 11000000 00000000
11111111 11111111 10000000 00000000
11111111 11111111 00000000 00000000
11111111 11111110 00000000 00000000
11111111 11111100 00000000 00000000
11111111 11111000 00000000 00000000
11111111 11110000 00000000 00000000
11111111 11100000 00000000 00000000
11111111 11000000 00000000 00000000
11111111 10000000 00000000 00000000
11111111 00000000 00000000 00000000
11111110 00000000 00000000 00000000
11111100 00000000 00000000 00000000
11111000 00000000 00000000 00000000
11110000 00000000 00000000 00000000
11100000 00000000 00000000 00000000
11000000 00000000 00000000 00000000
10000000 00000000 00000000 00000000
Prefix: /32
----------------------------------------
Name: tun1
Description: (null)
Flags: UP Running Connected

IPv4 = 10.1.1.10
Netmask = 255.255.255.252
11111111 11111111 11111111 11111100
11111111 11111111 11111111 11111000
11111111 11111111 11111111 11110000
11111111 11111111 11111111 11100000
11111111 11111111 11111111 11000000
11111111 11111111 11111111 10000000
11111111 11111111 11111111 00000000
11111111 11111111 11111110 00000000
11111111 11111111 11111100 00000000
11111111 11111111 11111000 00000000
11111111 11111111 11110000 00000000
11111111 11111111 11100000 00000000
11111111 11111111 11000000 00000000
11111111 11111111 10000000 00000000
11111111 11111111 00000000 00000000
11111111 11111110 00000000 00000000
11111111 11111100 00000000 00000000
11111111 11111000 00000000 00000000
11111111 11110000 00000000 00000000
11111111 11100000 00000000 00000000
11111111 11000000 00000000 00000000
11111111 10000000 00000000 00000000
11111111 00000000 00000000 00000000
11111110 00000000 00000000 00000000
11111100 00000000 00000000 00000000
11111000 00000000 00000000 00000000
11110000 00000000 00000000 00000000
11100000 00000000 00000000 00000000
11000000 00000000 00000000 00000000
10000000 00000000 00000000 00000000
Prefix: /30
IPv6 = fe80::3422:94a9:3011:7e6c
Netmask = ffff:ffff:ffff:ffff::
11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
Prefix: /64
----------------------------------------
Name: any
Description: Pseudo-device that captures on all interfaces
Flags: UP Running Not-Applicable

----------------------------------------
Name: lo
Description: (null)
Flags: UP Running Loopback Not-Applicable

IPv4 = 127.0.0.1
Netmask = 255.0.0.0
11111111 00000000 00000000 00000000
11111110 00000000 00000000 00000000
11111100 00000000 00000000 00000000
11111000 00000000 00000000 00000000
11110000 00000000 00000000 00000000
11100000 00000000 00000000 00000000
11000000 00000000 00000000 00000000
10000000 00000000 00000000 00000000
Prefix: /8
IPv6 = ::1
Netmask = ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111
Prefix: /128
----------------------------------------
Name: bluetooth-monitor
Description: Bluetooth Linux Monitor
Flags: Down Wireless Not-Applicable

----------------------------------------
Name: nflog
Description: Linux netfilter log (NFLOG) interface
Flags: Down Not-Applicable

----------------------------------------
Name: nfqueue
Description: Linux netfilter queue (NFQUEUE) interface
Flags: Down Not-Applicable

----------------------------------------
Name: dbus-system
Description: D-Bus system bus
Flags: Down Not-Applicable

----------------------------------------
Name: dbus-session
Description: D-Bus session bus
Flags: Down Not-Applicable
libpcap-programming/start.txt · آخرین ویرایش: 2024/06/19 00:07 توسط pejman

به جز مواردی که ذکر می‌شود، مابقی محتویات ویکی تحت مجوز زیر می‌باشند: Public Domain
Public Domain Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki