summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/wellenreiter/README27
-rw-r--r--noncore/net/wellenreiter/gui/wellenreiter.cpp26
2 files changed, 41 insertions, 12 deletions
diff --git a/noncore/net/wellenreiter/README b/noncore/net/wellenreiter/README
index c04d30c..af2e611 100644
--- a/noncore/net/wellenreiter/README
+++ b/noncore/net/wellenreiter/README
@@ -1,86 +1,99 @@
/*************************************************************************/
/* W e l l e n r e i t e r I I */
/* =============================== */
/* */
-/* Version: Opie-ALPHA */
+ /* Version: Opie-ALPHA-January */
/*************************************************************************/
--------------------------------------------------
-Release Notes for Opie-ALPHA Version December 2002
+Release Notes for Opie-ALPHA Version January 2002
--------------------------------------------------
=====================
= Supported Devices =
=====================
* low-level orinoco_cs-based (including prism2 and spectrum_cs)
-* Supported Interfaces: wlan0 (yes, I know this is hardcoded and
- lame, but we're in a hurry and this can be configured soon...)
-
=====================
= Build =
=====================
To compile Wellenreiter within the Opie build environment, add the
following directories to $OPIEDIR/Makefile, e.g. to 'NONAPPS='
noncore/net/wellenreiter/libwellenreiter \
noncore/net/wellenreiter/daemon \
noncore/net/wellenreiter/contrib/orinoco_hopper \
noncore/net/wellenreiter/gui
./configure and rebuild. Note that you need libpcap in your toolchain.
+To compile Wellenreiter within the OZ build environment, add the
+following lines to $OPIEDIR/packages
+CONFIG_WELLENREITER noncore/net/wellenreiter/libwellenreiter libwellenreiter.pro
+CONFIG_WELLENREITER noncore/net/wellenreiter/daemon daemon.pro
+CONFIG_WELLENREITER noncore/net/wellenreiter/gui gui.pro
+CONFIG_WELLENREITER noncore/net/wellenreiter/contrib/orinoco_hopper orinoco_hopper.pro
+
+make -f Makefile.test clean-configs
+cd <BUILDROOT>
+make SUBDIRS=packages/opie package
+
=====================
= Install =
=====================
Alternatively, you can use our precompiled ipk. Get it from
-http://opie.net.wox.org/elan/current. You will also need libpcap.
+http://opie.net.wox.org/wellenreiter/current/. This also includes a recent libpcap.
=====================
= Run =
=====================
+There are two possible modes: <Manual> and <Automatic>. I suggest, you
+start with the <Automatic> Mode. This works just using the "Start"
+and "Stop" Pushbuttons in the Wellenreiter GUI. If this doesn't work,
+then use the following strategy:
+
1. Place card in monitor mode. This is device dependent.
Caution: Don't do this while you're logged in via ssh
or otherwise using the wireless interface - your connection
will freeze: The card can't be used normally when sniffing!
- For most orinoco-based cards this can be done using
+ For most orinoco-based cards this can be done using either
'iwpriv <interface> 2' or 'iwpriv <interface> 2 1'.
You can check if this works, by calling 'ifconfig <interface>'.
If you see 'Protocol: UNSPEC' and an unusual long MAC-Address,
then your card has been successfully set to the monitor mode.
2. Start a channel hopper. A wireless card has several channels
(e.g. radio frequencies) here it can listen for beacons.
Beacons are management data frames from other stations.
Remember, this is radio transmission, so the card has to be
"tuned" to a certain channel to be able to receive the beacons.
In order to scan the complete frequency spectrum and thus be able
to detect all available stations, you have to 'hop' through the
channels frequently. You can do this manually (e.g. with 'iwconfig')
[hahaha] or you can use a channel hopper.
For convenience, the current Wellenreiter Alpha comes with a
channel hopper for Orinoco-based cards. Start this via
orinoco_hopper <interface>.
3. Start the Wellenreiter sniffing daemon: wellenreiterd.
4. Start the Wellenreiter GUI and sniff like hell. Don't press the button
"Start Scan" yet, because it enables the demo mode and will crash the
wellenreiterd daemon if running.
=====================
= Credits =
=====================
Sniffer: Max Moser <max@remote-exploit.org>
Communication and Protocol: Martin J. Muench <mjm@remote-exploit.org>
GUI: Michael Lauer <mickeyl@handhelds.org>
diff --git a/noncore/net/wellenreiter/gui/wellenreiter.cpp b/noncore/net/wellenreiter/gui/wellenreiter.cpp
index b22c5cc..4ee9a35 100644
--- a/noncore/net/wellenreiter/gui/wellenreiter.cpp
+++ b/noncore/net/wellenreiter/gui/wellenreiter.cpp
@@ -51,247 +51,263 @@ using namespace Opie;
#include "wellenreiter.h"
#include "scanlist.h"
#include "logwindow.h"
#include "hexwindow.h"
#include "configwindow.h"
#include "manufacturers.h"
#include <daemon/source/config.hh>
#include <libwellenreiter/source/wl_types.hh>
#include <libwellenreiter/source/wl_sock.hh>
#include <libwellenreiter/source/wl_proto.hh>
Wellenreiter::Wellenreiter( QWidget* parent, const char* name, WFlags fl )
: WellenreiterBase( parent, name, fl ), daemonRunning( false ), manufacturerdb( 0 )
{
//
// construct manufacturer database
//
QString manufile;
#ifdef QWS
manufile.sprintf( "%s/share/wellenreiter/manufacturers.dat", (const char*) QPEApplication::qpeDir() );
#else
manufile.sprintf( "/home/mickey/work/opie/share/wellenreiter/manufacturers.dat" );
#endif
manufacturerdb = new ManufacturerDB( manufile );
logwindow->log( "(i) Wellenreiter has been started." );
//
// detect operating system
//
#ifdef QWS
QString sys;
sys.sprintf( "(i) Running on '%s'.", (const char*) ODevice::inst()->systemString() );
_system = ODevice::inst()->system();
logwindow->log( sys );
#endif
//
// setup socket for daemon communication, register socket notifier
//
// struct sockaddr_in sockaddr;
daemon_fd = wl_setupsock( GUIADDR, GUIPORT, sockaddr );
if ( daemon_fd == -1 )
{
logwindow->log( "(E) Couldn't get file descriptor for commsocket." );
}
else
{
int flags;
flags = fcntl( daemon_fd, F_GETFL, 0 );
fcntl( daemon_fd, F_SETFL, flags | O_NONBLOCK );
QSocketNotifier *sn = new QSocketNotifier( daemon_fd, QSocketNotifier::Read, parent );
connect( sn, SIGNAL( activated( int ) ), this, SLOT( dataReceived() ) );
}
// setup GUI
connect( button, SIGNAL( clicked() ), this, SLOT( buttonClicked() ) );
- button->setEnabled( false );
+ // button->setEnabled( false );
netview->setColumnWidthMode( 1, QListView::Manual );
if ( manufacturerdb )
netview->setManufacturerDB( manufacturerdb );
}
Wellenreiter::~Wellenreiter()
{
// no need to delete child widgets, Qt does it all for us
delete manufacturerdb;
}
void Wellenreiter::handleMessage()
{
// FIXME: receive message and handle it
qDebug( "received message from daemon." );
/*char buffer[10000];
memset( &buffer, 0, sizeof( buffer ) );*/
char buffer[WL_SOCKBUF];
// int result = #wl_recv( &daemon_fd, (char*) &buffer, sizeof(buffer) );
/*
struct sockaddr from;
socklen_t len;
int result = recvfrom( daemon_fd, &buffer, 8192, MSG_WAITALL, &from, &len );
qDebug( "received %d from recv [%d bytes]", result, len );
*/
int result = wl_recv( &daemon_fd, sockaddr, (char*) &buffer, WL_SOCKBUF );
if ( result == -1 )
{
qDebug( "Warning: %s", strerror( errno ) );
return;
}
int command = buffer[1] - 48;
/*
typedef struct {
int net_type; 1 = Accesspoint ; 2 = Ad-Hoc
int ssid_len; Length of SSID
int channel; Channel
int wep; 1 = WEP enabled ; 0 = disabled
char mac[64]; MAC address of Accesspoint
char bssid[128]; BSSID of Accesspoint
} wl_network_t;
*/
qDebug( "Recv result: %d", ( result ) );
qDebug( "Sniffer sent: '%s'", (const char*) buffer );
hexwindow->log( (const char*) &buffer );
if ( command == NETFOUND ) /* new network found */
{
qDebug( "Sniffer said: new network found." );
wl_network_t n;
get_network_found( &n, (char*) &buffer );
qDebug( "Sniffer said: net_type is %d.", n.net_type );
qDebug( "Sniffer said: MAC is %s", (const char*) &n.mac );
//n.bssid[n.ssid_len] = "\0";
QString type;
if ( n.net_type == 1 )
type = "managed";
else
type = "adhoc";
netview->addNewItem( type, n.bssid, QString( (const char*) &n.mac ), n.wep, n.channel, 0 );
}
else
{
qDebug( "unknown sniffer command." );
}
}
void Wellenreiter::dataReceived()
{
logwindow->log( "(d) Received data from daemon" );
handleMessage();
}
void Wellenreiter::buttonClicked()
{
/*
// add some test stations, so that we can see if the GUI part works
addNewItem( "managed", "Vanille", "04:00:20:EF:A6:43", true, 6, 80 );
addNewItem( "managed", "Vanille", "04:00:20:EF:A6:23", true, 11, 10 );
addNewItem( "adhoc", "ELAN", "40:03:43:E7:16:22", false, 3, 10 );
addNewItem( "adhoc", "ELAN", "40:03:53:E7:56:62", false, 3, 15 );
addNewItem( "adhoc", "ELAN", "40:03:63:E7:56:E2", false, 3, 20 );
*/
if ( daemonRunning )
{
daemonRunning = false;
logwindow->log( "(i) Daemon has been stopped." );
button->setText( "Start Scanning" );
// Stop daemon - ugly for now... later better
system( "killall orinoco_hopper" );
system( "killall wellenreiterd" );
- // FIXME: reset the card trying to get into a usable state again
+ // get configuration from config window
- // for now, just message the user
+ const QString& interface = configwindow->interfaceName->currentText();
+ const QString& cardtype = configwindow->deviceType->currentText();
+ const QString& interval = configwindow->hopInterval->cleanText();
+
+ // reset the card trying to get into a usable state again
+
+ QString cmdline;
+ cmdline.sprintf( "iwpriv %s monitor 1", (const char*) interface );
+ system( cmdline );
+ cmdline.sprintf( "iwpriv %s monitor 1 6", (const char*) interface );
+ system( cmdline );
+ cmdline.sprintf( "ifconfig %s -promisc", (const char*) interface );
+ system( cmdline );
+ cmdline.sprintf( "killall -14 dhcpcd" );
+ system( cmdline );
+ cmdline.sprintf( "killall -10 udhcpc" );
+
+ // message the user
- QMessageBox::information( this, "Wellenreiter/Opie", "You should reset your\ndevice before using it again." );
+ QMessageBox::information( this, "Wellenreiter/Opie", "Your wireless card\nshould now be usable again." );
}
else
{
logwindow->log( "(i) Daemon has been started." );
daemonRunning = true;
button->setText( "Stop Scanning" );
// get configuration from config window
const QString& interface = configwindow->interfaceName->currentText();
const QString& cardtype = configwindow->deviceType->currentText();
const QString& interval = configwindow->hopInterval->cleanText();
if ( ( interface == "<select>" ) || ( cardtype == "<select>" ) )
{
QMessageBox::information( this, "Wellenreiter/Opie", "You must configure your\ndevice before scanning." );
return;
}
// set interface into monitor mode
/* Global::Execute definitely does not work very well with non-gui stuff! :( */
QString cmdline;
-
cmdline.sprintf( "iwpriv %s monitor 2", (const char*) interface );
system( cmdline );
cmdline.sprintf( "iwpriv %s monitor 2 1", (const char*) interface );
system( cmdline );
// start channel hopper
cmdline = "orinoco_hopper ";
cmdline += interface;
cmdline += " -i ";
cmdline += interval;
cmdline += " &";
qDebug( "execute: %s", (const char*) cmdline );
system( cmdline );
qDebug( "done" );
// start daemon
cmdline = "wellenreiterd ";
cmdline += interface;
cmdline += " 3";
cmdline += " &";
qDebug( "execute: %s", (const char*) cmdline );
system( cmdline );
qDebug( "done" );
}
}