Land #4800, remove Lorcon source
It's maintained upstream, mentioned in #3200, and the modules that did use these were themselves broken.bug/bundler_fix blog-20150226
commit
f9b47a329d
4
LICENSE
4
LICENSE
|
@ -32,10 +32,6 @@ Copyright: 2003-2010 Mark Borgerding
|
||||||
2009-2012 H D Moore <hdm[at]rapid7.com>
|
2009-2012 H D Moore <hdm[at]rapid7.com>
|
||||||
License: BSD-3-clause
|
License: BSD-3-clause
|
||||||
|
|
||||||
Files: external/ruby-lorcon/*
|
|
||||||
Copyright: 2005, dragorn and Joshua Wright
|
|
||||||
License: LGPL-2.1
|
|
||||||
|
|
||||||
Files: external/source/exploits/IE11SandboxEscapes/*
|
Files: external/source/exploits/IE11SandboxEscapes/*
|
||||||
Copyright: James Forshaw, 2014
|
Copyright: James Forshaw, 2014
|
||||||
License: GPLv3
|
License: GPLv3
|
||||||
|
|
|
@ -1,525 +0,0 @@
|
||||||
#include "Lorcon.h"
|
|
||||||
#include "ruby.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
self.license = GPLv2;
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This is a derivative of the tx.c sample included with lorcon:
|
|
||||||
http://802.11ninja.net/lorcon/
|
|
||||||
|
|
||||||
lorcon is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
lorcon is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with lorcon; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
Copyright (c) 2005 dragorn and Joshua Wright
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
Lots of code borrowed from Tom Wambold's pylorcon:
|
|
||||||
http://pylorcon.googlecode.com/ - tom5760[at]gmail.com
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
All ruby-lorcon/rubyisms are by Rapid7, Inc (C) 2006-2007
|
|
||||||
http://metasploit.com/ - msfdev[at]metasploit.com
|
|
||||||
*/
|
|
||||||
|
|
||||||
VALUE mLorcon;
|
|
||||||
VALUE cDevice;
|
|
||||||
|
|
||||||
VALUE lorcon_get_version(VALUE self) {
|
|
||||||
return INT2NUM(tx80211_getversion());
|
|
||||||
}
|
|
||||||
|
|
||||||
VALUE lorcon_cap_to_list(int cap) {
|
|
||||||
VALUE list;
|
|
||||||
list = rb_ary_new();
|
|
||||||
|
|
||||||
if ((cap & TX80211_CAP_SNIFF) != 0)
|
|
||||||
rb_ary_push(list, rb_str_new2("SNIFF"));
|
|
||||||
|
|
||||||
if ((cap & TX80211_CAP_TRANSMIT) != 0)
|
|
||||||
rb_ary_push(list, rb_str_new2("TRANSMIT"));
|
|
||||||
|
|
||||||
if ((cap & TX80211_CAP_SEQ) != 0)
|
|
||||||
rb_ary_push(list, rb_str_new2("SEQ"));
|
|
||||||
|
|
||||||
if ((cap & TX80211_CAP_BSSTIME) != 0)
|
|
||||||
rb_ary_push(list, rb_str_new2("BSSTIME"));
|
|
||||||
|
|
||||||
if ((cap & TX80211_CAP_FRAG) != 0)
|
|
||||||
rb_ary_push(list, rb_str_new2("FRAG"));
|
|
||||||
|
|
||||||
if ((cap & TX80211_CAP_CTRL) != 0)
|
|
||||||
rb_ary_push(list, rb_str_new2("CTRL"));
|
|
||||||
|
|
||||||
if ((cap & TX80211_CAP_DURID) != 0)
|
|
||||||
rb_ary_push(list, rb_str_new2("DURID"));
|
|
||||||
|
|
||||||
if ((cap & TX80211_CAP_SNIFFACK) != 0)
|
|
||||||
rb_ary_push(list, rb_str_new2("SNIFFACK"));
|
|
||||||
|
|
||||||
if ((cap & TX80211_CAP_SELFACK) != 0)
|
|
||||||
rb_ary_push(list, rb_str_new2("SELFACK"));
|
|
||||||
|
|
||||||
if ((cap & TX80211_CAP_TXNOWAIT) != 0)
|
|
||||||
rb_ary_push(list, rb_str_new2("TXNOWAIT"));
|
|
||||||
|
|
||||||
if ((cap & TX80211_CAP_DSSSTX) != 0)
|
|
||||||
rb_ary_push(list, rb_str_new2("DSSSTX"));
|
|
||||||
|
|
||||||
if ((cap & TX80211_CAP_OFDMTX) != 0)
|
|
||||||
rb_ary_push(list, rb_str_new2("OFDMTX"));
|
|
||||||
|
|
||||||
if ((cap & TX80211_CAP_MIMOTX) != 0)
|
|
||||||
rb_ary_push(list, rb_str_new2("MIMOTX"));
|
|
||||||
|
|
||||||
if ((cap & TX80211_CAP_SETRATE) != 0)
|
|
||||||
rb_ary_push(list, rb_str_new2("SETRATE"));
|
|
||||||
|
|
||||||
if ((cap & TX80211_CAP_SETMODULATION) != 0)
|
|
||||||
rb_ary_push(list, rb_str_new2("SETMODULATION"));
|
|
||||||
|
|
||||||
if ((cap & TX80211_CAP_NONE) != 0)
|
|
||||||
rb_ary_push(list, rb_str_new2("NONE"));
|
|
||||||
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static VALUE lorcon_driver_list(VALUE self) {
|
|
||||||
VALUE list;
|
|
||||||
VALUE hash;
|
|
||||||
|
|
||||||
struct tx80211_cardlist *cards = NULL;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
list = rb_hash_new();
|
|
||||||
cards = tx80211_getcardlist();
|
|
||||||
if (cards == NULL) {
|
|
||||||
return(Qnil);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 1; i < cards->num_cards; i++) {
|
|
||||||
hash = rb_hash_new();
|
|
||||||
rb_hash_aset(hash, rb_str_new2("name"), rb_str_new2(cards->cardnames[i]));
|
|
||||||
rb_hash_aset(hash, rb_str_new2("description"), rb_str_new2(cards->descriptions[i]));
|
|
||||||
rb_hash_aset(hash, rb_str_new2("capabilities"), lorcon_cap_to_list(cards->capabilities[i]));
|
|
||||||
rb_hash_aset(list, rb_str_new2(cards->cardnames[i]), hash);
|
|
||||||
}
|
|
||||||
|
|
||||||
tx80211_freecardlist(cards);
|
|
||||||
return(list);
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE lorcon_device_get_channel(VALUE self) {
|
|
||||||
struct rldev *rld;
|
|
||||||
Data_Get_Struct(self, struct rldev, rld);
|
|
||||||
return INT2NUM(tx80211_getchannel(&rld->in_tx));
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE lorcon_device_set_channel(VALUE self, VALUE channel) {
|
|
||||||
struct rldev *rld;
|
|
||||||
Data_Get_Struct(self, struct rldev, rld);
|
|
||||||
tx80211_setchannel(&rld->in_tx, NUM2INT(channel));
|
|
||||||
return INT2NUM(tx80211_getchannel(&rld->in_tx));
|
|
||||||
}
|
|
||||||
|
|
||||||
void lorcon_device_free(struct rldev *rld) {
|
|
||||||
if (tx80211_getmode(&rld->in_tx) >= 0) {
|
|
||||||
tx80211_close(&rld->in_tx);
|
|
||||||
}
|
|
||||||
free(&rld->in_tx);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static VALUE lorcon_device_get_mode(VALUE self) {
|
|
||||||
struct rldev *rld;
|
|
||||||
int mode;
|
|
||||||
Data_Get_Struct(self, struct rldev, rld);
|
|
||||||
|
|
||||||
|
|
||||||
mode = tx80211_getmode(&rld->in_tx);
|
|
||||||
if (mode < 0) {
|
|
||||||
rb_raise(rb_eArgError, "Lorcon could not determine the mode of this device: %s", tx80211_geterrstr(&rld->in_tx));
|
|
||||||
return(Qnil);
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (mode) {
|
|
||||||
case TX80211_MODE_AUTO:
|
|
||||||
return rb_str_new2("AUTO");
|
|
||||||
break;
|
|
||||||
case TX80211_MODE_ADHOC:
|
|
||||||
return rb_str_new2("ADHOC");
|
|
||||||
break;
|
|
||||||
case TX80211_MODE_INFRA:
|
|
||||||
return rb_str_new2("INFRA");
|
|
||||||
break;
|
|
||||||
case TX80211_MODE_MASTER:
|
|
||||||
return rb_str_new2("MASTER");
|
|
||||||
break;
|
|
||||||
case TX80211_MODE_REPEAT:
|
|
||||||
return rb_str_new2("REPEAT");
|
|
||||||
break;
|
|
||||||
case TX80211_MODE_SECOND:
|
|
||||||
return rb_str_new2("SECOND");
|
|
||||||
break;
|
|
||||||
case TX80211_MODE_MONITOR:
|
|
||||||
return rb_str_new2("MONITOR");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return Qnil;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE lorcon_device_set_mode(VALUE self, VALUE rmode) {
|
|
||||||
struct rldev *rld;
|
|
||||||
char *setmode = StringValuePtr(rmode);
|
|
||||||
int mode = -1;
|
|
||||||
|
|
||||||
Data_Get_Struct(self, struct rldev, rld);
|
|
||||||
|
|
||||||
if (strcmp(setmode, "AUTO") == 0) {
|
|
||||||
mode = TX80211_MODE_AUTO;
|
|
||||||
} else if (strcmp(setmode, "ADHOC") == 0) {
|
|
||||||
mode = TX80211_MODE_ADHOC;
|
|
||||||
} else if (strcmp(setmode, "INFRA") == 0) {
|
|
||||||
mode = TX80211_MODE_INFRA;
|
|
||||||
} else if (strcmp(setmode, "MASTER") == 0) {
|
|
||||||
mode = TX80211_MODE_MASTER;
|
|
||||||
} else if (strcmp(setmode, "REPEAT") == 0) {
|
|
||||||
mode = TX80211_MODE_REPEAT;
|
|
||||||
} else if (strcmp(setmode, "SECOND") == 0) {
|
|
||||||
mode = TX80211_MODE_SECOND;
|
|
||||||
} else if (strcmp(setmode, "MONITOR") == 0) {
|
|
||||||
mode = TX80211_MODE_MONITOR;
|
|
||||||
} else {
|
|
||||||
rb_raise(rb_eArgError, "Invalid mode specified: %s", tx80211_geterrstr(&rld->in_tx));
|
|
||||||
return(Qnil);
|
|
||||||
}
|
|
||||||
|
|
||||||
return INT2NUM(tx80211_setmode(&rld->in_tx, mode));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static VALUE lorcon_device_get_txrate(VALUE self) {
|
|
||||||
struct rldev *rld;
|
|
||||||
int txrate;
|
|
||||||
|
|
||||||
txrate = tx80211_gettxrate(&rld->in_packet);
|
|
||||||
Data_Get_Struct(self, struct rldev, rld);
|
|
||||||
|
|
||||||
switch (txrate) {
|
|
||||||
case TX80211_RATE_DEFAULT:
|
|
||||||
return UINT2NUM(0);
|
|
||||||
break;
|
|
||||||
case TX80211_RATE_1MB:
|
|
||||||
return UINT2NUM(1);
|
|
||||||
break;
|
|
||||||
case TX80211_RATE_2MB:
|
|
||||||
return UINT2NUM(2);
|
|
||||||
break;
|
|
||||||
case TX80211_RATE_5_5MB:
|
|
||||||
return UINT2NUM(5);
|
|
||||||
break;
|
|
||||||
case TX80211_RATE_6MB:
|
|
||||||
return UINT2NUM(6);
|
|
||||||
break;
|
|
||||||
case TX80211_RATE_9MB:
|
|
||||||
return UINT2NUM(9);
|
|
||||||
break;
|
|
||||||
case TX80211_RATE_11MB:
|
|
||||||
return UINT2NUM(11);
|
|
||||||
break;
|
|
||||||
case TX80211_RATE_24MB:
|
|
||||||
return UINT2NUM(24);
|
|
||||||
break;
|
|
||||||
case TX80211_RATE_36MB:
|
|
||||||
return UINT2NUM(36);
|
|
||||||
break;
|
|
||||||
case TX80211_RATE_48MB:
|
|
||||||
return UINT2NUM(48);
|
|
||||||
break;
|
|
||||||
case TX80211_RATE_108MB:
|
|
||||||
return UINT2NUM(108);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
rb_raise(rb_eArgError, "Lorcon could not determine the tx rate: %s", tx80211_geterrstr(&rld->in_tx));
|
|
||||||
return(Qnil);
|
|
||||||
}
|
|
||||||
|
|
||||||
return Qnil;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static VALUE lorcon_device_set_txrate(VALUE self, VALUE rrate) {
|
|
||||||
struct rldev *rld;
|
|
||||||
float settxrate = -1;
|
|
||||||
int txrate = -1;
|
|
||||||
|
|
||||||
Data_Get_Struct(self, struct rldev, rld);
|
|
||||||
|
|
||||||
|
|
||||||
if ((tx80211_getcapabilities(&rld->in_tx) & TX80211_CAP_SETRATE) == 0) {
|
|
||||||
rb_raise(rb_eArgError, "Lorcon does not support setting the tx rate for this card");
|
|
||||||
return(Qnil);
|
|
||||||
}
|
|
||||||
|
|
||||||
settxrate = NUM2DBL(rrate);
|
|
||||||
|
|
||||||
if (settxrate == -1) {
|
|
||||||
txrate = TX80211_RATE_DEFAULT;
|
|
||||||
} else if (settxrate == 1) {
|
|
||||||
txrate = TX80211_RATE_1MB;
|
|
||||||
} else if (settxrate == 2) {
|
|
||||||
txrate = TX80211_RATE_2MB;
|
|
||||||
} else if (settxrate == 5.5) {
|
|
||||||
txrate = TX80211_RATE_5_5MB;
|
|
||||||
} else if (settxrate == 6) {
|
|
||||||
txrate = TX80211_RATE_6MB;
|
|
||||||
} else if (settxrate == 9) {
|
|
||||||
txrate = TX80211_RATE_9MB;
|
|
||||||
} else if (settxrate == 11) {
|
|
||||||
txrate = TX80211_RATE_11MB;
|
|
||||||
} else if (settxrate == 24) {
|
|
||||||
txrate = TX80211_RATE_24MB;
|
|
||||||
} else if (settxrate == 36) {
|
|
||||||
txrate = TX80211_RATE_36MB;
|
|
||||||
} else if (settxrate == 48) {
|
|
||||||
txrate = TX80211_RATE_48MB;
|
|
||||||
} else if (settxrate == 108) {
|
|
||||||
txrate = TX80211_RATE_108MB;
|
|
||||||
} else {
|
|
||||||
rb_raise(rb_eArgError, "Lorcon does not support this rate setting");
|
|
||||||
return(Qnil);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tx80211_settxrate(&rld->in_tx, &rld->in_packet, txrate) < 0) {
|
|
||||||
rb_raise(rb_eArgError, "Lorcon could not set the tx rate: %s", tx80211_geterrstr(&rld->in_tx));
|
|
||||||
return(Qnil);
|
|
||||||
}
|
|
||||||
|
|
||||||
return INT2NUM(txrate);
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE lorcon_device_get_modulation(VALUE self) {
|
|
||||||
struct rldev *rld;
|
|
||||||
int mod;
|
|
||||||
|
|
||||||
Data_Get_Struct(self, struct rldev, rld);
|
|
||||||
|
|
||||||
mod = tx80211_getmodulation(&rld->in_packet);
|
|
||||||
switch (mod) {
|
|
||||||
case TX80211_MOD_DEFAULT:
|
|
||||||
return rb_str_new2("DEFAULT");
|
|
||||||
break;
|
|
||||||
case TX80211_MOD_FHSS:
|
|
||||||
return rb_str_new2("FHSS");
|
|
||||||
break;
|
|
||||||
case TX80211_MOD_DSSS:
|
|
||||||
return rb_str_new2("DSSS");
|
|
||||||
break;
|
|
||||||
case TX80211_MOD_OFDM:
|
|
||||||
return rb_str_new2("OFDM");
|
|
||||||
break;
|
|
||||||
case TX80211_MOD_TURBO:
|
|
||||||
return rb_str_new2("TURBO");
|
|
||||||
break;
|
|
||||||
case TX80211_MOD_MIMO:
|
|
||||||
return rb_str_new2("MIMO");
|
|
||||||
break;
|
|
||||||
case TX80211_MOD_MIMOGF:
|
|
||||||
return rb_str_new2("MIMOGF");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
rb_raise(rb_eArgError, "Lorcon could not get the modulation value");
|
|
||||||
return(Qnil);
|
|
||||||
}
|
|
||||||
return(Qnil);
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE lorcon_device_set_modulation(VALUE self, VALUE rmod) {
|
|
||||||
struct rldev *rld;
|
|
||||||
char *setmod = NULL;
|
|
||||||
int mod;
|
|
||||||
|
|
||||||
Data_Get_Struct(self, struct rldev, rld);
|
|
||||||
|
|
||||||
if ((tx80211_getcapabilities(&rld->in_tx) & TX80211_CAP_SETMODULATION) == 0) {
|
|
||||||
rb_raise(rb_eArgError, "Lorcon does not support setting the modulation for this card");
|
|
||||||
return(Qnil);
|
|
||||||
}
|
|
||||||
|
|
||||||
setmod = StringValuePtr(rmod);
|
|
||||||
|
|
||||||
if (strcmp(setmod, "DEFAULT") == 0) {
|
|
||||||
mod = TX80211_MOD_DEFAULT;
|
|
||||||
} else if (strcmp(setmod, "FHSS") == 0) {
|
|
||||||
mod = TX80211_MOD_FHSS;
|
|
||||||
} else if (strcmp(setmod, "DSSS") == 0) {
|
|
||||||
mod = TX80211_MOD_DSSS;
|
|
||||||
} else if (strcmp(setmod, "OFDM") == 0) {
|
|
||||||
mod = TX80211_MOD_OFDM;
|
|
||||||
} else if (strcmp(setmod, "TURBO") == 0) {
|
|
||||||
mod = TX80211_MOD_TURBO;
|
|
||||||
} else if (strcmp(setmod, "MIMO") == 0) {
|
|
||||||
mod = TX80211_MOD_MIMO;
|
|
||||||
} else if (strcmp(setmod, "MIMOGF") == 0) {
|
|
||||||
mod = TX80211_MOD_MIMOGF;
|
|
||||||
} else {
|
|
||||||
rb_raise(rb_eArgError, "Lorcon does not support this modulation setting");
|
|
||||||
return(Qnil);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tx80211_setmodulation(&rld->in_tx, &rld->in_packet, mod) < 0) {
|
|
||||||
rb_raise(rb_eArgError, "Lorcon could not set the modulation: %s", tx80211_geterrstr(&rld->in_tx));
|
|
||||||
return(Qnil);
|
|
||||||
}
|
|
||||||
|
|
||||||
return INT2NUM(mod);
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE lorcon_device_get_capabilities(VALUE self) {
|
|
||||||
struct rldev *rld;
|
|
||||||
Data_Get_Struct(self, struct rldev, rld);
|
|
||||||
return(lorcon_cap_to_list(tx80211_getcapabilities(&rld->in_tx)));
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE lorcon_device_open(int argc, VALUE *argv, VALUE self) {
|
|
||||||
struct rldev *rld;
|
|
||||||
int ret = 0;
|
|
||||||
int drivertype = INJ_NODRIVER;
|
|
||||||
char *driver, *intf;
|
|
||||||
VALUE rbdriver, rbintf;
|
|
||||||
VALUE obj;
|
|
||||||
|
|
||||||
rb_scan_args(argc, argv, "2", &rbintf, &rbdriver);
|
|
||||||
|
|
||||||
driver = STR2CSTR(rbdriver);
|
|
||||||
intf = STR2CSTR(rbintf);
|
|
||||||
|
|
||||||
obj = Data_Make_Struct(cDevice, struct rldev, 0, lorcon_device_free, rld);
|
|
||||||
|
|
||||||
drivertype = tx80211_resolvecard(driver);
|
|
||||||
if (drivertype == INJ_NODRIVER) {
|
|
||||||
rb_raise(rb_eArgError, "Lorcon did not recognize the specified driver");
|
|
||||||
return(Qnil);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tx80211_init(&rld->in_tx, intf, drivertype) < 0) {
|
|
||||||
rb_raise(rb_eRuntimeError, "Lorcon could not initialize the interface: %s", tx80211_geterrstr(&rld->in_tx));
|
|
||||||
return(Qnil);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Open the interface to get a socket */
|
|
||||||
ret = tx80211_open(&rld->in_tx);
|
|
||||||
if (ret < 0) {
|
|
||||||
rb_raise(rb_eRuntimeError, "Lorcon could not open the interface: %s", tx80211_geterrstr(&rld->in_tx));
|
|
||||||
return(Qnil);
|
|
||||||
}
|
|
||||||
|
|
||||||
rb_obj_call_init(obj, 0, 0);
|
|
||||||
return(obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE lorcon_device_write(int argc, VALUE *argv, VALUE self) {
|
|
||||||
struct rldev *rld;
|
|
||||||
int ret = 0;
|
|
||||||
int cnt = 0;
|
|
||||||
int dly = 0;
|
|
||||||
|
|
||||||
VALUE rbbuff, rbcnt, rbdelay;
|
|
||||||
|
|
||||||
Data_Get_Struct(self, struct rldev, rld);
|
|
||||||
|
|
||||||
switch(rb_scan_args(argc, argv, "12", &rbbuff, &rbcnt, &rbdelay)) {
|
|
||||||
case 1:
|
|
||||||
rbdelay = INT2NUM(0);
|
|
||||||
case 2:
|
|
||||||
rbcnt = INT2NUM(1);
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
cnt = NUM2INT(rbcnt);
|
|
||||||
dly = NUM2INT(rbdelay);
|
|
||||||
|
|
||||||
rld->in_packet.packet = StringValuePtr(rbbuff);
|
|
||||||
rld->in_packet.plen = RSTRING(rbbuff)->len;
|
|
||||||
|
|
||||||
for (; cnt > 0; cnt--) {
|
|
||||||
ret = tx80211_txpacket(&rld->in_tx, &rld->in_packet);
|
|
||||||
if (ret < 0) {
|
|
||||||
rb_raise(rb_eRuntimeError, "Lorcon could not transmit packet: %s", tx80211_geterrstr(&rld->in_tx));
|
|
||||||
return(INT2NUM(ret));
|
|
||||||
}
|
|
||||||
if (dly > 0)
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
Sleep(dly);
|
|
||||||
#else
|
|
||||||
usleep(dly);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
return (rbcnt);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Init_Lorcon() {
|
|
||||||
mLorcon = rb_define_module("Lorcon");
|
|
||||||
rb_define_module_function(mLorcon, "drivers", lorcon_driver_list, 0);
|
|
||||||
rb_define_module_function(mLorcon, "version", lorcon_get_version, 0);
|
|
||||||
|
|
||||||
cDevice = rb_define_class_under(mLorcon, "Device", rb_cObject);
|
|
||||||
rb_define_singleton_method(cDevice, "new", lorcon_device_open, -1);
|
|
||||||
rb_define_method(cDevice, "channel", lorcon_device_get_channel, 0);
|
|
||||||
rb_define_method(cDevice, "channel=", lorcon_device_set_channel, 1);
|
|
||||||
rb_define_method(cDevice, "write", lorcon_device_write, -1);
|
|
||||||
rb_define_method(cDevice, "mode", lorcon_device_get_mode, 0);
|
|
||||||
rb_define_method(cDevice, "mode=", lorcon_device_set_mode, 1);
|
|
||||||
rb_define_method(cDevice, "fmode=", lorcon_device_set_functional_mode, 1);
|
|
||||||
rb_define_method(cDevice, "txrate", lorcon_device_get_txrate, 0);
|
|
||||||
rb_define_method(cDevice, "txrate=", lorcon_device_set_txrate, 1);
|
|
||||||
rb_define_method(cDevice, "modulation", lorcon_device_get_modulation, 0);
|
|
||||||
rb_define_method(cDevice, "modulation=", lorcon_device_set_modulation, 1);
|
|
||||||
rb_define_method(cDevice, "capabilities", lorcon_device_get_capabilities, 0);
|
|
||||||
}
|
|
|
@ -1,19 +0,0 @@
|
||||||
#ifndef _MSFLORCON_H
|
|
||||||
#define _MSFLORCON_H
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <tx80211.h>
|
|
||||||
#include <tx80211_packet.h>
|
|
||||||
|
|
||||||
|
|
||||||
struct rldev {
|
|
||||||
struct tx80211 in_tx;
|
|
||||||
struct tx80211_packet in_packet;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,41 +0,0 @@
|
||||||
This is an experimental interface for lorcon, a 802.11 library
|
|
||||||
developed by Joshua Wright and dragorn. This interface is only
|
|
||||||
available on Linux and with lorcon-supported wireless drivers.
|
|
||||||
|
|
||||||
For more information, please see the lorcon documentation and code:
|
|
||||||
http://www.802.11mercenary.net/lorcon/
|
|
||||||
|
|
||||||
To build this extension:
|
|
||||||
|
|
||||||
1) Download, compile, and install lorcon
|
|
||||||
The latest version of lorcon can pulled from SVN:
|
|
||||||
$ svn co https://802.11ninja.net/svn/lorcon/trunk/ lorcon
|
|
||||||
$ cd lorcon
|
|
||||||
$ ./configure
|
|
||||||
$ make
|
|
||||||
$ sudo make install
|
|
||||||
-- or --
|
|
||||||
$ su
|
|
||||||
# make install
|
|
||||||
# exit
|
|
||||||
$ cd ..
|
|
||||||
|
|
||||||
2) build the ruby extension..
|
|
||||||
$ ruby extconf.rb
|
|
||||||
$ make
|
|
||||||
$ sudo make install
|
|
||||||
-- or --
|
|
||||||
$ su
|
|
||||||
# make install
|
|
||||||
|
|
||||||
|
|
||||||
NOTES:
|
|
||||||
|
|
||||||
if Ubuntu 8.04 (and probably others) bitches about 'mkmf',
|
|
||||||
you need ruby dev package.
|
|
||||||
|
|
||||||
:~/metasploit/external/ruby-lorcon$ ruby extconf.rb
|
|
||||||
extconf.rb:2:in `require': no such file to load -- mkmf (LoadError)
|
|
||||||
from extconf.rb:2
|
|
||||||
|
|
||||||
:~/metasploit/external/ruby-lorcon$ sudo apt-get install ruby1.8-dev
|
|
|
@ -1,8 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
require 'mkmf'
|
|
||||||
|
|
||||||
if (have_library("orcon", "tx80211_txpacket", "tx80211.h") or find_library("orcon", "tx80211_txpacket", "tx80211.h"))
|
|
||||||
create_makefile("Lorcon")
|
|
||||||
else
|
|
||||||
puts "Error: the lorcon library was not found, please see the README"
|
|
||||||
end
|
|
|
@ -1,47 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
|
|
||||||
$:.unshift(File.dirname(__FILE__))
|
|
||||||
require "Lorcon"
|
|
||||||
require "pp"
|
|
||||||
|
|
||||||
pp Lorcon.version
|
|
||||||
pp Lorcon.drivers
|
|
||||||
|
|
||||||
# Beacon frame from tx.c
|
|
||||||
packet = [
|
|
||||||
0x80, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, # dur ffff
|
|
||||||
0xff, 0xff, 0x00, 0x0f, 0x66, 0xe3, 0xe4, 0x03,
|
|
||||||
0x00, 0x0f, 0x66, 0xe3, 0xe4, 0x03, 0x00, 0x00, # 0x0000 - seq no.
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, # BSS timestamp
|
|
||||||
0x64, 0x00, 0x11, 0x00, 0x00, 0x0f, 0x73, 0x6f,
|
|
||||||
0x6d, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x63,
|
|
||||||
0x6c, 0x65, 0x76, 0x65, 0x72, 0x01, 0x08, 0x82,
|
|
||||||
0x84, 0x8b, 0x96, 0x24, 0x30, 0x48, 0x6c, 0x03,
|
|
||||||
0x01, 0x01, 0x05, 0x04, 0x00, 0x01, 0x00, 0x00,
|
|
||||||
0x2a, 0x01, 0x05, 0x2f, 0x01, 0x05, 0x32, 0x04,
|
|
||||||
0x0c, 0x12, 0x18, 0x60, 0xdd, 0x05, 0x00, 0x10,
|
|
||||||
0x18, 0x01, 0x01, 0xdd, 0x16, 0x00, 0x50, 0xf2,
|
|
||||||
0x01, 0x01, 0x00, 0x00, 0x50, 0xf2, 0x02, 0x01,
|
|
||||||
0x00, 0x00, 0x50, 0xf2, 0x02, 0x01, 0x00, 0x00,
|
|
||||||
0x50, 0xf2, 0x02
|
|
||||||
].pack('C*')
|
|
||||||
|
|
||||||
|
|
||||||
# Configure the card for reliable injection
|
|
||||||
|
|
||||||
tx = Lorcon::Device.new('ath0', 'madwifing')
|
|
||||||
tx.fmode = "INJECT"
|
|
||||||
tx.channel = 11
|
|
||||||
tx.txrate = 2
|
|
||||||
tx.modulation = "DSSS"
|
|
||||||
|
|
||||||
sa = Time.now.to_f
|
|
||||||
tx.write(packet, 500, 0)
|
|
||||||
ea = Time.now.to_f - sa
|
|
||||||
|
|
||||||
sb = Time.now.to_f
|
|
||||||
500.times { tx.write(packet, 1, 0) }
|
|
||||||
eb = Time.now.to_f - sb
|
|
||||||
|
|
||||||
$stdout.puts "Sent 500 packets (C) in #{ea.to_s} seconds"
|
|
||||||
$stdout.puts "Sent 500 packets (Ruby) in #{eb.to_s} seconds"
|
|
|
@ -1,655 +0,0 @@
|
||||||
#include "Lorcon2.h"
|
|
||||||
#include "ruby.h"
|
|
||||||
|
|
||||||
#ifndef RUBY_19
|
|
||||||
#include "rubysig.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
self.license = GPLv2;
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
This is a derivative of the tx.c sample included with lorcon:
|
|
||||||
http://802.11ninja.net/lorcon/
|
|
||||||
|
|
||||||
lorcon is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
lorcon is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with lorcon; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
Copyright (c) 2005 dragorn and Joshua Wright
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
Lots of code borrowed from Tom Wambold's pylorcon:
|
|
||||||
http://pylorcon.googlecode.com/ - tom5760[at]gmail.com
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
All ruby-lorcon/rubyisms are by Rapid7, Inc. (C) 2006-2007
|
|
||||||
http://metasploit.com/ - msfdev[at]metasploit.com
|
|
||||||
*/
|
|
||||||
|
|
||||||
VALUE mLorcon;
|
|
||||||
VALUE cDevice;
|
|
||||||
VALUE cPacket;
|
|
||||||
|
|
||||||
VALUE Lorcon_get_version(VALUE self) {
|
|
||||||
return INT2NUM(lorcon_get_version());
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE Lorcon_list_drivers(VALUE self) {
|
|
||||||
VALUE list;
|
|
||||||
VALUE hash;
|
|
||||||
|
|
||||||
lorcon_driver_t *drvlist, *dri;
|
|
||||||
|
|
||||||
list = rb_hash_new();
|
|
||||||
|
|
||||||
dri = drvlist = lorcon_list_drivers();
|
|
||||||
|
|
||||||
if (dri == NULL)
|
|
||||||
return Qnil;
|
|
||||||
|
|
||||||
while (dri) {
|
|
||||||
hash = rb_hash_new();
|
|
||||||
rb_hash_aset(hash, rb_str_new2("name"), rb_str_new2(dri->name));
|
|
||||||
rb_hash_aset(hash, rb_str_new2("description"), rb_str_new2(dri->details));
|
|
||||||
rb_hash_aset(list, rb_str_new2(dri->name),hash);
|
|
||||||
dri = dri->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
lorcon_free_driver_list(drvlist);
|
|
||||||
|
|
||||||
return(list);
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE Lorcon_find_driver(VALUE self, VALUE driver) {
|
|
||||||
VALUE hash;
|
|
||||||
lorcon_driver_t *dri;
|
|
||||||
char *drivert = RSTRING_PTR(driver);
|
|
||||||
|
|
||||||
dri = lorcon_find_driver(drivert);
|
|
||||||
|
|
||||||
if (dri == NULL)
|
|
||||||
return Qnil;
|
|
||||||
|
|
||||||
hash = rb_hash_new();
|
|
||||||
|
|
||||||
rb_hash_aset(hash, rb_str_new2("name"), rb_str_new2(dri->name));
|
|
||||||
rb_hash_aset(hash, rb_str_new2("description"), rb_str_new2(dri->details));
|
|
||||||
|
|
||||||
lorcon_free_driver_list(dri);
|
|
||||||
|
|
||||||
return(hash);
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE Lorcon_auto_driver(VALUE self, VALUE interface) {
|
|
||||||
VALUE hash;
|
|
||||||
lorcon_driver_t *dri;
|
|
||||||
char *intf = RSTRING_PTR(interface);
|
|
||||||
|
|
||||||
dri = lorcon_auto_driver(intf);
|
|
||||||
|
|
||||||
if (dri == NULL)
|
|
||||||
return Qnil;
|
|
||||||
|
|
||||||
hash = rb_hash_new();
|
|
||||||
rb_hash_aset(hash, rb_str_new2("name"), rb_str_new2(dri->name));
|
|
||||||
rb_hash_aset(hash, rb_str_new2("description"), rb_str_new2(dri->details));
|
|
||||||
|
|
||||||
lorcon_free_driver_list(dri);
|
|
||||||
|
|
||||||
return hash;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Lorcon_free(struct rldev *rld) {
|
|
||||||
if (rld->context != NULL)
|
|
||||||
lorcon_free(rld->context);
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE Lorcon_create(int argc, VALUE *argv, VALUE self) {
|
|
||||||
struct rldev *rld;
|
|
||||||
char *intf = NULL, *driver = NULL;
|
|
||||||
VALUE rbdriver, rbintf, obj;
|
|
||||||
lorcon_driver_t *dri;
|
|
||||||
|
|
||||||
if (argc == 2) {
|
|
||||||
rb_scan_args(argc, argv, "2", &rbintf, &rbdriver);
|
|
||||||
intf = StringValuePtr(rbintf);
|
|
||||||
driver = StringValuePtr(rbdriver);
|
|
||||||
} else {
|
|
||||||
rb_scan_args(argc, argv, "1", &rbintf);
|
|
||||||
intf = StringValuePtr(rbintf);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (driver == NULL) {
|
|
||||||
if ((dri = lorcon_auto_driver(intf)) == NULL) {
|
|
||||||
rb_raise(rb_eRuntimeError,
|
|
||||||
"LORCON could not detect a driver and none specified");
|
|
||||||
return (Qnil);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ((dri = lorcon_find_driver(driver)) == NULL) {
|
|
||||||
rb_raise(rb_eArgError,
|
|
||||||
"LORCON could not recognize the specified driver");
|
|
||||||
return (Qnil);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
obj = Data_Make_Struct(cDevice, struct rldev, 0, Lorcon_free, rld);
|
|
||||||
|
|
||||||
rld->context = lorcon_create(intf, dri);
|
|
||||||
|
|
||||||
// Obsolete: XXX
|
|
||||||
// lorcon_set_timeout(rld->context, 100);
|
|
||||||
|
|
||||||
if (rld->context == NULL) {
|
|
||||||
rb_raise(rb_eRuntimeError,
|
|
||||||
"LORCON could not create context");
|
|
||||||
return (Qnil);
|
|
||||||
}
|
|
||||||
|
|
||||||
lorcon_free_driver_list(dri);
|
|
||||||
|
|
||||||
rb_obj_call_init(obj, 0, 0);
|
|
||||||
return(obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static VALUE Lorcon_open_inject(VALUE self) {
|
|
||||||
struct rldev *rld;
|
|
||||||
|
|
||||||
Data_Get_Struct(self, struct rldev, rld);
|
|
||||||
|
|
||||||
if (lorcon_open_inject(rld->context) < 0)
|
|
||||||
return Qfalse;
|
|
||||||
|
|
||||||
return Qtrue;
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE Lorcon_open_monitor(VALUE self) {
|
|
||||||
struct rldev *rld;
|
|
||||||
|
|
||||||
Data_Get_Struct(self, struct rldev, rld);
|
|
||||||
|
|
||||||
if (lorcon_open_monitor(rld->context) < 0)
|
|
||||||
return Qfalse;
|
|
||||||
|
|
||||||
return Qtrue;
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE Lorcon_open_injmon(VALUE self) {
|
|
||||||
struct rldev *rld;
|
|
||||||
|
|
||||||
Data_Get_Struct(self, struct rldev, rld);
|
|
||||||
|
|
||||||
if (lorcon_open_injmon(rld->context) < 0)
|
|
||||||
return Qfalse;
|
|
||||||
|
|
||||||
return Qtrue;
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE Lorcon_get_error(VALUE self) {
|
|
||||||
struct rldev *rld;
|
|
||||||
|
|
||||||
Data_Get_Struct(self, struct rldev, rld);
|
|
||||||
|
|
||||||
return rb_str_new2(lorcon_get_error(rld->context));
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE Lorcon_get_capiface(VALUE self) {
|
|
||||||
struct rldev *rld;
|
|
||||||
Data_Get_Struct(self, struct rldev, rld);
|
|
||||||
|
|
||||||
return rb_str_new2(lorcon_get_capiface(rld->context));
|
|
||||||
}
|
|
||||||
|
|
||||||
void Lorcon_packet_free(struct rlpack *rlp) {
|
|
||||||
if (rlp->packet != NULL) {
|
|
||||||
lorcon_packet_free(rlp->packet);
|
|
||||||
rlp->packet = NULL;
|
|
||||||
free(rlp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE Lorcon_packet_create(int argc, VALUE *argv, VALUE self) {
|
|
||||||
struct rlpack *rlp;
|
|
||||||
VALUE obj;
|
|
||||||
|
|
||||||
obj = Data_Make_Struct(cPacket, struct rlpack, 0, Lorcon_packet_free, rlp);
|
|
||||||
|
|
||||||
rlp->packet = (struct lorcon_packet *) malloc(sizeof(struct lorcon_packet));
|
|
||||||
memset(rlp->packet, 0, sizeof(struct lorcon_packet));
|
|
||||||
|
|
||||||
rlp->bssid = NULL;
|
|
||||||
rlp->dot3 = NULL;
|
|
||||||
rlp->len = 0;
|
|
||||||
rlp->dir = 0;
|
|
||||||
|
|
||||||
rb_obj_call_init(obj, 0, 0);
|
|
||||||
return(obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE Lorcon_packet_get_channel(VALUE self) {
|
|
||||||
struct rlpack *rlp;
|
|
||||||
Data_Get_Struct(self, struct rlpack, rlp);
|
|
||||||
|
|
||||||
return INT2FIX(rlp->packet->channel);
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE Lorcon_packet_set_channel(VALUE self, VALUE channel) {
|
|
||||||
struct rlpack *rlp;
|
|
||||||
|
|
||||||
Data_Get_Struct(self, struct rlpack, rlp);
|
|
||||||
|
|
||||||
lorcon_packet_set_channel(rlp->packet, NUM2INT(channel));
|
|
||||||
|
|
||||||
return channel;
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE Lorcon_packet_get_dlt(VALUE self) {
|
|
||||||
struct rlpack *rlp;
|
|
||||||
Data_Get_Struct(self, struct rlpack, rlp);
|
|
||||||
|
|
||||||
return INT2FIX(rlp->packet->dlt);
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE Lorcon_packet_get_bssid(VALUE self) {
|
|
||||||
struct rlpack *rlp;
|
|
||||||
struct lorcon_dot11_extra *extra;
|
|
||||||
Data_Get_Struct(self, struct rlpack, rlp);
|
|
||||||
|
|
||||||
if (rlp->packet->extra_info == NULL ||
|
|
||||||
rlp->packet->extra_type != LORCON_PACKET_EXTRA_80211)
|
|
||||||
return Qnil;
|
|
||||||
|
|
||||||
extra = (struct lorcon_dot11_extra *) rlp->packet->extra_info;
|
|
||||||
|
|
||||||
if (extra->bssid_mac == NULL)
|
|
||||||
return Qnil;
|
|
||||||
|
|
||||||
return rb_str_new((char *)extra->bssid_mac, 6);
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE Lorcon_packet_get_source(VALUE self) {
|
|
||||||
struct rlpack *rlp;
|
|
||||||
struct lorcon_dot11_extra *extra;
|
|
||||||
Data_Get_Struct(self, struct rlpack, rlp);
|
|
||||||
|
|
||||||
if (rlp->packet->extra_info == NULL ||
|
|
||||||
rlp->packet->extra_type != LORCON_PACKET_EXTRA_80211)
|
|
||||||
return Qnil;
|
|
||||||
|
|
||||||
extra = (struct lorcon_dot11_extra *) rlp->packet->extra_info;
|
|
||||||
|
|
||||||
if (extra->source_mac == NULL)
|
|
||||||
return Qnil;
|
|
||||||
|
|
||||||
return rb_str_new((char *)extra->source_mac, 6);
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE Lorcon_packet_get_dest(VALUE self) {
|
|
||||||
struct rlpack *rlp;
|
|
||||||
struct lorcon_dot11_extra *extra;
|
|
||||||
Data_Get_Struct(self, struct rlpack, rlp);
|
|
||||||
|
|
||||||
if (rlp->packet->extra_info == NULL ||
|
|
||||||
rlp->packet->extra_type != LORCON_PACKET_EXTRA_80211)
|
|
||||||
return Qnil;
|
|
||||||
|
|
||||||
extra = (struct lorcon_dot11_extra *) rlp->packet->extra_info;
|
|
||||||
|
|
||||||
if (extra->dest_mac == NULL)
|
|
||||||
return Qnil;
|
|
||||||
|
|
||||||
return rb_str_new((char *)extra->dest_mac, 6);
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE Lorcon_packet_get_rawdata(VALUE self) {
|
|
||||||
struct rlpack *rlp;
|
|
||||||
Data_Get_Struct(self, struct rlpack, rlp);
|
|
||||||
|
|
||||||
if (rlp->packet->packet_raw == NULL)
|
|
||||||
return Qnil;
|
|
||||||
|
|
||||||
return rb_str_new((char *)rlp->packet->packet_raw, rlp->packet->length);
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE Lorcon_packet_get_headerdata(VALUE self) {
|
|
||||||
struct rlpack *rlp;
|
|
||||||
Data_Get_Struct(self, struct rlpack, rlp);
|
|
||||||
|
|
||||||
if (rlp->packet->packet_header == NULL)
|
|
||||||
return Qnil;
|
|
||||||
|
|
||||||
return rb_str_new((char *)rlp->packet->packet_header, rlp->packet->length_header);
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE Lorcon_packet_get_data(VALUE self) {
|
|
||||||
struct rlpack *rlp;
|
|
||||||
Data_Get_Struct(self, struct rlpack, rlp);
|
|
||||||
|
|
||||||
if (rlp->packet->packet_data == NULL)
|
|
||||||
return Qnil;
|
|
||||||
|
|
||||||
return rb_str_new((char *)rlp->packet->packet_data, rlp->packet->length_data);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static VALUE Lorcon_packet_getdot3(VALUE self) {
|
|
||||||
struct rlpack *rlp;
|
|
||||||
u_char *pdata;
|
|
||||||
int len;
|
|
||||||
VALUE ret;
|
|
||||||
|
|
||||||
Data_Get_Struct(self, struct rlpack, rlp);
|
|
||||||
|
|
||||||
if (rlp->packet->packet_data == NULL)
|
|
||||||
return Qnil;
|
|
||||||
|
|
||||||
len = lorcon_packet_to_dot3(rlp->packet, &pdata);
|
|
||||||
|
|
||||||
ret = rb_str_new((char *)pdata, len);
|
|
||||||
|
|
||||||
free(pdata);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE Lorcon_packet_prepdot3(VALUE self, VALUE dot3) {
|
|
||||||
struct rlpack *rlp;
|
|
||||||
Data_Get_Struct(self, struct rlpack, rlp);
|
|
||||||
|
|
||||||
rlp->dot3 = (unsigned char *) RSTRING_PTR(dot3);
|
|
||||||
rlp->len = RSTRING_LEN(dot3);
|
|
||||||
|
|
||||||
return dot3;
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE Lorcon_packet_prepbssid(VALUE self, VALUE bssid) {
|
|
||||||
struct rlpack *rlp;
|
|
||||||
Data_Get_Struct(self, struct rlpack, rlp);
|
|
||||||
|
|
||||||
rlp->bssid = (unsigned char *)RSTRING_PTR(bssid);
|
|
||||||
|
|
||||||
return bssid;
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE Lorcon_packet_prepdir(VALUE self, VALUE dir) {
|
|
||||||
struct rlpack *rlp;
|
|
||||||
Data_Get_Struct(self, struct rlpack, rlp);
|
|
||||||
|
|
||||||
rlp->dir = NUM2INT(dir);
|
|
||||||
|
|
||||||
return dir;
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE Lorcon_packet_getdir(VALUE self) {
|
|
||||||
struct rlpack *rlp;
|
|
||||||
struct lorcon_dot11_extra *extra;
|
|
||||||
Data_Get_Struct(self, struct rlpack, rlp);
|
|
||||||
|
|
||||||
if (rlp->dir != 0)
|
|
||||||
return INT2FIX(rlp->dir);
|
|
||||||
|
|
||||||
if (rlp->packet == NULL)
|
|
||||||
return Qnil;
|
|
||||||
|
|
||||||
if (rlp->packet->extra_info == NULL ||
|
|
||||||
rlp->packet->extra_type != LORCON_PACKET_EXTRA_80211)
|
|
||||||
return Qnil;
|
|
||||||
|
|
||||||
extra = (struct lorcon_dot11_extra *) rlp->packet->extra_info;
|
|
||||||
|
|
||||||
if (extra->from_ds && !extra->to_ds)
|
|
||||||
return INT2FIX(LORCON_DOT11_DIR_FROMDS);
|
|
||||||
else if (!extra->from_ds && extra->to_ds)
|
|
||||||
return INT2FIX(LORCON_DOT11_DIR_TODS);
|
|
||||||
else if (!extra->from_ds && !extra->to_ds)
|
|
||||||
return INT2FIX(LORCON_DOT11_DIR_ADHOCDS);
|
|
||||||
else if (extra->from_ds && extra->to_ds)
|
|
||||||
return INT2FIX(LORCON_DOT11_DIR_INTRADS);
|
|
||||||
|
|
||||||
return Qnil;
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE Lorcon_packet_get_rawlength(VALUE self) {
|
|
||||||
struct rlpack *rlp;
|
|
||||||
Data_Get_Struct(self, struct rlpack, rlp);
|
|
||||||
|
|
||||||
return INT2FIX(rlp->packet->length);
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE Lorcon_packet_get_headerlength(VALUE self) {
|
|
||||||
struct rlpack *rlp;
|
|
||||||
Data_Get_Struct(self, struct rlpack, rlp);
|
|
||||||
|
|
||||||
return INT2FIX(rlp->packet->length_header);
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE Lorcon_packet_get_datalength(VALUE self) {
|
|
||||||
struct rlpack *rlp;
|
|
||||||
Data_Get_Struct(self, struct rlpack, rlp);
|
|
||||||
|
|
||||||
return INT2FIX(rlp->packet->length_data);
|
|
||||||
}
|
|
||||||
|
|
||||||
VALUE new_lorcon_packet(struct lorcon_packet **packet) {
|
|
||||||
struct rlpack *rlp;
|
|
||||||
VALUE obj;
|
|
||||||
|
|
||||||
obj = Data_Make_Struct(cPacket, struct rlpack, 0, Lorcon_packet_free, rlp);
|
|
||||||
|
|
||||||
rlp->packet = *packet;
|
|
||||||
rb_obj_call_init(obj, 0, 0);
|
|
||||||
return(obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE Lorcon_inject_packet(VALUE self, VALUE packet) {
|
|
||||||
struct rldev *rld;
|
|
||||||
struct rlpack *rlp;
|
|
||||||
lorcon_packet_t *pack = NULL;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (rb_obj_is_kind_of(packet, cPacket) == 0) {
|
|
||||||
rb_raise(rb_eTypeError, "wrong type expected %s", rb_class2name(cPacket));
|
|
||||||
return Qnil;
|
|
||||||
}
|
|
||||||
|
|
||||||
Data_Get_Struct(self, struct rldev, rld);
|
|
||||||
Data_Get_Struct(packet, struct rlpack, rlp);
|
|
||||||
|
|
||||||
if (rlp->bssid != NULL && rlp->dot3 != NULL) {
|
|
||||||
pack = lorcon_packet_from_dot3(rlp->bssid, rlp->dir, rlp->dot3, rlp->len);
|
|
||||||
ret = lorcon_inject(rld->context, pack);
|
|
||||||
lorcon_packet_free(pack);
|
|
||||||
} else {
|
|
||||||
ret = lorcon_inject(rld->context, rlp->packet);
|
|
||||||
}
|
|
||||||
|
|
||||||
return INT2FIX(ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE Lorcon_write_raw(VALUE self, VALUE rpacket) {
|
|
||||||
struct rldev *rld;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
Data_Get_Struct(self, struct rldev, rld);
|
|
||||||
|
|
||||||
if(TYPE(rpacket) != T_STRING) {
|
|
||||||
rb_raise(rb_eArgError, "packet data must be a string");
|
|
||||||
return Qnil;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = lorcon_send_bytes(rld->context, RSTRING_LEN(rpacket), (unsigned char *)RSTRING_PTR(rpacket));
|
|
||||||
return INT2FIX(ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE Lorcon_set_filter(VALUE self, VALUE filter) {
|
|
||||||
struct rldev *rld;
|
|
||||||
Data_Get_Struct(self, struct rldev, rld);
|
|
||||||
return INT2FIX(lorcon_set_filter(rld->context, RSTRING_PTR(filter)));
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE Lorcon_set_channel(VALUE self, VALUE channel) {
|
|
||||||
struct rldev *rld;
|
|
||||||
Data_Get_Struct(self, struct rldev, rld);
|
|
||||||
return INT2FIX(lorcon_set_channel(rld->context, NUM2INT(channel)));
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE Lorcon_get_channel(VALUE self) {
|
|
||||||
struct rldev *rld;
|
|
||||||
Data_Get_Struct(self, struct rldev, rld);
|
|
||||||
return INT2FIX(lorcon_get_channel(rld->context));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void rblorcon_pcap_handler(rblorconjob_t *job, struct pcap_pkthdr *hdr, u_char *pkt){
|
|
||||||
job->pkt = (unsigned char *)pkt;
|
|
||||||
job->hdr = *hdr;
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE Lorcon_capture_next(VALUE self) {
|
|
||||||
struct rldev *rld;
|
|
||||||
int ret = 0;
|
|
||||||
struct lorcon_packet *packet;
|
|
||||||
unsigned char *raw;
|
|
||||||
pcap_t *pd;
|
|
||||||
rblorconjob_t job;
|
|
||||||
Data_Get_Struct(self, struct rldev, rld);
|
|
||||||
|
|
||||||
pd = lorcon_get_pcap(rld->context);
|
|
||||||
|
|
||||||
#ifndef RUBY_19
|
|
||||||
TRAP_BEG;
|
|
||||||
#endif
|
|
||||||
ret = pcap_dispatch(pd, 1, (pcap_handler) rblorcon_pcap_handler, (u_char *)&job);
|
|
||||||
#ifndef RUBY_19
|
|
||||||
TRAP_END;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (ret == 0)
|
|
||||||
return(Qnil);
|
|
||||||
|
|
||||||
if (ret < 0 || job.hdr.caplen <= 0)
|
|
||||||
return INT2FIX(ret);
|
|
||||||
|
|
||||||
raw = malloc(job.hdr.caplen);
|
|
||||||
if(! raw) return Qnil;
|
|
||||||
|
|
||||||
memcpy(raw, job.pkt, job.hdr.caplen);
|
|
||||||
packet = lorcon_packet_from_pcap(rld->context, &job.hdr, raw);
|
|
||||||
lorcon_packet_set_freedata(packet, 1);
|
|
||||||
|
|
||||||
return new_lorcon_packet(&packet);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static VALUE Lorcon_capture_loop(int argc, VALUE *argv, VALUE self) {
|
|
||||||
struct rldev *rld;
|
|
||||||
int count = 0;
|
|
||||||
int p = 0;
|
|
||||||
VALUE v_cnt;
|
|
||||||
VALUE ret;
|
|
||||||
int fd;
|
|
||||||
|
|
||||||
Data_Get_Struct(self, struct rldev, rld);
|
|
||||||
|
|
||||||
if (rb_scan_args(argc, argv, "01", &v_cnt) >= 1) {
|
|
||||||
count = FIX2INT(v_cnt);
|
|
||||||
} else {
|
|
||||||
count = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
fd = lorcon_get_selectable_fd(rld->context);
|
|
||||||
if(fd < 0 ) {
|
|
||||||
rb_raise(rb_eRuntimeError,
|
|
||||||
"LORCON context could not provide a pollable descriptor "
|
|
||||||
"and we need one for the threaded dispatch loop");
|
|
||||||
}
|
|
||||||
|
|
||||||
while (p < count || count <= 0) {
|
|
||||||
ret = Lorcon_capture_next(self);
|
|
||||||
if(TYPE(ret) == T_FIXNUM) return(ret);
|
|
||||||
if(ret == Qnil) {
|
|
||||||
rb_thread_wait_fd(fd);
|
|
||||||
} else {
|
|
||||||
rb_yield(ret);
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return INT2FIX(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Init_Lorcon2() {
|
|
||||||
mLorcon = rb_define_module("Lorcon");
|
|
||||||
|
|
||||||
cPacket = rb_define_class_under(mLorcon, "Packet", rb_cObject);
|
|
||||||
|
|
||||||
rb_define_const(cPacket, "LORCON_FROM_DS", INT2NUM(LORCON_DOT11_DIR_FROMDS));
|
|
||||||
rb_define_const(cPacket, "LORCON_TO_DS", INT2NUM(LORCON_DOT11_DIR_TODS));
|
|
||||||
rb_define_const(cPacket, "LORCON_INTRA_DS", INT2NUM(LORCON_DOT11_DIR_INTRADS));
|
|
||||||
rb_define_const(cPacket, "LORCON_ADHOC_DS", INT2NUM(LORCON_DOT11_DIR_ADHOCDS));
|
|
||||||
|
|
||||||
rb_define_singleton_method(cPacket, "new", Lorcon_packet_create, -1);
|
|
||||||
rb_define_method(cPacket, "bssid", Lorcon_packet_get_bssid, 0);
|
|
||||||
rb_define_method(cPacket, "source", Lorcon_packet_get_source, 0);
|
|
||||||
rb_define_method(cPacket, "dest", Lorcon_packet_get_dest, 0);
|
|
||||||
|
|
||||||
rb_define_method(cPacket, "channel", Lorcon_packet_get_channel, 0);
|
|
||||||
rb_define_method(cPacket, "channel=", Lorcon_packet_set_channel, 1);
|
|
||||||
rb_define_method(cPacket, "dlt", Lorcon_packet_get_dlt, 0);
|
|
||||||
|
|
||||||
rb_define_method(cPacket, "rawdata", Lorcon_packet_get_rawdata, 0);
|
|
||||||
rb_define_method(cPacket, "headerdata", Lorcon_packet_get_headerdata, 0);
|
|
||||||
rb_define_method(cPacket, "data", Lorcon_packet_get_data, 0);
|
|
||||||
|
|
||||||
rb_define_method(cPacket, "dot3", Lorcon_packet_getdot3, 0);
|
|
||||||
|
|
||||||
rb_define_method(cPacket, "dot3=", Lorcon_packet_prepdot3, 1);
|
|
||||||
rb_define_method(cPacket, "bssid=", Lorcon_packet_prepbssid, 1);
|
|
||||||
rb_define_method(cPacket, "direction=", Lorcon_packet_prepdir, 1);
|
|
||||||
rb_define_method(cPacket, "direction", Lorcon_packet_getdir, 0);
|
|
||||||
|
|
||||||
rb_define_method(cPacket, "size", Lorcon_packet_get_rawlength, 0);
|
|
||||||
rb_define_method(cPacket, "linesize", Lorcon_packet_get_rawlength, 0);
|
|
||||||
rb_define_method(cPacket, "headersize", Lorcon_packet_get_headerlength, 0);
|
|
||||||
rb_define_method(cPacket, "datasize", Lorcon_packet_get_datalength, 0);
|
|
||||||
|
|
||||||
cDevice = rb_define_class_under(mLorcon, "Device", rb_cObject);
|
|
||||||
rb_define_singleton_method(cDevice, "new", Lorcon_create, -1);
|
|
||||||
rb_define_method(cDevice, "openinject", Lorcon_open_inject, 0);
|
|
||||||
rb_define_method(cDevice, "openmonitor", Lorcon_open_monitor, 0);
|
|
||||||
rb_define_method(cDevice, "openinjmon", Lorcon_open_injmon, 0);
|
|
||||||
rb_define_method(cDevice, "error", Lorcon_get_error, 0);
|
|
||||||
rb_define_method(cDevice, "capiface", Lorcon_get_capiface, 0);
|
|
||||||
|
|
||||||
rb_define_method(cDevice, "filter=", Lorcon_set_filter, 1);
|
|
||||||
rb_define_method(cDevice, "channel=", Lorcon_set_channel, 1);
|
|
||||||
rb_define_method(cDevice, "channel", Lorcon_get_channel, 0);
|
|
||||||
|
|
||||||
rb_define_method(cDevice, "loop", Lorcon_capture_loop, -1);
|
|
||||||
rb_define_method(cDevice, "each", Lorcon_capture_loop, -1);
|
|
||||||
rb_define_method(cDevice, "each_packet", Lorcon_capture_loop, -1);
|
|
||||||
rb_define_method(cDevice, "write", Lorcon_write_raw, 1);
|
|
||||||
rb_define_method(cDevice, "inject", Lorcon_inject_packet, 1);
|
|
||||||
rb_define_module_function(mLorcon, "drivers", Lorcon_list_drivers, 0);
|
|
||||||
rb_define_module_function(mLorcon, "version", Lorcon_get_version, 0);
|
|
||||||
rb_define_module_function(mLorcon, "find_driver", Lorcon_find_driver, 1);
|
|
||||||
rb_define_module_function(mLorcon, "auto_driver", Lorcon_auto_driver, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,31 +0,0 @@
|
||||||
#ifndef _MSFLORCON_H
|
|
||||||
#define _MSFLORCON_H
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
|
|
||||||
#include <lorcon2/lorcon.h>
|
|
||||||
#include <pcap.h>
|
|
||||||
|
|
||||||
struct rldev {
|
|
||||||
struct lorcon *context;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct rlpack {
|
|
||||||
struct lorcon_packet *packet;
|
|
||||||
|
|
||||||
/* dot3 construction via multiple elements */
|
|
||||||
u_char *bssid, *dot3;
|
|
||||||
int dir, len;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct rblorconjob {
|
|
||||||
struct pcap_pkthdr hdr;
|
|
||||||
unsigned char *pkt;
|
|
||||||
} rblorconjob_t;
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,41 +0,0 @@
|
||||||
This is an experimental interface for lorcon, a 802.11 library
|
|
||||||
developed by Joshua Wright and dragorn. This interface is only
|
|
||||||
available on Linux and with lorcon-supported wireless drivers.
|
|
||||||
|
|
||||||
For more information, please see the lorcon documentation and code:
|
|
||||||
http://www.802.11mercenary.net/lorcon/
|
|
||||||
|
|
||||||
To build this extension:
|
|
||||||
|
|
||||||
1) Download, compile, and install lorcon
|
|
||||||
The latest version of lorcon can pulled from SVN:
|
|
||||||
$ svn co https://802.11ninja.net/svn/lorcon/trunk/ lorcon
|
|
||||||
$ cd lorcon
|
|
||||||
$ ./configure
|
|
||||||
$ make
|
|
||||||
$ sudo make install
|
|
||||||
-- or --
|
|
||||||
$ su
|
|
||||||
# make install
|
|
||||||
# exit
|
|
||||||
$ cd ..
|
|
||||||
|
|
||||||
2) build the ruby extension..
|
|
||||||
$ ruby extconf.rb
|
|
||||||
$ make
|
|
||||||
$ sudo make install
|
|
||||||
-- or --
|
|
||||||
$ su
|
|
||||||
# make install
|
|
||||||
|
|
||||||
|
|
||||||
NOTES:
|
|
||||||
|
|
||||||
if Ubuntu 8.04 (and probably others) bitches about 'mkmf',
|
|
||||||
you need ruby dev package.
|
|
||||||
|
|
||||||
:~/metasploit/external/ruby-lorcon$ ruby extconf.rb
|
|
||||||
extconf.rb:2:in `require': no such file to load -- mkmf (LoadError)
|
|
||||||
from extconf.rb:2
|
|
||||||
|
|
||||||
:~/metasploit/external/ruby-lorcon$ sudo apt-get install ruby1.8-dev
|
|
|
@ -1,16 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
require 'mkmf'
|
|
||||||
|
|
||||||
|
|
||||||
$CFLAGS += " -I/usr/include/lorcon2"
|
|
||||||
|
|
||||||
if ( RUBY_VERSION =~ /^(1\.9|2\.0)/ )
|
|
||||||
$CFLAGS += " -DRUBY_19"
|
|
||||||
end
|
|
||||||
|
|
||||||
if find_library("orcon2", "lorcon_list_drivers", "lorcon2/lorcon.h")
|
|
||||||
create_makefile("Lorcon2")
|
|
||||||
else
|
|
||||||
puts "Error: the lorcon2 library was not found, please see the README"
|
|
||||||
end
|
|
||||||
|
|
|
@ -1,59 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
|
|
||||||
$:.unshift(File.dirname(__FILE__))
|
|
||||||
|
|
||||||
require "Lorcon2"
|
|
||||||
require 'thread'
|
|
||||||
require "pp"
|
|
||||||
|
|
||||||
intf = ARGV.shift || "wlan0"
|
|
||||||
|
|
||||||
$stdout.puts "Checking LORCON version"
|
|
||||||
|
|
||||||
pp Lorcon.version
|
|
||||||
|
|
||||||
$stdout.puts "\nFetching LORCON driver list"
|
|
||||||
|
|
||||||
pp Lorcon.drivers
|
|
||||||
|
|
||||||
$stdout.puts "\nResolving driver by name 'mac80211'"
|
|
||||||
|
|
||||||
pp Lorcon.find_driver("mac80211")
|
|
||||||
|
|
||||||
$stdout.puts "\nAuto-detecting driver for interface wlan0"
|
|
||||||
|
|
||||||
pp Lorcon.auto_driver(intf)
|
|
||||||
|
|
||||||
|
|
||||||
tx = Lorcon::Device.new(intf)
|
|
||||||
$stdout.puts "\nCreated LORCON context"
|
|
||||||
|
|
||||||
if tx.openinjmon()
|
|
||||||
$stdout.puts "\nOpened as INJMON: " + tx.capiface
|
|
||||||
else
|
|
||||||
$stdout.puts "\nFAILED to open " + tx.capiface + " as INJMON: " + tx.error
|
|
||||||
end
|
|
||||||
|
|
||||||
def safe_loop(wifi)
|
|
||||||
@q = Queue.new
|
|
||||||
reader = Thread.new do
|
|
||||||
wifi.each_packet {|pkt| @q << pkt }
|
|
||||||
end
|
|
||||||
|
|
||||||
eater = Thread.new do
|
|
||||||
while(pkt = @q.pop)
|
|
||||||
yield(pkt)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
begin
|
|
||||||
eater.join
|
|
||||||
rescue ::Interrupt => e
|
|
||||||
reader.kill if reader.alive?
|
|
||||||
puts "ALL DONE!"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
safe_loop(tx) do |pkt|
|
|
||||||
pp pkt
|
|
||||||
end
|
|
|
@ -1,11 +0,0 @@
|
||||||
Path: .
|
|
||||||
URL: http://802.11ninja.net/svn/lorcon/trunk/ruby-lorcon
|
|
||||||
Repository Root: http://802.11ninja.net/svn/lorcon
|
|
||||||
Repository UUID: 61418039-352c-0410-8488-9e586b2135b2
|
|
||||||
Revision: 204
|
|
||||||
Node Kind: directory
|
|
||||||
Schedule: normal
|
|
||||||
Last Changed Author: dragorn
|
|
||||||
Last Changed Rev: 202
|
|
||||||
Last Changed Date: 2009-09-15 09:31:29 -0500 (Tue, 15 Sep 2009)
|
|
||||||
|
|
Loading…
Reference in New Issue