Exemplo n.º 1
0
void send_rawip(void)
{
    char *packet;

    packet = malloc(data_size);
    if (packet == NULL)
    {
        perror("[send_rawip] malloc()");
        return;
    }
    memset(packet, 0, data_size);
    data_handler(packet, data_size);
    send_ip_handler(packet, data_size);
    free(packet);
}
Exemplo n.º 2
0
void send_icmp_timestamp(void)
{
    char *packet;
    struct myicmphdr *icmp;
    struct icmp_tstamp_data *tstamp_data;

    packet = malloc(ICMPHDR_SIZE + sizeof(struct icmp_tstamp_data));
    if (packet == NULL) {
        perror("[send_icmp] malloc");
        return;
    }

    memset(packet, 0, ICMPHDR_SIZE + sizeof(struct icmp_tstamp_data));

    icmp = (struct myicmphdr*) packet;
    tstamp_data = (struct icmp_tstamp_data*) (packet + ICMPHDR_SIZE);

    /* fill icmp hdr */
    icmp->type = opt_icmptype;	/* echo replay or echo request */
    icmp->code = 0;
    icmp->checksum = 0;
    icmp->un.echo.id = getpid() & 0xffff;
    icmp->un.echo.sequence = _icmp_seq;
    tstamp_data->orig = htonl(get_midnight_ut_ms());
    tstamp_data->recv = tstamp_data->tran = 0;

    /* icmp checksum */
    if (icmp_cksum == -1)
        icmp->checksum = cksum((u_short*)packet, ICMPHDR_SIZE +
                               sizeof(struct icmp_tstamp_data));
    else
        icmp->checksum = icmp_cksum;

    /* adds this pkt in delaytable */
    if (opt_icmptype == ICMP_TIMESTAMP)
        delaytable_add(_icmp_seq, 0, time(NULL), get_usec(), S_SENT);

    /* send packet */
    send_ip_handler(packet, ICMPHDR_SIZE + sizeof(struct icmp_tstamp_data));
    free (packet);

    _icmp_seq++;
}
Exemplo n.º 3
0
void send_icmp_echo(void)
{
    char *packet, *data;
    struct myicmphdr *icmp;

    packet = malloc(ICMPHDR_SIZE + data_size);
    if (packet == NULL) {
        perror("[send_icmp] malloc");
        return;
    }

    memset(packet, 0, ICMPHDR_SIZE + data_size);

    icmp = (struct myicmphdr*) packet;
    data = packet + ICMPHDR_SIZE;

    /* fill icmp hdr */
    icmp->type = opt_icmptype;	/* echo replay or echo request */
    icmp->code = opt_icmpcode;	/* should be indifferent */
    icmp->checksum = 0;
    icmp->un.echo.id = getpid() & 0xffff;
    icmp->un.echo.sequence = _icmp_seq;

    /* data */
    data_handler(data, data_size);

    /* icmp checksum */
    if (icmp_cksum == -1)
        icmp->checksum = cksum((u_short*)packet, ICMPHDR_SIZE + data_size);
    else
        icmp->checksum = icmp_cksum;

    /* adds this pkt in delaytable */
    if (opt_icmptype == ICMP_ECHO)
        delaytable_add(_icmp_seq, 0, time(NULL), get_usec(), S_SENT);

    /* send packet */
    send_ip_handler(packet, ICMPHDR_SIZE + data_size);
    free (packet);

    _icmp_seq++;
}
Exemplo n.º 4
0
void send_icmp_address(void)
{
    char *packet;
    struct myicmphdr *icmp;

    packet = malloc(ICMPHDR_SIZE + 4);
    if (packet == NULL) {
        perror("[send_icmp] malloc");
        return;
    }

    memset(packet, 0, ICMPHDR_SIZE + 4);

    icmp = (struct myicmphdr*) packet;

    /* fill icmp hdr */
    icmp->type = opt_icmptype;	/* echo replay or echo request */
    icmp->code = 0;
    icmp->checksum = 0;
    icmp->un.echo.id = getpid() & 0xffff;
    icmp->un.echo.sequence = _icmp_seq;
    memset(packet+ICMPHDR_SIZE, 0, 4);

    /* icmp checksum */
    if (icmp_cksum == -1)
        icmp->checksum = cksum((u_short*)packet, ICMPHDR_SIZE + 4);
    else
        icmp->checksum = icmp_cksum;

    /* adds this pkt in delaytable */
    if (opt_icmptype == ICMP_TIMESTAMP)
        delaytable_add(_icmp_seq, 0, time(NULL), get_usec(), S_SENT);

    /* send packet */
    send_ip_handler(packet, ICMPHDR_SIZE + 4);
    free (packet);

    _icmp_seq++;
}
Exemplo n.º 5
0
void send_icmp_other(void)
{
    char *packet, *data, *ph_buf;
    struct myicmphdr *icmp;
    struct myiphdr icmp_ip;
    struct myudphdr *icmp_udp;
    int udp_data_len = 0;
    struct pseudohdr *pseudoheader;
    int left_space = IPHDR_SIZE + UDPHDR_SIZE + data_size;

    packet = malloc(ICMPHDR_SIZE + IPHDR_SIZE + UDPHDR_SIZE + data_size);
    ph_buf = malloc(PSEUDOHDR_SIZE + UDPHDR_SIZE + udp_data_len);
    if (packet == NULL || ph_buf == NULL) {
        perror("[send_icmp] malloc");
        return;
    }

    memset(packet, 0, ICMPHDR_SIZE + IPHDR_SIZE + UDPHDR_SIZE + data_size);
    memset(ph_buf, 0, PSEUDOHDR_SIZE + UDPHDR_SIZE + udp_data_len);

    icmp = (struct myicmphdr*) packet;
    data = packet + ICMPHDR_SIZE;
    pseudoheader = (struct pseudohdr *) ph_buf;
    icmp_udp = (struct myudphdr *) (ph_buf + PSEUDOHDR_SIZE);

    /* fill icmp hdr */
    icmp->type = opt_icmptype;	/* ICMP_TIME_EXCEEDED */
    icmp->code = opt_icmpcode;	/* should be 0 (TTL) or 1 (FRAGTIME) */
    icmp->checksum = 0;
    if (opt_icmptype == ICMP_REDIRECT)
        memcpy(&icmp->un.gateway, &icmp_gw.sin_addr.s_addr, 4);
    else
        icmp->un.gateway = 0;	/* not used, MUST be 0 */

    /* concerned packet headers */
    /* IP header */
    icmp_ip.version  = icmp_ip_version;		/* 4 */
    icmp_ip.ihl      = icmp_ip_ihl;			/* IPHDR_SIZE >> 2 */
    icmp_ip.tos      = icmp_ip_tos;			/* 0 */
    icmp_ip.tot_len  = htons((icmp_ip_tot_len ? icmp_ip_tot_len : (icmp_ip_ihl<<2) + UDPHDR_SIZE + udp_data_len));
    icmp_ip.id       = htons(getpid() & 0xffff);
    icmp_ip.frag_off = 0;				/* 0 */
    icmp_ip.ttl      = 64;				/* 64 */
    icmp_ip.protocol = icmp_ip_protocol;		/* 6 (TCP) */
    icmp_ip.check	 = 0;
    memcpy(&icmp_ip.saddr, &icmp_ip_src.sin_addr.s_addr, 4);
    memcpy(&icmp_ip.daddr, &icmp_ip_dst.sin_addr.s_addr, 4);
    icmp_ip.check	 = cksum((__u16 *) &icmp_ip, IPHDR_SIZE);

    /* UDP header */
    memcpy(&pseudoheader->saddr, &icmp_ip_src.sin_addr.s_addr, 4);
    memcpy(&pseudoheader->daddr, &icmp_ip_dst.sin_addr.s_addr, 4);
    pseudoheader->protocol = icmp_ip.protocol;
    pseudoheader->lenght = icmp_ip.tot_len;
    icmp_udp->uh_sport = htons(icmp_ip_srcport);
    icmp_udp->uh_dport = htons(icmp_ip_dstport);
    icmp_udp->uh_ulen  = htons(UDPHDR_SIZE + udp_data_len);
    icmp_udp->uh_sum   = cksum((__u16 *) ph_buf, PSEUDOHDR_SIZE + UDPHDR_SIZE + udp_data_len);

    /* filling icmp body with concerned packet header */

    /* fill IP */
    if (left_space == 0) goto no_space_left;
    memcpy(packet+ICMPHDR_SIZE, &icmp_ip, left_space);
    left_space -= IPHDR_SIZE;
    data += IPHDR_SIZE;
    if (left_space <= 0) goto no_space_left;

    /* fill UDP */
    memcpy(packet+ICMPHDR_SIZE+IPHDR_SIZE, icmp_udp, left_space);
    left_space -= UDPHDR_SIZE;
    data += UDPHDR_SIZE;
    if (left_space <= 0) goto no_space_left;

    /* fill DATA */
    data_handler(data, left_space);
no_space_left:

    /* icmp checksum */
    if (icmp_cksum == -1)
        icmp->checksum = cksum((u_short*)packet, ICMPHDR_SIZE + IPHDR_SIZE + UDPHDR_SIZE + data_size);
    else
        icmp->checksum = icmp_cksum;

    /* send packet */
    send_ip_handler(packet, ICMPHDR_SIZE + IPHDR_SIZE + UDPHDR_SIZE + data_size);
    free (packet);
    free (ph_buf);
}