UDP Raw Soset set message - PullRequest
       2

UDP Raw Soset set message

1 голос
/ 31 марта 2012

Итак, у меня есть необработанные сокеты с некоторой копипастой, она отправляет данные, эта часть работает нормально. Но как мне настроить передачу данных через сокет? Я ищу DNS-запрос, если это поможет. Код ниже.

int main(int argc, char *argv[])
{
    if (!argv[1])
    {
        printf("Target not specified!\nUsage: ");
        printf(argv[0]);
        printf(" <target>\n");
        exit(1);
    }

    struct ip ip;
    struct udphdr udp;
    int sd;
    const int on = 1;
    struct sockaddr_in sin;
    //char msg[] = "\x03\xF0\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x01";
    u_char *packet;
    packet = (u_char *)malloc(120);


    ip.ip_hl = 0x5;
    ip.ip_v = 0x4;
    ip.ip_tos = 0x0;
    ip.ip_len = 60;
    ip.ip_id = htons(12830);
    ip.ip_off = 0x0;
    ip.ip_ttl = 64;
    ip.ip_p = IPPROTO_UDP;
    ip.ip_sum = 0x0;
    ip.ip_src.s_addr = inet_addr(argv[1]);
    ip.ip_dst.s_addr = inet_addr("67.228.44.4");
    ip.ip_sum = in_cksum((unsigned short *)&ip, sizeof(ip));
    memcpy(packet, &ip, sizeof(ip));

    udp.source = htons(80);
    udp.dest = htons(53);
    udp.len = htons(22);
    udp.check = 0;
    udp.check = in_cksum_udp(ip.ip_src.s_addr, ip.ip_dst.s_addr, (unsigned short *)&udp, sizeof(udp));
    memcpy(packet + 20, &udp, sizeof(udp));

    if ((sd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) {
        perror("raw socket");
        exit(1);
    }

    if (setsockopt(sd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0) {
        perror("setsockopt");
        exit(1);
    }
    memset(&sin, 0, sizeof(sin));
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = ip.ip_dst.s_addr;

    if (sendto(sd, packet, 120, 0, (struct sockaddr *)&sin, sizeof(struct sockaddr)) < 0)  
    {
        perror("sendto");
        exit(1);
    }
}

1 Ответ

1 голос
/ 02 апреля 2012

Хммм ... Я думаю, вы задаетесь вопросом, как установить полезную нагрузку в вашем сообщении? По сути, вы хотите сместить от заголовков IP и UDP и начать запись данных полезной нагрузки в этот момент.

Наскоро сложенный пример этого:

int offset = packet + sizeof(struct ip) + sizeof(struct udphdr);

Тогда вы можете написать свою полезную нагрузку следующим образом:

strcpy(offset, "1234");

Вот некоторый рабочий код ICMP, который эффективно записывает данные через IP-сокет RAW:

struct icmphdr *icmp_hdr; 
char *datapart; 

icmp_hdr = (struct icmphdr *) icmp_data; 
icmp_hdr->i_type = ICMP_ECHO; 
icmp_hdr->i_code = 0; 
icmp_hdr->i_id = (unsigned short) getpid();
icmp_hdr->i_cksum = 0; 
icmp_hdr->i_seq = 0; 
datapart = icmp_data + sizeof(struct icmphdr); 
memset(datapart, 'E', datasize - sizeof(struct icmphdr));  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...