2012-03-31 3 views
1

그래서 원시 소켓을 copypasta로 설정하고, 데이터를 보내고, 그 부분은 잘 작동합니다. 하지만 소켓을 통해 데이터를 보내려면 어떻게해야합니까? 도움이된다면 DNS 요청을하려고합니다. 아래 코드.UDP Raw Socket set 메시지

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

'sendto'의 마지막 인수는'sizeof (struct sockaddr_in)'이 아니어야합니까? –

+0

그게 사실 일지 모르지만, 그것은 정말로 내 문제에 relavent 아니며, 그것을 가지고있는 방식으로 잘 작동합니다, 나는 단지 메시지를 설정하는 방법을 알고 싶습니다. – W00t

+0

왜 UDP 소켓이 아닌 RAW 소켓을 사용하고 있습니까? 그리고 나는 당신이 무엇을 요구하고 있는지 분명하지 않습니다 ... 당신은 보내는 부분이 일하고 있다고 말합니다. 그렇다면 "메시지를 정하십시오"라는 것은 무엇을 의미합니까? – EdwardH

답변

1

흠 ... 내 메시지에 페이로드를 설정하는 방법이 궁금하십니까? 기본적으로 IP 및 UDP 헤더에서 오프셋하고 그 시점에서 페이로드 데이터를 작성하기를 원합니다.

A는 급하게이의 예를 함께 던져 다음과 같이

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

그런 다음 당신이 당신의 페이로드를 작성할 수 있습니다

strcpy(offset, "1234"); 
다음

효과적으로 RAW를 통해 데이터를 쓰는 일부 작업 ICMP 코드입니다 IP 소켓 :

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)); 
+0

그래,이게 내가 찾고 있던거야. 감사! – W00t

관련 문제