示例#1
0
文件: main.c 项目: huap/pig
static int run_pig_run(const char *signatures, const char *targets, const char *timeout, const char *single_test, const char *gw_addr, const char *nt_mask, const char *loiface) {
    int timeo = 10000;
    pigsty_entry_ctx *pigsty = NULL;
    size_t signatures_count = 0, addr_count = 0;
    pigsty_entry_ctx *signature = NULL, *sp = NULL;
    pig_target_addr_ctx *addr = NULL, *addr_p = NULL;
    pig_hwaddr_ctx *hwaddr = NULL;
    int sockfd = -1;
    int retval = 0;
    unsigned int nt_mask_addr[4] = { 0, 0, 0, 0 };
    unsigned char *gw_hwaddr = NULL, *temp = NULL;
    in_addr_t gw_in_addr = 0;
    if (timeout != NULL) {
        timeo = atoi(timeout);
    }
    timeo = timeo * 1000;
    if (!should_be_quiet) {
        printf("pig INFO: starting up pig engine...\n\n");
    }
    sockfd = init_raw_socket(loiface);
    if (sockfd == -1) {
        printf("pig PANIC: unable to create the socket.\npig ERROR: aborted.\n");
        return 1;
    }
    pigsty = load_signatures(signatures);
    if (pigsty == NULL) {
        printf("pig ERROR: aborted.\n");
        deinit_raw_socket(sockfd);
        return 1;
    }
    if (targets != NULL) {
        if (!should_be_quiet) {
            printf("\npig INFO: parsing the supplied targets...\n");
            printf("pig INFO: all targets were parsed.\n");
        }
        addr = parse_targets(targets);
    }
    if (is_targets_option_required(pigsty) && addr == NULL) {
        printf("pig PANIC: --targets option is required by some loaded signatures.\n");
        deinit_raw_socket(sockfd);
        del_pigsty_entry(pigsty);
        return 1;
    }
    signatures_count = get_pigsty_entry_count(pigsty);
    if (!should_be_quiet) {
        printf("\npig INFO: done (%d signature(s) read).\n\n", signatures_count);
    }
    if (nt_mask == NULL) {
        printf("\npig PANIC: --net-mask option is required.\n");
        deinit_raw_socket(sockfd);
        del_pigsty_entry(pigsty);
        return 1;
    }
    //  WARN(Santiago): by now IPv4 only.
    if (verify_ipv4_addr(nt_mask) == 0) {
        printf("pig PANIC: --net-mask has an invalid ip address.\n");
        deinit_raw_socket(sockfd);
        del_pigsty_entry(pigsty);
        return 1;
    }
    nt_mask_addr[0] = htonl(inet_addr(nt_mask));
    if (gw_addr != NULL && loiface != NULL) {
        gw_in_addr = inet_addr(gw_addr);
        temp = get_mac_by_addr(gw_in_addr, loiface, 2);
        if (!should_be_quiet && temp != NULL) {
            gw_hwaddr = mac2byte(temp, strlen(temp));
            printf("pig INFO: the gateway's physical address is \"%s\"...\n"
                   "pig INFO: the local interface is \"%s\"...\n"
                   "pig INFO: the network mask is \"%s\"...\n\n", temp, loiface, nt_mask);
            free(temp);
        }
    }
    if (gw_hwaddr != NULL) {
        signature = get_pigsty_entry_by_index(rand() % signatures_count, pigsty);
        if (single_test == NULL) {
            while (!should_exit) {
                if (signature == NULL) {
                    continue; //  WARN(Santiago): It should never happen. However... Sometimes... The World tends to be a rather weird place.
                }
                if (oink(signature, &hwaddr, addr, sockfd, gw_hwaddr, nt_mask_addr, loiface) != -1) {
                    if (!should_be_quiet) {
                        printf("pig INFO: a packet based on signature \"%s\" was sent.\n", signature->signature_name);
                    }
                    usleep(timeo);
                }
                signature = get_pigsty_entry_by_index(rand() % signatures_count, pigsty);
            }
        } else {
            retval = (oink(signature, &hwaddr, addr, sockfd, gw_hwaddr, nt_mask_addr, loiface) != -1 ? 0 : 1);
            if (retval == 0) {
                if (!should_be_quiet) {
                    printf("pig INFO: a packet based on signature \"%s\" was sent.\n", signature->signature_name);
                }
            }
        }
        free(gw_hwaddr);
    } else {
        printf("\npig PANIC: unable to get the gateway's physical address.\n");
    }
    del_pigsty_entry(pigsty);
    del_pig_target_addr(addr);
    del_pig_hwaddr(hwaddr);
    deinit_raw_socket(sockfd);
    return retval;
}
示例#2
0
文件: main.c 项目: nola-radar/pig
CUTE_TEST_CASE(pigsty_entry_ctx_tests)
    pigsty_entry_ctx *pigsty = NULL, *p;
    pigsty = add_signature_to_pigsty_entry(pigsty, "oink");
    pigsty = add_signature_to_pigsty_entry(pigsty, "roc!");
    CUTE_CHECK("pigsty == NULL", pigsty != NULL);
    CUTE_CHECK("pigsty->signature_name != oink", strcmp(pigsty->signature_name, "oink") == 0);
    CUTE_CHECK("pigsty->next == NULL", pigsty->next != NULL);
    CUTE_CHECK("pigsty->next->signature_name != roc!", strcmp(pigsty->next->signature_name, "roc!") == 0);
    CUTE_CHECK("pigsty->next->next != NULL", pigsty->next->next == NULL);
    p = get_pigsty_entry_signature_name("oink", pigsty);
    CUTE_CHECK("p == NULL", p != NULL);
    CUTE_CHECK("p->signature_name != oink", strcmp(p->signature_name, "oink") == 0);
    p = get_pigsty_entry_signature_name("not-added", pigsty);
    CUTE_CHECK("p != NULL", p == NULL);
    CUTE_CHECK("get_pigsty_entry_count() != 2", get_pigsty_entry_count(pigsty) == 2);
    p = get_pigsty_entry_by_index(1, pigsty);
    CUTE_CHECK("p == NULL", p != NULL);
    CUTE_CHECK("p->signature_name != roc!", strcmp(p->signature_name, "roc!") == 0);
    p = get_pigsty_entry_by_index(-1, pigsty);
    CUTE_CHECK("p != NULL", p == NULL);
    del_pigsty_entry(pigsty);
CUTE_TEST_CASE_END

CUTE_TEST_CASE(pigsty_conf_set_ctx_tests)
    pigsty_entry_ctx *pigsty = NULL;
    pigsty_conf_set_ctx *cp = NULL;
    pigsty = add_signature_to_pigsty_entry(pigsty, "oink");
    CUTE_CHECK("pigsty == NULL", pigsty != NULL);
    char *data = "abc";
    pigsty->conf = add_conf_to_pigsty_conf_set(pigsty->conf, kIpv4_version, data, strlen(data));
    pigsty->conf = add_conf_to_pigsty_conf_set(pigsty->conf, kIpv4_tos, "xyz.", 4);