Overhaul of the ruby-lorcon module to match pylorcon.
git-svn-id: file:///home/svn/framework3/trunk@5124 4d416f70-5f16-0410-b530-b9f4589650daunstable
parent
09485b52e7
commit
ceb69bb541
|
@ -2,7 +2,12 @@
|
|||
#include "ruby.h"
|
||||
|
||||
/*
|
||||
This is a derivative of the tx.c sample included with lorcon
|
||||
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
|
||||
|
@ -19,66 +24,420 @@
|
|||
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
|
||||
*/
|
||||
|
||||
/*
|
||||
Ruby-Lorcon specifics are Copyright (c) 2006 Metasploit LLC
|
||||
All ruby-lorcon/rubyisms are by Metasploit LLC (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_ary_new();
|
||||
list = rb_hash_new();
|
||||
cards = tx80211_getcardlist();
|
||||
if (cards == NULL) {
|
||||
return(Qnil);
|
||||
}
|
||||
|
||||
for (i = 1; i < cards->num_cards; i++)
|
||||
rb_ary_push(list, rb_str_new2(cards->cardnames[i]));
|
||||
|
||||
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_driver_get_channel(VALUE self) {
|
||||
struct tx80211 *in_tx;
|
||||
Data_Get_Struct(self, struct tx80211, in_tx);
|
||||
return INT2NUM(tx80211_getchannel(in_tx));
|
||||
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_driver_set_channel(VALUE self, VALUE channel) {
|
||||
struct tx80211 *in_tx;
|
||||
Data_Get_Struct(self, struct tx80211, in_tx);
|
||||
tx80211_setchannel(in_tx, NUM2INT(channel));
|
||||
return INT2NUM(tx80211_getchannel(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_driver_free(struct tx80211 *in_tx) {
|
||||
tx80211_close(in_tx);
|
||||
free(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_driver_open(int argc, VALUE *argv, VALUE self) {
|
||||
struct tx80211 *in_tx;
|
||||
|
||||
static VALUE lorcon_device_get_mode(VALUE self) {
|
||||
struct rldev *rld;
|
||||
Data_Get_Struct(self, struct rldev, rld);
|
||||
int mode;
|
||||
|
||||
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;
|
||||
Data_Get_Struct(self, struct rldev, rld);
|
||||
|
||||
char *setmode = StringValuePtr(rmode);
|
||||
int mode = -1;
|
||||
|
||||
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;
|
||||
Data_Get_Struct(self, struct rldev, rld);
|
||||
|
||||
char *funcmode = StringValuePtr(rmode);
|
||||
int mode = -1;
|
||||
|
||||
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;
|
||||
Data_Get_Struct(self, struct rldev, rld);
|
||||
|
||||
int txrate;
|
||||
txrate = tx80211_gettxrate(&rld->in_packet);
|
||||
|
||||
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, rbchannel;
|
||||
VALUE rbdriver, rbintf;
|
||||
VALUE obj;
|
||||
|
||||
if (rb_scan_args(argc, argv, "21", &rbintf, &rbdriver, &rbchannel) == 2) {
|
||||
rbchannel = INT2NUM(11);
|
||||
}
|
||||
|
||||
driver = STR2CSTR(rbdriver);
|
||||
intf = STR2CSTR(rbintf);
|
||||
rb_scan_args(argc, argv, "2", &rbintf, &rbdriver);
|
||||
|
||||
obj = Data_Make_Struct(cDevice, struct tx80211, 0, lorcon_driver_free, in_tx);
|
||||
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) {
|
||||
|
@ -86,29 +445,15 @@ static VALUE lorcon_driver_open(int argc, VALUE *argv, VALUE self) {
|
|||
return(Qnil);
|
||||
}
|
||||
|
||||
if (tx80211_init(in_tx, intf, drivertype) < 0) {
|
||||
rb_raise(rb_eRuntimeError, "Lorcon could not initialize the interface");
|
||||
return(Qnil);
|
||||
}
|
||||
|
||||
ret = tx80211_setfunctionalmode(in_tx, TX80211_FUNCMODE_INJECT);
|
||||
if (ret != 0) {
|
||||
//rb_raise(rb_eRuntimeError, "Lorcon could not place the card into monitor mode");
|
||||
rb_raise(rb_eRuntimeError, "Lorcon could not place the card into injection + monitor mode");
|
||||
return(Qnil);
|
||||
}
|
||||
|
||||
/* Switch to the given channel */
|
||||
ret = tx80211_setchannel(in_tx, NUM2INT(rbchannel));
|
||||
if (ret < 0) {
|
||||
rb_raise(rb_eRuntimeError, "Lorcon could not set the channel");
|
||||
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(in_tx);
|
||||
ret = tx80211_open(&rld->in_tx);
|
||||
if (ret < 0) {
|
||||
rb_raise(rb_eRuntimeError, "Lorcon could not open the interface");
|
||||
rb_raise(rb_eRuntimeError, "Lorcon could not open the interface: %s", tx80211_geterrstr(&rld->in_tx));
|
||||
return(Qnil);
|
||||
}
|
||||
|
||||
|
@ -116,16 +461,15 @@ static VALUE lorcon_driver_open(int argc, VALUE *argv, VALUE self) {
|
|||
return(obj);
|
||||
}
|
||||
|
||||
static VALUE lorcon_driver_write(int argc, VALUE *argv, VALUE self) {
|
||||
struct tx80211_packet in_packet;
|
||||
struct tx80211 *in_tx;
|
||||
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 tx80211, in_tx);
|
||||
Data_Get_Struct(self, struct rldev, rld);
|
||||
|
||||
switch(rb_scan_args(argc, argv, "12", &rbbuff, &rbcnt, &rbdelay)) {
|
||||
case 1:
|
||||
|
@ -139,32 +483,11 @@ static VALUE lorcon_driver_write(int argc, VALUE *argv, VALUE self) {
|
|||
cnt = NUM2INT(rbcnt);
|
||||
dly = NUM2INT(rbdelay);
|
||||
|
||||
|
||||
/* Initialize the packet structure */
|
||||
tx80211_initpacket(&in_packet);
|
||||
|
||||
/* Modulation and rate are per-packet parameters */
|
||||
if ((tx80211_getcapabilities(in_tx) & TX80211_CAP_SETMODULATION) != 0) {
|
||||
ret = tx80211_setmodulation(in_tx, &in_packet, TX80211_MOD_DSSS);
|
||||
if (ret < 0) {
|
||||
rb_raise(rb_eRuntimeError, "Lorcon could not set the modulation mechanism.");
|
||||
return(Qnil);
|
||||
}
|
||||
}
|
||||
|
||||
if ((tx80211_getcapabilities(in_tx) & TX80211_CAP_SETRATE) != 0) {
|
||||
ret = tx80211_settxrate(in_tx, &in_packet, TX80211_RATE_2MB);
|
||||
if (ret < 0) {
|
||||
rb_raise(rb_eRuntimeError, "Lorcon could not set the tx rate.");
|
||||
return(Qnil);
|
||||
}
|
||||
}
|
||||
|
||||
in_packet.packet = StringValuePtr(rbbuff);
|
||||
in_packet.plen = RSTRING(rbbuff)->len;
|
||||
rld->in_packet.packet = StringValuePtr(rbbuff);
|
||||
rld->in_packet.plen = RSTRING(rbbuff)->len;
|
||||
|
||||
for (; cnt > 0; cnt--) {
|
||||
ret = tx80211_txpacket(in_tx, &in_packet);
|
||||
ret = tx80211_txpacket(&rld->in_tx, &rld->in_packet);
|
||||
if (ret < 0)
|
||||
return(INT2NUM(ret));
|
||||
if (dly > 0)
|
||||
|
@ -177,10 +500,19 @@ static VALUE lorcon_driver_write(int argc, VALUE *argv, VALUE self) {
|
|||
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_driver_open, -1);
|
||||
rb_define_method(cDevice, "channel", lorcon_driver_get_channel, 0);
|
||||
rb_define_method(cDevice, "channel=", lorcon_driver_set_channel, 1);
|
||||
rb_define_method(cDevice, "write", lorcon_driver_write, -1);
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -9,4 +9,11 @@
|
|||
#include <tx80211.h>
|
||||
#include <tx80211_packet.h>
|
||||
|
||||
|
||||
struct rldev {
|
||||
struct tx80211 in_tx;
|
||||
struct tx80211_packet in_packet;
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
@ -2,8 +2,10 @@
|
|||
|
||||
$:.unshift(File.dirname(__FILE__))
|
||||
require "Lorcon"
|
||||
require "pp"
|
||||
|
||||
$stdout.puts "Drivers: " + Lorcon.drivers.join(", ")
|
||||
pp Lorcon.version
|
||||
pp Lorcon.drivers
|
||||
|
||||
# Beacon frame from tx.c
|
||||
packet = [
|
||||
|
@ -24,7 +26,7 @@ packet = [
|
|||
0x50, 0xf2, 0x02
|
||||
].pack('C*')
|
||||
|
||||
tx = Lorcon::Device.new('ath0', 'madwifi', 1)
|
||||
tx = Lorcon::Device.new('ath0', 'madwifing', 1)
|
||||
|
||||
sa = Time.now.to_f
|
||||
tx.write(packet, 500, 0)
|
||||
|
|
|
@ -19,7 +19,7 @@ module Exploit::Lorcon
|
|||
register_options(
|
||||
[
|
||||
OptString.new('INTERFACE', [true, 'The name of the wireless interface', 'ath0']),
|
||||
OptString.new('DRIVER', [true, 'The name of the wireless driver for lorcon', 'madwifi']),
|
||||
OptString.new('DRIVER', [true, 'The name of the wireless driver for lorcon', 'madwifing']),
|
||||
OptInt.new('CHANNEL', [true, 'The default channel number', 11])
|
||||
], Msf::Exploit::Lorcon
|
||||
)
|
||||
|
@ -47,16 +47,23 @@ module Exploit::Lorcon
|
|||
|
||||
# XXX: Force the interface to be up
|
||||
system("ifconfig", datastore['INTERFACE'], "up")
|
||||
|
||||
self.wifi = ::Lorcon::Device.new(datastore['INTERFACE'], datastore['DRIVER'], datastore['CHANNEL'])
|
||||
|
||||
|
||||
self.wifi = ::Lorcon::Device.new(datastore['INTERFACE'], datastore['DRIVER'])
|
||||
if (not self.wifi)
|
||||
raise RuntimeError, "Could not open the wireless device interface"
|
||||
end
|
||||
|
||||
# Configure the card for reliable injection
|
||||
self.wifi.fmode = "INJECT"
|
||||
self.wifi.channel = (datastore['CHANNEL'] || 11).to_i
|
||||
self.wifi.txrate = 2
|
||||
self.wifi.modulation = "DSSS"
|
||||
|
||||
self.wifi
|
||||
end
|
||||
|
||||
def close_wifi
|
||||
return if not self.wifi
|
||||
self.wifi = nil
|
||||
end
|
||||
|
||||
#
|
||||
|
|
Loading…
Reference in New Issue