/* Associate with the AP */ static void associate(void) { size_t radio_tap_len, dot11_frame_len, management_frame_len, ssid_tag_len, wps_tag_len, rates_tag_len, ht_tag_len, packet_len, offset = 0; struct radio_tap_header radio_tap; struct dot11_frame_header dot11_frame; struct association_request_management_frame management_frame; char *essid = get_ssid(); if(!essid) essid = ""; unsigned char ssid_tag[sizeof (struct tagged_parameter) + IW_ESSID_MAX_SIZE]; unsigned char rates_tag[128]; unsigned char wps_tag[sizeof (struct tagged_parameter) + WPS_TAG_SIZE]; unsigned char ht_tag[128]; radio_tap_len = build_radio_tap_header(&radio_tap); dot11_frame_len = build_dot11_frame_header(&dot11_frame, FC_ASSOCIATE); management_frame_len = build_association_management_frame(&management_frame); ssid_tag_len = build_ssid_tagged_parameter(ssid_tag, essid); rates_tag_len = build_supported_rates_tagged_parameter(rates_tag, sizeof rates_tag); wps_tag_len = build_wps_tagged_parameter(wps_tag); if(!NO_REPLAY_HTCAPS) { ht_tag_len = build_htcaps_parameter(ht_tag, sizeof ht_tag); } else { ht_tag_len = 0; } packet_len = radio_tap_len + dot11_frame_len + management_frame_len + ssid_tag_len + wps_tag_len + rates_tag_len + ht_tag_len; unsigned char packet[512]; assert(packet_len < sizeof packet); memcpy(packet, &radio_tap, radio_tap_len); offset += radio_tap_len; memcpy(packet+offset, &dot11_frame, dot11_frame_len); offset += dot11_frame_len; memcpy(packet+offset, &management_frame, management_frame_len); offset += management_frame_len; memcpy(packet+offset, ssid_tag, ssid_tag_len); offset += ssid_tag_len; memcpy(packet+offset, rates_tag, rates_tag_len); offset += rates_tag_len; memcpy(packet+offset, ht_tag, ht_tag_len); offset += ht_tag_len; memcpy(packet+offset, wps_tag, wps_tag_len); send_packet(packet, packet_len, 1); cprintf(VERBOSE, "[+] Sending association request\n"); }
/* Associate with the AP */ void associate() { const void *radio_tap = NULL, *dot11_frame = NULL, *management_frame = NULL, *ssid_tag = NULL, *wps_tag = NULL, *rates_tag = NULL, *packet = NULL; size_t radio_tap_len = 0, dot11_frame_len = 0, management_frame_len = 0, ssid_tag_len = 0, wps_tag_len = 0, rates_tag_len = 0, packet_len = 0, offset = 0; radio_tap = build_radio_tap_header(&radio_tap_len); dot11_frame = build_dot11_frame_header(FC_ASSOCIATE, &dot11_frame_len); management_frame = build_association_management_frame(&management_frame_len); ssid_tag = build_ssid_tagged_parameter(&ssid_tag_len); rates_tag = build_supported_rates_tagged_parameter(&rates_tag_len); wps_tag = build_wps_tagged_parameter(&wps_tag_len); packet_len = radio_tap_len + dot11_frame_len + management_frame_len + ssid_tag_len + wps_tag_len + rates_tag_len; if(radio_tap && dot11_frame && management_frame && ssid_tag && wps_tag && rates_tag) { packet = malloc(packet_len); if(packet) { memset((void *) packet, 0, packet_len); memcpy((void *) packet, radio_tap, radio_tap_len); offset += radio_tap_len; memcpy((void *) ((char *) packet+offset), dot11_frame, dot11_frame_len); offset += dot11_frame_len; memcpy((void *) ((char *) packet+offset), management_frame, management_frame_len); offset += management_frame_len; memcpy((void *) ((char *) packet+offset), ssid_tag, ssid_tag_len); offset += ssid_tag_len; memcpy((void *) ((char *) packet+offset), rates_tag, rates_tag_len); offset += rates_tag_len; memcpy((void *) ((char *) packet+offset), wps_tag, wps_tag_len); pcap_inject(get_handle(), packet, packet_len); free((void *) packet); } } if(radio_tap) free((void *) radio_tap); if(dot11_frame) free((void *) dot11_frame); if(management_frame) free((void *) management_frame); if(ssid_tag) free((void *) ssid_tag); if(wps_tag) free((void *) wps_tag); if(rates_tag) free((void *) rates_tag); return; }