본문 바로가기
코스웨어/15년 스마트컨트롤러

20150522 packet analyzer 소스코드

by 알 수 없는 사용자 2015. 5. 22.
728x90
반응형
#include <stdio.h>
#include <pcap/pcap.h>
#include <net/ethernet.h>
#include <arpa/inet.h>
#include <netinet/ip.h>

void printIP(const void *vp);
void printEther(const void *vp);
void hexaview(const void *vp, unsigned int uilen);

int main(void)
{
    char *cpNICNAME;
    char caErrmsg[PCAP_ERRBUF_SIZE];
    pcap_t *stpDS;
    const unsigned char *ucpData;
    struct pcap_pkthdr stInfo;
        
    cpNICNAME = pcap_lookupdev(caErrmsg);
    if0 == cpNICNAME )
    {
        printf("caErrmsg : [%s] \n", caErrmsg);
        return 100;
    }
    printf("cpNICNAME : [%s] \n", cpNICNAME);
    

    stpDS = pcap_open_live( cpNICNAME , 1500 , 1 , 0 , caErrmsg );
    ucpData = pcap_next(stpDS, &stInfo);

    
    printEther(ucpData);
    
    if( ETH_P_IP == ntohs( *((short *)(ucpData + 12) ) )  )
    {
        printIP(ucpData + sizeof(struct ether_header));
    }

    hexaview(ucpData, 400);




    pcap_close(stpDS);
    return 0;
}

void printIP(const void *vp)
{
    const struct ip *v = vp;
    printf("IP version : %d \n", v->ip_v);
    printf("Header Length : %d byte \n", v->ip_hl * 4);
    printf("Type of Service : 0x%02X \n", v->ip_tos);
    printf("Total Length : %d byte \n", ntohs(v->ip_len));


    printf("Src IP : %s \n", inet_ntoa(v->ip_src));
    printf("Dst IP : %s \n", inet_ntoa(v->ip_dst));
}

