802.11 packet에서 실제 송수신되는 패킷 정보가 아닌 packet을 수신하는 측에서 결정하는 필드들이 있다. 다음과 같은 항목이 있는데

  1. Radiotap header
  2. Frame check sequence

이러한 필드들은 packet injection을 할 때 필요가 없는 정보이다. 그래서 일반적으로 Radiotap header에서 it_version(0), it_pad(0), it_len(8), it_present(0)을 설정을 하여 packet을 전송해도 무방하다.

struct ieee80211_radiotap_header {
        u_int8_t        it_version;     /* set to 0 */
        u_int8_t        it_pad;
        u_int16_t       it_len;         /* entire length */
        u_int32_t       it_present;     /* fields present */
} __attribute__((__packed__));

그런데 일부 어댑터에서는 packet을 injection할 때 이 Radiotap header를 참조하는 경우가 있다. nexmon firware inject_frame 함수를 보면 Radiotap header를 참조하여 data_rate라는 변수 값을 설정하고 마지막에 Radiotap header를 벗겨내고 sendframe이 호출되는 것을 확인할 수 있다.

    // remove radiotap header
    skb_pull(p, rtap_len);

    sendframe(wlc, p, 1, data_rate);

    return 0;
}

즉 date_rate 값을 제대로 설정해 주기 위해서 Radiotap header에 어떠한 값을 설정해 줘야 한다는 의미이다. data_rate 값을 설정해 주지 않으면 특수한 경우(nexmon이 설치된 Galaxy S7 혹은 Nexus 6P에서 2.4GHz 환경에서 packet injection)에 crash가 나타나는 현상이 있다.

802.11 packet injection의 가장 대표적은 프로그램인 mdk3 툴을 이용하여 packet injection을 할 때 Radiotap header를 어떻게 설정하는지 조사를 하였다.

Data Rate는 1.0Mb/s(0x02)값을 가지며 Radiotap header는 “00 00 0C 00 04 80 00 00 02 00 18 00”의 12바이트 조합을 가지고 있다. 이 hard coding된 값을 Radiotap header로 설정해 주면 packet injection에서 crash가 나지 않는 것을 확인하였다.