b387ad1fdf
git-svn-id: svn://svn.openwrt.org/openwrt/packages@16711 3c298f89-4303-0410-b956-a3cf2f4a3e73
468 lines
13 KiB
Diff
468 lines
13 KiB
Diff
diff -Naur netdiscover-0.3-beta6.orig/src/ifaces.c netdiscover-0.3-beta6/src/ifaces.c
|
|
--- netdiscover-0.3-beta6.orig/src/ifaces.c 2009-06-24 18:21:11.000000000 -0400
|
|
+++ netdiscover-0.3-beta6/src/ifaces.c 2009-06-24 21:44:05.000000000 -0400
|
|
@@ -127,6 +127,7 @@
|
|
memcpy(type, packet + 20, 2); /* ARP Opcode */
|
|
new_arprep_l->header = new_header; /* Add header */
|
|
new_arprep_l->count = 1; /* Count */
|
|
+ new_arprep_l->printed = 0;
|
|
new_arprep_l->next = NULL;
|
|
|
|
/* Source IP */
|
|
diff -Naur netdiscover-0.3-beta6.orig/src/main.c netdiscover-0.3-beta6/src/main.c
|
|
--- netdiscover-0.3-beta6.orig/src/main.c 2009-06-24 18:21:11.000000000 -0400
|
|
+++ netdiscover-0.3-beta6/src/main.c 2009-06-24 21:34:59.000000000 -0400
|
|
@@ -30,6 +30,7 @@
|
|
#include <unistd.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
+#include <signal.h>
|
|
#include "ifaces.h"
|
|
#include "screen.h"
|
|
|
|
@@ -39,8 +40,17 @@
|
|
char *disp;
|
|
char *sip;
|
|
int autos;
|
|
+ int machine;
|
|
};
|
|
|
|
+/* Injection Thread data structure */
|
|
+struct t_inject {
|
|
+ struct t_data *datos;
|
|
+ pthread_t *sniffer;
|
|
+ pthread_t *screen;
|
|
+ pthread_t *keys;
|
|
+ int scan_secs;
|
|
+};
|
|
|
|
void *inject_arp(void *arg);
|
|
void *screen_refresh(void *arg);
|
|
@@ -77,7 +87,7 @@
|
|
|
|
|
|
pthread_t injection, sniffer, screen, keys;
|
|
-int fastmode, pcount, node, ssleep;
|
|
+int fastmode, pcount, node, ssleep, nokeywait;
|
|
long sleept;
|
|
|
|
|
|
@@ -86,7 +96,9 @@
|
|
{
|
|
while ( 1 == 1 )
|
|
{
|
|
- read_key();
|
|
+ struct t_data *datos;
|
|
+ datos = (struct t_data *)arg;
|
|
+ read_key(datos->machine);
|
|
}
|
|
}
|
|
|
|
@@ -97,20 +109,24 @@
|
|
int c;
|
|
int esniff = 0;
|
|
int erange = 0;
|
|
+ int scan_secs = 0;
|
|
struct t_data datos;
|
|
-
|
|
+ struct t_inject injectdata;
|
|
+
|
|
datos.sip = NULL;
|
|
datos.disp = NULL;
|
|
+ datos.machine = 0;
|
|
datos.autos = 0;
|
|
sleept = 99;
|
|
node = 67;
|
|
pcount = 1;
|
|
+ nokeywait = 0;
|
|
|
|
current_network = (char *) malloc ((sizeof(char)) * 16);
|
|
sprintf(current_network,"Starting.");
|
|
|
|
/* Fetch parameters */
|
|
- while ((c = getopt(argc, argv, "i:s:r:n:c:pSfh")) != EOF)
|
|
+ while ((c = getopt(argc, argv, "i:s:r:n:c:t:pSfhkm")) != EOF)
|
|
{
|
|
switch (c)
|
|
{
|
|
@@ -138,12 +154,20 @@
|
|
case 'n':
|
|
node = atoi(optarg);
|
|
break;
|
|
+
|
|
+ case 't':
|
|
+ scan_secs = atoi(optarg);
|
|
+ break;
|
|
|
|
case 'r':
|
|
datos.sip = (char *) malloc (sizeof(char) * strlen(optarg));
|
|
sprintf(datos.sip, "%s", optarg);
|
|
erange = 1;
|
|
break;
|
|
+
|
|
+ case 'm':
|
|
+ datos.machine = 1;
|
|
+ break;
|
|
|
|
case 'f':
|
|
fastmode = 1;
|
|
@@ -153,6 +177,10 @@
|
|
usage(argv[0]);
|
|
exit(1);
|
|
break;
|
|
+
|
|
+ case 'k':
|
|
+ nokeywait = 1;
|
|
+ break;
|
|
|
|
default:
|
|
break;
|
|
@@ -181,7 +209,7 @@
|
|
/* Init some stuff */
|
|
lnet_init(datos.disp);
|
|
init_lists();
|
|
- system("clear");
|
|
+ if (!datos.machine) system("clear");
|
|
|
|
/* If no mode was selected, enable auto scan */
|
|
if ((erange != 1) && (esniff != 1))
|
|
@@ -189,9 +217,15 @@
|
|
datos.autos = 1;
|
|
}
|
|
|
|
+
|
|
/* Start the execution */
|
|
- pthread_create(&screen, NULL, screen_refresh, (void *)NULL);
|
|
- pthread_create(&keys, NULL, keys_thread, (void *)NULL);
|
|
+ pthread_create(&screen, NULL, screen_refresh, (void *)&datos);
|
|
+ if (!nokeywait) {
|
|
+ pthread_create(&keys, NULL, keys_thread, (void *)&datos);
|
|
+ injectdata.keys = &keys;
|
|
+ } else {
|
|
+ injectdata.keys = NULL;
|
|
+ }
|
|
pthread_create(&sniffer, NULL, start_sniffer, (void *)&datos);
|
|
|
|
if (esniff == 1)
|
|
@@ -201,10 +235,19 @@
|
|
}
|
|
else
|
|
{
|
|
- if (pthread_create(&injection, NULL, inject_arp, (void *)&datos))
|
|
+ injectdata.datos = &datos;
|
|
+ injectdata.sniffer = &sniffer;
|
|
+ injectdata.screen = &screen;
|
|
+ injectdata.scan_secs = scan_secs;
|
|
+
|
|
+ if (pthread_create(&injection, NULL, inject_arp, (void *)&injectdata))
|
|
perror("Could not create injection thread");
|
|
|
|
- pthread_join(sniffer,NULL);
|
|
+ if (scan_secs > 0) {
|
|
+ pthread_join(injection,NULL);
|
|
+ } else {
|
|
+ pthread_join(sniffer,NULL);
|
|
+ }
|
|
}
|
|
|
|
|
|
@@ -215,10 +258,11 @@
|
|
/* Refresh screen function called by screen thread */
|
|
void *screen_refresh(void *arg)
|
|
{
|
|
-
|
|
+ struct t_data *datos;
|
|
+ datos = (struct t_data *)arg;
|
|
while (1==1)
|
|
{
|
|
- print_screen();
|
|
+ print_screen(datos->machine);
|
|
sleep(1);
|
|
}
|
|
|
|
@@ -228,9 +272,11 @@
|
|
/* Inject ARP Replys to the network */
|
|
void *inject_arp(void *arg)
|
|
{
|
|
+ struct t_inject *inject;
|
|
struct t_data *datos;
|
|
|
|
- datos = (struct t_data *)arg;
|
|
+ inject = (struct t_inject *)arg;
|
|
+ datos = inject->datos;
|
|
sleep(2);
|
|
|
|
if ( datos->autos != 1 )
|
|
@@ -251,6 +297,12 @@
|
|
|
|
sprintf(current_network,"Finished!");
|
|
lnet_destroy();
|
|
+ if (inject->scan_secs > 0) {
|
|
+ sleep(inject->scan_secs);
|
|
+ pthread_kill(*(inject->sniffer), SIGKILL);
|
|
+ pthread_kill(*(inject->screen), SIGKILL);
|
|
+ pthread_kill(*(inject->keys), SIGKILL);
|
|
+ }
|
|
|
|
return NULL;
|
|
}
|
|
@@ -400,6 +452,9 @@
|
|
" -n node: last ip octet used for scanning (from 2 to 253)\n"
|
|
" -S enable sleep time supression betwen each request (hardcore mode)\n"
|
|
" -f enable fastmode scan, saves a lot of time, recommended for auto\n\n"
|
|
+ " -k nokeywait: Don't wait for keypress\n"
|
|
+ " -t time: maximum time to listen after last arp request sent (seconds)\n"
|
|
+ " -m don't clear and format screen, just output replies\n"
|
|
"If -p or -r arent enabled, netdiscover will scan for common lan addresses\n",
|
|
VERSION, comando);
|
|
}
|
|
diff -Naur netdiscover-0.3-beta6.orig/src/screen.c netdiscover-0.3-beta6/src/screen.c
|
|
--- netdiscover-0.3-beta6.orig/src/screen.c 2009-06-24 18:21:11.000000000 -0400
|
|
+++ netdiscover-0.3-beta6/src/screen.c 2009-06-25 19:15:24.000000000 -0400
|
|
@@ -114,7 +114,7 @@
|
|
|
|
|
|
/* Read input keys */
|
|
-void read_key()
|
|
+void read_key(int machine)
|
|
{
|
|
int ch;
|
|
ch = getchar();
|
|
@@ -162,12 +162,12 @@
|
|
smode = 2;
|
|
}
|
|
|
|
- print_screen();
|
|
+ print_screen(machine);
|
|
}
|
|
|
|
|
|
/* Clear and fill the screen */
|
|
-void print_screen()
|
|
+void print_screen(int machine)
|
|
{
|
|
/* Get Console Size */
|
|
if (ioctl(0, TIOCGWINSZ, &win_sz) < 0)
|
|
@@ -177,16 +177,16 @@
|
|
}
|
|
|
|
/* Flush and print screen */
|
|
- fprintf( stderr, "\33[1;1H" );
|
|
- fill_screen();
|
|
- fprintf( stderr, "\33[J" );
|
|
+ if (!machine) fprintf( stderr, "\33[1;1H" );
|
|
+ fill_screen(machine);
|
|
+ if (!machine) fprintf( stderr, "\33[J" );
|
|
fflush(stdout);
|
|
}
|
|
|
|
|
|
/* Fills the screen using white spaces to avoid refresh problems *
|
|
* not a very smart way, but it works :) */
|
|
-void fill_screen()
|
|
+void fill_screen(int machine)
|
|
{
|
|
int x, j;
|
|
struct arp_rep_l *arprep_l;
|
|
@@ -196,40 +196,42 @@
|
|
|
|
pthread_mutex_lock(listm);
|
|
|
|
- sprintf(line, " Currently scanning: %s | Our Mac is: %s - %i",
|
|
- current_network, ourmac, scroll);
|
|
- printf("%s", line);
|
|
-
|
|
- /* Fill with spaces */
|
|
- for (j=strlen(line); j<win_sz.ws_col - 1; j++)
|
|
- printf(" ");
|
|
- printf("\n");
|
|
-
|
|
- /* Print blank line with spaces */
|
|
- for (j=0; j<win_sz.ws_col - 1; j++)
|
|
- printf(" ");
|
|
- printf("\n");
|
|
-
|
|
-
|
|
- sprintf(line, " %d Captured ARP Req/Rep packets, from %d hosts. Total size: %d",
|
|
- arprep_count->count, arprep_count->hosts, arprep_count->length);
|
|
- printf("%s", line);
|
|
-
|
|
- /* Fill with spaces */
|
|
- for (j=strlen(line); j<win_sz.ws_col - 1; j++)
|
|
- printf(" ");
|
|
- printf("\n");
|
|
-
|
|
-
|
|
- /* Print Header and counters */
|
|
- printf(" _____________________________________________________________________________\n");
|
|
- if (smode == 0 || (oldmode == 0 && smode == 2))
|
|
- printf(" IP At MAC Address Count Len MAC Vendor \n");
|
|
- else if (smode == 1 || (oldmode == 1 && smode == 2))
|
|
- printf(" IP At MAC Address Requests IP Count \n");
|
|
- printf(" ----------------------------------------------------------------------------- \n");
|
|
-
|
|
-
|
|
+
|
|
+ if (!machine) {
|
|
+ sprintf(line, " Currently scanning: %s | Our Mac is: %s - %i",
|
|
+ current_network, ourmac, scroll);
|
|
+ printf("%s", line);
|
|
+
|
|
+ /* Fill with spaces */
|
|
+ for (j=strlen(line); j<win_sz.ws_col - 1; j++)
|
|
+ printf(" ");
|
|
+ printf("\n");
|
|
+
|
|
+ /* Print blank line with spaces */
|
|
+ for (j=0; j<win_sz.ws_col - 1; j++)
|
|
+ printf(" ");
|
|
+ printf("\n");
|
|
+
|
|
+
|
|
+ sprintf(line, " %d Captured ARP Req/Rep packets, from %d hosts. Total size: %d",
|
|
+ arprep_count->count, arprep_count->hosts, arprep_count->length);
|
|
+ printf("%s", line);
|
|
+
|
|
+ /* Fill with spaces */
|
|
+ for (j=strlen(line); j<win_sz.ws_col - 1; j++)
|
|
+ printf(" ");
|
|
+ printf("\n");
|
|
+
|
|
+
|
|
+ /* Print Header and counters */
|
|
+ printf(" _____________________________________________________________________________\n");
|
|
+ if (smode == 0 || (oldmode == 0 && smode == 2))
|
|
+ printf(" IP At MAC Address Count Len MAC Vendor \n");
|
|
+ else if (smode == 1 || (oldmode == 1 && smode == 2))
|
|
+ printf(" IP At MAC Address Requests IP Count \n");
|
|
+ printf(" ----------------------------------------------------------------------------- \n");
|
|
+ }
|
|
+
|
|
/* Print each found station trough arp reply */
|
|
if (smode == 0)
|
|
{
|
|
@@ -243,12 +245,12 @@
|
|
sprintf(tline, " ");
|
|
|
|
/* Set IP */
|
|
- sprintf(tline, "%s ", arprep_l->sip);
|
|
+ sprintf(tline, "%s ", arprep_l->sip);
|
|
strcat(line, tline);
|
|
-
|
|
- /* Fill with spaces */
|
|
- for (j=strlen(line); j<17; j++)
|
|
- strcat(line, blank);
|
|
+
|
|
+ /* Fill with spaces */
|
|
+ for (j=strlen(line); j<17; j++)
|
|
+ strcat(line, blank);
|
|
|
|
/* IP & MAC */
|
|
sprintf(tline, "%02x:%02x:%02x:%02x:%02x:%02x ",
|
|
@@ -260,21 +262,29 @@
|
|
/* Count, Length & Vendor */
|
|
sprintf(tline, "%02d %03d %s", arprep_l->count,
|
|
arprep_l->header->length, arprep_l->vendor );
|
|
- strcat(line, tline);
|
|
-
|
|
- /* Fill again with spaces */
|
|
- for (j=strlen(line); j<win_sz.ws_col - 1; j++)
|
|
- strcat(line, blank);
|
|
+ strcat(line, tline);
|
|
|
|
- printf("%s\n", line);
|
|
+ /* Fill again with spaces */
|
|
+ for (j=strlen(line); j<win_sz.ws_col - 1; j++)
|
|
+ strcat(line, blank);
|
|
+
|
|
+ if (!arprep_l->printed) {
|
|
+ printf("%s\n", line);
|
|
+ arprep_l->printed = 1;
|
|
+ if (!machine) {
|
|
+ arprep_l->printed = 0;
|
|
+ }
|
|
+ }
|
|
}
|
|
|
|
arprep_l = arprep_l->next;
|
|
x += 1;
|
|
-
|
|
- /* Check if end of screen was reached */
|
|
- if (x >= ( (win_sz.ws_row + scroll) - 7))
|
|
- break;
|
|
+
|
|
+ if (!machine) {
|
|
+ /* Check if end of screen was reached */
|
|
+ if (x >= ( (win_sz.ws_row + scroll) - 7))
|
|
+ break;
|
|
+ }
|
|
}
|
|
|
|
} /* Print only arp request */
|
|
@@ -292,10 +302,10 @@
|
|
/* Get source IP */
|
|
sprintf(tline, "%s ", arprep_l->sip);
|
|
strcat(line, tline);
|
|
-
|
|
- /* Fill with spaces */
|
|
- for (j=strlen(line); j<17; j++)
|
|
- strcat(line, blank);
|
|
+
|
|
+ /* Fill with spaces */
|
|
+ for (j=strlen(line); j<17; j++)
|
|
+ strcat(line, blank);
|
|
|
|
/* Get source MAC */
|
|
sprintf(tline, "%02x:%02x:%02x:%02x:%02x:%02x ",
|
|
@@ -308,27 +318,29 @@
|
|
sprintf(tline, "%s", arprep_l->dip);
|
|
strcat(line, tline);
|
|
|
|
- /* Fill with spaces */
|
|
- for (j=strlen(line); j<54; j++)
|
|
- strcat(line, blank);
|
|
+ /* Fill with spaces */
|
|
+ for (j=strlen(line); j<54; j++)
|
|
+ strcat(line, blank);
|
|
|
|
/* Count, Length & Vendor */
|
|
sprintf(tline, "%02d", arprep_l->count);
|
|
strcat(line, tline);
|
|
|
|
- /* Fill again with spaces */
|
|
- for (j=strlen(line); j<win_sz.ws_col - 1; j++)
|
|
- strcat(line, blank);
|
|
+ /* Fill again with spaces */
|
|
+ for (j=strlen(line); j<win_sz.ws_col - 1; j++)
|
|
+ strcat(line, blank);
|
|
|
|
printf("%s\n", line);
|
|
}
|
|
|
|
arprep_l = arprep_l->next;
|
|
x += 1;
|
|
-
|
|
- /* Check if end of screen was reached */
|
|
- if (x >= ( (win_sz.ws_row + scroll) - 7))
|
|
- break;
|
|
+
|
|
+ if (!machine) {
|
|
+ /* Check if end of screen was reached */
|
|
+ if (x >= ( (win_sz.ws_row + scroll) - 7))
|
|
+ break;
|
|
+ }
|
|
}
|
|
}
|
|
else if(smode == 2)
|
|
diff -Naur netdiscover-0.3-beta6.orig/src/screen.h netdiscover-0.3-beta6/src/screen.h
|
|
--- netdiscover-0.3-beta6.orig/src/screen.h 2009-06-24 18:21:11.000000000 -0400
|
|
+++ netdiscover-0.3-beta6/src/screen.h 2009-06-24 21:42:13.000000000 -0400
|
|
@@ -60,6 +60,7 @@
|
|
char *vendor;
|
|
short type;
|
|
unsigned int count;
|
|
+ int printed;
|
|
struct arp_rep_l *next;
|
|
};
|
|
|