-rw-r--r-- | noncore/net/wellenreiter/README | 27 | ||||
-rw-r--r-- | noncore/net/wellenreiter/gui/wellenreiter.cpp | 26 |
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 @@ -1,297 +1,313 @@ /********************************************************************** ** Copyright (C) 2002 Michael 'Mickey' Lauer. All rights reserved. ** ** This file is part of Opie Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ***********************************************************************/ // Qt #include <qpushbutton.h> #include <qmessagebox.h> #include <qcombobox.h> #include <qspinbox.h> #include <qsocketnotifier.h> // Qtopia #ifdef QWS #include <qpe/qpeapplication.h> #include <qpe/global.h> #endif // Opie #ifdef QWS #include <opie/odevice.h> using namespace Opie; #endif // Standard #include <assert.h> #include <errno.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <stdlib.h> #include <fcntl.h> // Local #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(); - QMessageBox::information( this, "Wellenreiter/Opie", "You should reset your\ndevice before using it again." ); + // 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", "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" ); } } |