void printEther(const void *vp)
{
    int iCnt;

    printf("Dest MAC : ");
    for(iCnt = 0; iCnt < ETH_ALEN; iCnt++)
    {
        printf("%02X", ((struct ether_header *)vp)->ether_dhost[iCnt]);
        printf(":");
    }
    printf("\b \n");
    
    printf("Src  MAC : ");
    for(iCnt = 0; iCnt < ETH_ALEN; iCnt++)
    {
        printf("%02X", ((struct ether_header *)vp)->ether_shost[iCnt]);
        printf(":");
    }
    printf("\b \n");
    
    printf("Next Layer : ");
    
    switch( ntohs( ((struct ether_header *)vp)->ether_type ))
    {
        case ETH_P_LOOP : 
            printf("Ethernet Loopback packet");
            break;
        case ETH_P_PUP : 
            printf("Xerox PUP packet");
            break;
        case ETH_P_PUPAT : 
            printf("Xerox PUP Addr Trans packet");
            break;
        case ETH_P_IP : 
            printf("Internet Protocol packet");
            break;
        case ETH_P_X25 : 
            printf("CCITT X.25");
            break;
        case ETH_P_ARP : 
            printf("Address Resolution packet");
            break;
        case ETH_P_BPQ : 
            printf("G8BPQ AX.25 Ethernet Packet  [ NOT AN OFFICIALLY REGISTERED ID ]");
            break;
        case ETH_P_IEEEPUP : 
            printf("Xerox IEEE802.3 PUP packet");
            break;
        case ETH_P_IEEEPUPAT : 
            printf("Xerox IEEE802.3 PUP Addr Trans packet");
            break;
        case ETH_P_DEC : 
            printf("DEC Assigned proto");
            break;
        case ETH_P_DNA_DL : 
            printf("DEC DNA Dum");
            break;
        case ETH_P_DNA_RC : 
            printf("DEC DNA Remote Console");
            break;
        case ETH_P_DNA_RT : 
            printf("DEC DNA Routing");
            break;
        case ETH_P_LAT : 
            printf("DEC LAT");
            break;
        case ETH_P_DIAG : 
            printf("DEC Diagnostics");
            break;
        case ETH_P_CUST : 
            printf("DEC Customer use");
            break;
        case ETH_P_SCA : 
            printf("DEC Systems Comms Arch");
            break;
        case ETH_P_TEB : 
            printf("Trans Ether Bridging");
            break;
        case ETH_P_RARP : 
            printf("Reverse Addr Res packet");
            break;
        case ETH_P_ATALK : 
            printf("Appletalk DDP");
            break;
        case ETH_P_AARP : 
            printf("Appletalk AARP");
            break;
        case ETH_P_8021Q : 
            printf("802.1Q VLAN Extended Header");
            break;
        case ETH_P_IPX : 
            printf("IPX over DIX");
            break;
        case ETH_P_IPV6 : 
            printf("IPv6 over bluebook");
            break;
        case ETH_P_PAUSE : 
            printf("IEEE Pause frames. See 802.3 31B");
            break;
        case ETH_P_SLOW : 
            printf("Slow Protocol. See 802.3ad 43B");
            break;
        case ETH_P_WCCP : 
            printf("Web-cache coordination protocol defined in draft-wilson-wrec-wccp-v2-00.txt");
            break;
        case ETH_P_PPP_DISC : 
            printf("PPPoE discovery messages");
            break;
        case ETH_P_PPP_SES : 
            printf("PPPoE session messages");
            break;
        case ETH_P_MPLS_UC : 
            printf("MPLS Unicast traffic");
            break;
        case ETH_P_MPLS_MC : 
            printf("MPLS Multicast traffic");
            break;
        case ETH_P_ATMMPOA : 
            printf("MultiProtocol Over ATM");
            break;
        case ETH_P_LINK_CTL : 
            printf("HPNA, wlan link local tunnel");
            break;
        case ETH_P_ATMFATE : 
            printf("Frame-based ATM Transport over Ethernet");
            break;
        case ETH_P_PAE : 
            printf("Port Access Entity (IEEE 802.1X)");
            break;
        case ETH_P_AOE : 
            printf("ATA over Ethernet");
            break;
        case ETH_P_8021AD : 
            printf("802.1ad Service VLAN");
            break;
        case ETH_P_TIPC : 
            printf("TIPC");
            break;
        case ETH_P_8021AH : 
            printf("802.1ah Backbone Service Tag");
            break;
        case ETH_P_1588 : 
            printf("IEEE 1588 Timesync");
            break;
        case ETH_P_FCOE : 
            printf("Fibre Channel over Ethernet");
            break;
        case ETH_P_TDLS : 
            printf("TDLS");
            break;
        case ETH_P_FIP : 
            printf("FCoE Initialization Protocol");
            break;
        case ETH_P_QINQ1 : 
            printf("deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ]");
            break;
        case ETH_P_QINQ2 : 
            printf("deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ]");
            break;
        case ETH_P_QINQ3 : 
            printf("deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ]");
            break;
        case ETH_P_EDSA : 
            printf("Ethertype DSA [ NOT AN OFFICIALLY REGISTERED ID ]");
            break;
        case ETH_P_AF_IUCV : 
            printf("IBM af_iucv [ NOT AN OFFICIALLY REGISTERED ID ]");
            break;
        case ETH_P_802_3 : 
            printf("Dummy type for 802.3 frames");
            break;
        case ETH_P_AX25 : 
            printf("Dummy protocol id for AX.25");
            break;
        case ETH_P_ALL : 
            printf("Every packet (be careful!!!)");
            break;
        case ETH_P_802_2 : 
            printf("802.2 frames");
            break;
        case ETH_P_SNAP : 
            printf("Internal only");
            break;
        case ETH_P_DDCMP : 
            printf("DEC DDCMP: Internal only");
            break;
        case ETH_P_WAN_PPP : 
            printf("Dummy type for WAN PPP frames");
            break;
        case ETH_P_PPP_MP : 
            printf("Dummy type for PPP MP frames");
            break;
        case ETH_P_LOCALTALK : 
            printf("Localtalk pseudo type");
            break;
        case ETH_P_CAN : 
            printf("Controller Area Network");
            break;
        case ETH_P_PPPTALK : 
            printf("Dummy type for Atalk over PPP");
            break;
        case ETH_P_TR_802_2 : 
            printf("802.2 frames");
            break;
        case ETH_P_MOBITEX : 
            printf("Mobitex (kaz@cafe.net)");
            break;
        case ETH_P_CONTROL : 
            printf("Card specific control frames");
            break;
        case ETH_P_IRDA : 
            printf("Linux-IrDA");
            break;
        case ETH_P_ECONET : 
            printf("Acorn Econet");
            break;
        case ETH_P_HDLC : 
            printf("HDLC frames");
            break;
        case ETH_P_ARCNET : 
            printf("1A for ArcNet :-)");
            break;
        case ETH_P_DSA : 
            printf("Distributed Switch Arch.");
            break;
        case ETH_P_TRAILER : 
            printf("Trailer switch tagging");
            break;
        case ETH_P_PHONET : 
            printf("Nokia Phonet frames");
            break;
        case ETH_P_IEEE802154 : 
            printf("IEEE802.15.4 frame");
            break;
        case ETH_P_CAIF : 
            printf("ST-Ericsson CAIF protocol");
            break;
    }
    putchar('\n');

}


void hexaview(const void *vp, unsigned int uilen)
{
    unsigned int uiCnt;
    unsigned int uiLine;

    printf("==============================================================================\n");
    printf(" Address                         Hexa                              ASCII\n");
    printf("------------------------------------------------------------------------------\n");

    for (uiLine = 0; uiLine < uilen; uiLine = uiLine + 16)
    {

        printf(" %08X  ", uiLine);//vp);

        for (uiCnt = 0; uiCnt < 16; ++uiCnt)
        {
            printf("%02X ", *((unsigned char *)vp));
            vp = (char *)vp + 1;
            if (uiCnt == 7) putchar(' ');
        }
        vp = (char *)vp - 16;


        putchar(' ');
        for (uiCnt = 0; uiCnt < 16; ++uiCnt)
        {
            if (32 > *((unsigned char *)vp))
            {
                putchar('.');
            }
            else if (127 < *((unsigned char *)vp))  
            {
                putchar('.');
            }
            else
            {
                printf("%c", *((unsigned char *)vp));
            }

            vp = (char *)vp + 1;
        }

        putchar('\n');
    }

    return;
}
728x90