2017-02-15 13 views
0

wifi 라디오를 통해 내 자신의 패킷을 보내는 프로그램을 실행하고 싶습니다. 필자가 아는 바에 따르면 이더넷 프레임을 목적지 맥 주소 ff : ff : ff : ff : ff : ff로 전송하면이 작업을 수행 할 수있다. 그래서 원시 소켓을 열고 코드 다음에 이더넷 헤더를 만들었습니다. wifi 라디오를 통해 패킷을 해당 범위의 장치로 브로드 캐스팅하기위한 소켓 프로그램

/* Open RAW socket to send on */ 
    if ((sockfd = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW)) == -1) { 
     perror("socket"); 
    } 

    /* Get the index of the interface to send on */ 
    memset(&if_idx, 0, sizeof(struct ifreq)); 
    strncpy(if_idx.ifr_name, ifName, IFNAMSIZ-1); 
    if (ioctl(sockfd, SIOCGIFINDEX, &if_idx) < 0) 
     perror("SIOCGIFINDEX"); 
    /* Get the MAC address of the interface to send on */ 
    memset(&if_mac, 0, sizeof(struct ifreq)); 
    strncpy(if_mac.ifr_name, ifName, IFNAMSIZ-1); 
    if (ioctl(sockfd, SIOCGIFHWADDR, &if_mac) < 0) 
     perror("SIOCGIFHWADDR"); 

    /* Construct the Ethernet header */ 
    memset(sendbuf, 0, BUF_SIZ); 
    /* Ethernet header */ 
    eh->ether_shost[0] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[0]; 
    eh->ether_shost[1] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[1]; 
    eh->ether_shost[2] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[2]; 
    eh->ether_shost[3] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[3]; 
    eh->ether_shost[4] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[4]; 
    eh->ether_shost[5] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[5]; 
    eh->ether_dhost[0] = 0xff; 
    eh->ether_dhost[1] = 0xff; 
    eh->ether_dhost[2] = 0xff; 
    eh->ether_dhost[3] = 0xff; 
    eh->ether_dhost[4] = 0xff; 
    eh->ether_dhost[5] = 0xff; 
    /* Ethertype field */ 
    eh->ether_type = htons(ETH_P_BATMAN); 
    tx_len += sizeof(struct ether_header); 

    /* Packet data */ 
    sendbuf[tx_len++] = 0xaa; 
    sendbuf[tx_len++] = 0xaa; 
    sendbuf[tx_len++] = 0xaa; 
    sendbuf[tx_len++] = 0xaa; 
    sendbuf[tx_len++] = 0xaa; 
    sendbuf[tx_len++] = 0xaa; 
    sendbuf[tx_len++] = 0xaa; 
    sendbuf[tx_len++] = 0xaa; 
    sendbuf[tx_len++] = 0xaa; 
    sendbuf[tx_len++] = 0xaa; 
    sendbuf[tx_len++] = 0xaa; 
    sendbuf[tx_len++] = 0xaa; 

나는 AP 모드에서 라우터 실행에이 프로그램을 테스트하지만, 문제는 내가 그것을 WLAN SSID에 액세스 할 때 난 단지이 패킷을받을 수있다. 내 질문은 내가이 라우터 전송 범위에있을 때이 패킷을 ssid에 연결하지 않고받을 수있는 방법입니다. 어떤 도움을 주시면 감사하겠습니다.

답변

0

제가 알고있는 것처럼 이더넷 프레임을 목적지 Mac 주소 ff : ff : ff : ff : ff : ff로 보내면이 작업을 수행 할 수 있습니다.

아니요, 이것이 작동하는 방식이 아닙니다.

SSID에 가입하는 것은 실제 이더넷 네트워크에 이더넷 어댑터를 연결하는 것과 유사합니다. 일반 유선 이더넷 어댑터의 네트워크에 연결되어 있지 않으면 해당 네트워크의 장치로 패킷을 보낼 수 없습니다. WiFi 어댑터를 사용하면 SSID에 가입 할 때까지 해당 네트워크의 다른 장치와 통신 할 수 없습니다.

WiFi의 하위 레이어는 일반적으로 애플리케이션에서 액세스 할 수 없습니다. 디버깅에 사용할 수있는 무선 어댑터가있어 비콘, 프로브 및 기타와 같은 것들에 대해 임의의 802.11a/b/g/n 프레임을 수신하고 전송할 수 있습니다. 이 관리 프레임 중 어느 것도 트래픽을 전송하지 않습니다.

서로 통신하도록 설정되지 않은 몇 대의 장치간에 데이터를 보내려면 해당 장치에 ad-hoc SSID를 가입시켜야합니다. 그런 다음 평소처럼 네트워크에서 트래픽을 브로드 캐스트합니다.