⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ipobj.c

📁 著名的入侵检测系统snort的最新版本的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
        if (port2)        {            unsigned int i;            *port2 = '\0';            port2++;            if (*port1 == '\0' || *port2 == '\0')                return -1;            for (i = 0; i < strlen(port1); i++)            {                if (!isdigit((int)port1[i]))                    return -2;            }            for (i = 0; i < strlen(port2); i++)            {                if (!isdigit((int)port2[i]))                    return -2;            }            port_lo = atoi(port1);            port_hi = atoi(port2);        }        else        {            unsigned int i;            if (*port1 == '\0')                return -1;            for (i = 0; i < strlen(port1); i++)            {                if (!isdigit((int)port1[i]))                    return -2;            }            port_hi = port_lo = atoi(port1);                    }        /* check to see if port is out of range */        if ( port_hi > 65535 || port_lo > 65535)            return -3;        /* swap ports if necessary */        if (port_hi < port_lo)        {            unsigned tmp;            tmp = port_hi;            port_hi = port_lo;            port_lo = tmp;        }        portset_add(portset, port_lo, port_hi);        /* Move to next port/port range */        port_begin = port_end;        if (port_begin != portset_end)            port_begin++;        while (isspace((int)(*port_begin)))            port_begin++;        port_end = strpbrk(port_begin, " \t");        if (port_end == NULL)            port_end = portset_end;        else            *port_end = '\0';    }    return 0;}/**  * Break an IP4 Address down into its components  *  * @param ipstr string to parse * @param use network order for return values (defaults to host order) * @param not_flag return value if the ip is negated * @param host ipv4 host argument * @param mask ipv4 mask argument *  * @return 0 on sucess, else failure parsing the address * @retval -3 \0 encountered prematurely * @retval -2 strdup failed * @retval -1 null argument * @retval -4 out of range for CIDR notation */static int ip4_parse(char *ipstr, int network_order, int *not_flag, unsigned *host,                     unsigned *mask, PORTSET *portset){    char *saved, *s_copy, *maskptr, *endp, *portptr = NULL, *addrend;    struct in_addr addrstuff;    if(!ipstr || !not_flag || !host || !mask)         return -1;    if(*ipstr == '\0')        return -3;    saved = s_copy = strdup(ipstr);    if(!s_copy)    {        return -2;    }    else    {        while(isspace((int)*s_copy))            s_copy++;        if(*s_copy == '\0')        {            free(saved);            return -3;        }        if(*s_copy == '!')        {            *not_flag = 1;            s_copy++;            if(*s_copy == '\0')            {                free(saved);                return -3;            }        }        else        {            *not_flag = 0;        }        endp = strstr(s_copy, "]");        if (endp)        {            /* Removing trailing ']' */            *endp = 0;        }        endp = strstr(s_copy, ",");        if (endp)        {            /* Removing trailing ',' */            *endp = 0;        }        maskptr = strstr(s_copy, "/");        portptr = strstr(s_copy, ":");        if(!maskptr)        {            /* assume this is a host */            *mask = 0xFFFFFFFF;        }        else        {            *maskptr = '\0';            maskptr++;        }        if(!portptr)        {            /* no port */        }        else        {            *portptr = '\0';            portptr++;        }        /* this will just be the address part as *maskptr and *portptr == '\0'         * we shouldn't find anything after moving past trailing whitespace         */        addrend = strpbrk(s_copy, " \t");        if (addrend != NULL)        {            while (isspace((int)(*addrend)))                addrend++;            if (*addrend != '\0')            {                free(saved);                return -1;            }        }        if(strncmp(s_copy, "0", 1) == 0 || strncmp(s_copy, "0.0.0.0", 7) == 0)        {            *host = 0;        }        else if((addrstuff.s_addr = inet_addr(s_copy)) == -1)        {            if(!strncmp(s_copy, "255.255.255.255", 15))            {                addrstuff.s_addr = INADDR_BROADCAST;            }            else            {                /* invalid ip address! */                free(saved);                return -3;            }        }        else        {            *host = ntohl(addrstuff.s_addr);        }                    if(maskptr)        {            char *maskend;            while (isspace((int)(*maskptr)))                maskptr++;            if(*maskptr == '\0')            {                /* Nothing beyond the / -- no bits in CIDR */                free(saved);                return -3;            }            /* make sure if there are spaces at the end that we don't find             * any more stuff, like another address that wasn't separated             * with a comma             */            maskend = strpbrk(maskptr, " \t");            if (maskend != NULL)            {                while (isspace((int)(*maskend)))                    maskend++;                if (*maskend != '\0')                {                    free(saved);                    return -1;                }            }            if(strstr(maskptr, "."))            {                if(strncmp(maskptr, "0", 1) == 0 || strncmp(maskptr, "0.0.0.0", 7) == 0)                {                    *mask = 0;                }                else if((addrstuff.s_addr = inet_addr(maskptr)) == -1)                {                    if(strncmp(maskptr, "255.255.255.255", 15) == 0)                    {                        addrstuff.s_addr = INADDR_BROADCAST;                    }                    else                    {                        /* invalid ip address! */                        free(saved);                        return -3;                    }                }                else                {                    *mask = ntohl(addrstuff.s_addr);                }                       }            else            {                int blocksize = atoi(maskptr);                int i;                if(blocksize == 0)                {                    *mask = 0;                }                else if(blocksize < 1 || blocksize > 32)                {                    free(saved);                    return -4;                }                else                {                    *mask = 0;                    for(i=0;i<blocksize;i++)                    {                        (*mask) |= (1 << 31) >> i;                    }                }            }        }        if(portptr)        {                        while (isspace((int)(*portptr)))                portptr++;            if (*portptr == '\0')            {                free(saved);                return -5;            }            if (port_parse(portptr, portset) != 0)            {                free(saved);                return -6;            }        }        else        {            /* Make sure we have at least one port range in list, but an invalid port range */            portset_add(portset, 0, 0);        }    }    /* convert the arguments by default */    if(network_order)    {        *mask = htonl(*mask);        *host = htonl(*host);	    }    free(saved);    return 0;}int ip4_setparse(IPSET *ipset, char *ipstr) {    char *copy, *startIP, *endIP;    int parse_count = 0;    int set_not_flag = 0;    int item_not_flag;    unsigned host, mask;    PORTSET portset;    copy = strdup(ipstr);    if(!copy)        return -2;    startIP = copy;    if (*startIP == '!')    {        set_not_flag = 1;        startIP++;    }    while (startIP)    {        while (isspace((int)*startIP) || (*startIP == '[') )         {            startIP++;        }        if ((*startIP == ']') || (*startIP == '\0'))            break;        /* if not found, endIP will be NULL */        endIP = strstr(startIP, ",");        if (endIP)            *endIP = '\0';        portset_init(&portset);        if(ip4_parse(startIP, 0, &item_not_flag, &host, &mask, &portset) != 0)        {            free(copy);            return -5;        }        if(ipset_add(ipset, &host, &mask, &portset,                     (item_not_flag ^ set_not_flag), IPV4_FAMILY) != 0)        {            free(copy);            return -6;        }        parse_count++;        if (endIP)            endIP++;        startIP = endIP;    }    free(copy);    if (!parse_count)        return -7;     return 0;}#ifdef MAIN_IP#include <time.h>#ifndef WIN32#define rand   random#define srand srandom#endif#define MAXIP 100     #include "sflsq.c"void test_ip4_parsing(void){    unsigned host, mask, not_flag;    PORTSET  portset;    char **curip;    int ret;    IPADDRESS *adp;                    char *ips[] = {        "138.26.1.24:25",        "1.1.1.1/255.255.255.0:444",        "1.1.1.1/16:25-28",        "1.1.1.1/255.255.255.255:25 27-29",        "z/24",        "0/0",        "0.0.0.0/0.0.0.0:25-26 28-29 31",        "0.0.0.0/0.0.2.0",        NULL };    for(curip = ips; curip[0] != NULL; curip++)    {        portset_init(&portset);        /* network byte order stuff */        if((ret = ip4_parse(curip[0], 1, &not_flag, &host, &mask, &portset)) != 0)        {            fprintf(stderr, "Unable to parse %s with ret %d\n", curip[0], ret);        }        else        {                        printf("%c", not_flag ? '!' : ' ');                        printf("%s/", inet_ntoa(*(struct in_addr *) &host));            printf("%s", inet_ntoa(*(struct in_addr *) &mask));            printf(" parsed successfully!\n");        }        /* host byte order stuff */        if((ret = ip4_parse(curip[0], 0, &not_flag, &host, &mask, &portset)) != 0)        {            fprintf(stderr, "Unable to parse %s with ret %d\n", curip[0], ret);        }        else        {            adp = ip_new(IPV4_FAMILY);            ip_set(adp, &host, IPV4_FAMILY);            ip_fprint(stdout, adp);            fprintf(stdout, "*****************\n");            ip_free(adp);                    }    }    return;}void test_ip4set_parsing(void){    char **curip;    int ret;    char *ips[] = {        "12.24.24.1/32,!24.24.24.1",        "[0.0.0.0/0.0.2.0,241.242.241.22]",        "138.26.1.24",        "1.1.1.1",        "1.1.1.1/16",        "1.1.1.1/255.255.255.255",        "z/24",        "0/0",        "0.0.0.0/0.0.0.0",        "0.0.0.0/0.0.2.0",                            NULL };    for(curip = ips; curip[0] != NULL; curip++)    {        IPSET *ipset = ipset_new(IPV4_FAMILY);        /* network byte order stuff */        if((ret = ip4_setparse(ipset, curip[0])) != 0)        {            ipset_free(ipset);            fprintf(stderr, "Unable to parse %s with ret %d\n", curip[0], ret);        }        else        {            printf("-[%s]\n ", curip[0]);            ipset_print(ipset);            printf("---------------------\n ");        }    }    return;}//  -----------------------------void test_ip(){    int            i,k;    IPADDRESS    * ipa[MAXIP];    unsigned       ipaddress,ipx;    unsigned short ipaddress6[8], ipx6[8];    printf("IPADDRESS testing\n");    srand( time(0) );    for(i=0;i<MAXIP;i++)    {        if( i % 2 )        {            ipa[i]= ip_new(IPV4_FAMILY);            ipaddress = rand() * rand();            ip_set( ipa[i], &ipaddress, IPV4_FAMILY  );            if( !ip_equal(ipa[i],&ipaddress, IPV4_FAMILY ) )                printf("error with ip_equal\n");            ip_get( ipa[i], &ipx, IPV4_FAMILY );            if( ipx != ipaddress )                printf("error with ip_get\n");        }        else        {            ipa[i]= ip_new(IPV6_FAMILY);            for(k=0;k<8;k++) ipaddress6[k] = (char) (rand() % (1<<16));             ip_set( ipa[i], ipaddress6, IPV6_FAMILY  );            if( !ip_equal(ipa[i],&ipaddress6, IPV6_FAMILY ) )                printf("error with ip6_equal\n");            ip_get( ipa[i], ipx6, IPV6_FAMILY  );            for(k=0;k<8;k++)                if( ipx6[k] != ipaddress6[k] )                    printf("error with ip6_get\n");        }        printf("[%d] ",i);        ip_fprint(stdout,ipa[i]);        printf("\n");    }    printf("IP testing completed\n");}//  -----------------------------void test_ipset(){    int      i,k;    IPSET  * ipset, * ipset6;    IPSET  * ipset_copyp, * ipset6_copyp;    unsigned ipaddress, mask;    unsigned short mask6[8];    unsigned short ipaddress6[8];    unsigned port_lo, port_hi;    PORTSET        portset;    printf("IPSET testing\n");    ipset  = ipset_new(IPV4_FAMILY);    ipset6 = ipset_new(IPV6_FAMILY);    srand( time(0) );    for(i=0;i<MAXIP;i++)    {        if( i % 2 )        {            ipaddress = rand() * rand();            mask = 0xffffff00;            port_lo = rand();            port_hi = rand() % 5 + port_lo;            portset_init(&portset);            portset_add(&portset, port_lo, port_hi);            ipset_add( ipset, &ipaddress, &mask, &portset, 0, IPV4_FAMILY ); //class C cidr blocks            if( !ipset_contains( ipset, &ipaddress, &port_lo, IPV4_FAMILY ) )                printf("error with ipset_contains\n");        }        else        {            for(k=0;k<8;k++) ipaddress6[k] = (char) (rand() % (1<<16));             for(k=0;k<8;k++) mask6[k] = 0xffff;            port_lo = rand();            port_hi = rand() % 5 + port_lo;            portset_init(&portset);            portset_add(&portset, port_lo, port_hi);            ipset_add( ipset6, ipaddress6, mask6, &portset, 0, IPV6_FAMILY );            if( !ipset_contains( ipset6, &ipaddress6, &port_lo, IPV6_FAMILY ) )                printf("error with ipset6_contains\n");        }    }    ipset_copyp = ipset_copy( ipset );    ipset6_copyp = ipset_copy( ipset6 );    printf("-----IP SET-----\n");    ipset_print( ipset );    printf("\n");    printf("-----IP SET6-----\n");    ipset_print( ipset6 );    printf("\n");    printf("-----IP SET COPY -----\n");    ipset_print( ipset_copyp );    printf("\n");    printf("-----IP SET6 COPY -----\n");    ipset_print( ipset6_copyp );    printf("\n");    printf("IP set testing completed\n");}//  -----------------------------int main( int argc, char ** argv ){    printf("ipobj \n");    test_ip();    test_ipset();    test_ip4_parsing();    test_ip4set_parsing();    printf("normal pgm completion\n");    return 0;}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -