2015-01-14 7 views
1

내 기능은 현재 올바르게 작동하지만 서버의 주 IP 주소에서 다른 기능을 사용하지 않고 보내고 있습니다. 나는 그것을에서 패킷을 보낼 그러나이 내 기본 서버에서 IP를 호출 할 수 있습니다 포트 1900, w 변수에 패킷을 전송소켓 sendto()에서 소스 IP 변경

void *sendpacket(void *par1) 
{ 
     running_threads++; 
     int thread_id = (int)par1; 
     unsigned long start_ip = htonl(ntohl(start)+(per_thread*thread_id)); 
     unsigned long end = htonl(ntohl(start)+(per_thread*(thread_id+1))); 
     unsigned long w; 
     int y; 
     unsigned char buf[65536]; 
     strcpy(buf, "M-SEARCH * HTTP/1.1\r\nHost:239.255.255.250:1900\r\nST:ssdp:all\r\nMan:\"ssdp:discover\"\r\nMX:3\r\n\r\n"); 
     int sizeofpayload = 90; 
     int sock; 
     if((sock=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))<0) { 
       perror("cant open socket"); 
       exit(-1); 
     } 
     for(w=ntohl(start_ip);w<htonl(end);w++) 
     { 
       struct sockaddr_in servaddr; 
       bzero(&servaddr, sizeof(servaddr)); 
       servaddr.sin_family = AF_INET; 
       servaddr.sin_addr.s_addr=htonl(w); 
       servaddr.sin_port=htons(1900); 
       sendto(sock,(char *)buf,sizeofpayload,0, (struct sockaddr *)&servaddr,sizeof(servaddr)); 
       bytes_sent+=sizeofpayload; 
       scanned++; 
       hosts_done++; 
       usleep(sleep_between*1000); 
     } 
     close(sock); 
     running_threads--; 
     return; 
} 

192.168.0.1 : 여기

코드의 조각이다 192.168.1.1 그래서 다른 주소로 스푸핑하기 위해 UDP 패킷을 위조하십시오.

servaddr.sin_addr.s_addr=htonl(w); 

대상 주소를 처리하지만 원본 IP 주소를 편집하는 데 어려움을 겪고 있습니다.

+1

원시 소켓이 필요하다고 생각합니다. – edmz

+0

참고 :'bytes_sent + = sizeofpayload; 당신은 sento()의 리턴 값을 가져야한다. – wildplasser

+0

적절한 오류 처리가 필요합니다. 예를 들어,'sendto()'가 -1을 반환하면 전혀 바이트를 보내지 않았다. – EJP

답변

7

192.168.1.1이 보내는 PC의 로컬 IP 인 경우 sendto()을 호출하기 전에 bind() 소켓을 192.168.1.1에 연결할 수 있습니다. 그렇지 않으면 SOCK_RAW 소켓 (관리 사용자로만 제한됨)을 사용하고 수동으로 IP 및 UDP 헤더를 만들어야합니다.