⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wepserver.c

📁 About WepDecrypt: Wepdecrypt is a Wireless LAN Tool written in c which guesses WEP Keys based o
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************** File:   		wepserver.c			                                           * Date:   		2004-05-21												       * Author: 		Fernando Tar韓					    						   * Last Modified:	2004-5-23					       						   *																		       * Description: Manage server mode.										       *																		       *  This program 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.									       *																		       *  This program 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 Library General Public License for more details.			       		   *																		       *  You should have received a copy of the GNU General Public License	       *  along with this program; if not, write to the Free Software			       *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  ********************************************************************************/#include <sys/socket.h>#include <sys/types.h>#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include <netdb.h>#ifndef __CYGWIN__#include <resolv.h>#endif#include <errno.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>#include <strings.h>#include <string.h>#include <sys/stat.h>#include <time.h>#include "messages.h"#include "wepserver.h"#include "md5_digest.h"#include "log.h"//Some conf values#define BLOCK_SIZE "4294967296"#ifndef __CYGWIN__#define DEFAULT_LOG_FILE "/var/tmp/wepdecrypt_s.log"#else#define DEFAULT_LOG_FILE "wd_server.log"#endif#define PORT 3617#define VERBOSITY 2#define MAXBUF 99//Verbosity levels#define LOW 1#define MEDIUM 2#define HIGH 3int socket_server;unsigned int current_key64[5], current_key128[13];unsigned int block_key[5];hosts_list list;server_data s_data;void parse_path_file(char * packet_file){	int i,j=0,cont=0;		for(i=0;i<strlen(packet_file);i++)		if (packet_file[i] == '/') cont++;	i=0;	if (cont !=0){		while (j < cont){			s_data.path[i] = packet_file[i];			if (packet_file[i] == '/') j++;			i++;		}		s_data.path[i]='\0'; j=0;	}	else strncpy(s_data.path,"./",2);	for(;i<strlen(packet_file);i++){		s_data.file_name[j] = packet_file[i];		j++;	}	s_data.file_name[j]='\0';		}int parse_config_file(char * login, int * port){	int i,j, verbosity;	char block_size[15];	char path[35], line[75], conf_setting[20], conf_value[55], log_file[55];	FILE *fp;		//set path#ifndef __CYGWIN__	if (strncmp(login, "root", 4) == 0) sprintf(path,"/root/.wepdecrypt");	else sprintf(path,"/home/%s/.wepdecrypt", login);#else	sprintf(path,"wepdecrypt.conf", login);	#endif		(*port) = -1; block_size[0] = '\0'; verbosity = -1; log_file[0] = '\0';		//create config file	if ((fp = fopen(path,"r")) == NULL){		sleep(0.3);		if ((fp = fopen(path,"w+")) == NULL){						return 0;		}		fprintf(fp,"#Wepdecrypt configuration file\n");		fprintf(fp,"#Server listening port\nPort=%i\n\n#Blocksize can be set up to 1099511627775\nBlocksize=%s\n\n#Full path to server logfile\nLogfile=%s\n\n#Verbosity levels: 1 - LOW 2 - MEDIUM 3 - HIGH\nVerbosity=%i\n\n", PORT, BLOCK_SIZE, DEFAULT_LOG_FILE, VERBOSITY);				(*port) = PORT;		if (!BN_dec2bn(&s_data.block_size, BLOCK_SIZE)) return 0;		s_data.verbosity = VERBOSITY;		strncpy(s_data.log_file, DEFAULT_LOG_FILE, strlen(DEFAULT_LOG_FILE)+1);		fclose(fp);		return 1;	}	//parse config file	else{		while(!feof(fp)){						i = 0; j = 0;			while (i < 74){				line[i] = fgetc(fp);				if (line[i] == '\n') break;				i++;			}			line[i] = '\0';						if (line[0] == '#' || line[0] == '\n' || line[0] <= '\0') continue;			i = 0;						while ((line[i] != '=') && (i < 19)){				conf_setting[i] = line[i];				i++;			}						conf_setting[i] = '\0'; i++; 						while ((line[i] != '\0') && (i < 75) && (j < 54)){								conf_value[j] = line[i];				j++; i++;			}			conf_value[j] = '\0';									if (strncmp(conf_setting,"Port",4) == 0) (*port) = atoi(conf_value);			else if (strncmp(conf_setting,"Blocksize",9) == 0) strncpy(block_size, conf_value, strlen(conf_value)+1);			else if (strncmp(conf_setting,"Verbosity",9) == 0) verbosity = atoi(conf_value);			else if (strncmp(conf_setting,"Logfile",7) == 0) strncpy(log_file, conf_value, strlen(conf_value)+1);			else if (strncmp(conf_setting,"Guidirlog",9) == 0);			else{				//Bad data in config file				fclose(fp);				return 0;			}		}			}	fclose(fp);	if (log_file[0] != '\0') strncpy(s_data.log_file, log_file, strlen(log_file)+1);	if (((*port) == -1) || block_size[0] == 0 || verbosity == -1 || log_file[0] == '\0' || verbosity < LOW || verbosity > HIGH){		return 0;		}		if (!BN_dec2bn(&s_data.block_size, block_size)) return 0;	s_data.verbosity = verbosity;			return 1;}int parse_client_data(const unsigned char * client_recv, client_data * c_data, int size){		//Make sure client data is ok , and do the casting	if (size < sizeof(client_data)){		c_data->option = BAD_DATA;		return -1;	}	else {				memcpy(c_data,client_recv,sizeof(client_data));		if (c_data->option != GET_KEYS && c_data->option != GET_FILE && c_data->option != DECRYPTED_KEYS && c_data->option != DECRYPTED_BLOCK){			c_data->option = BAD_DATA;			return -1;		}		return 0;	}}	void store_decrypted_key(char * log_file, client_data c_data, int mode){	server_log_key(log_file, c_data.decrypted_key, c_data.decrypted_bssid, mode);		}void update_current_key(unsigned int * current_key, const unsigned int * end_key, int mode){	int i;	if (mode == 64){		if ((end_key[0] == 255) && (end_key[1] == 255) && (end_key[2] == 255) && (end_key[3] == 255) && (end_key[4] == 255)){			for (i=0;i<5; i++) current_key[i] = 255;			return;		}		for(i=0;i<5;i++){			if (i != 4) current_key[i] = end_key[i];			else current_key[i] = end_key[i]+1;		}		i = 4;		while (current_key[i] > 255){			current_key[i] = 0;			current_key[i-1] += 1;			i--;		}	}	else{		if ((end_key[0] == 255) && (end_key[1] == 255) && (end_key[2] == 255) && (end_key[3] == 255) && (end_key[4] == 255) && (end_key[5] == 255) && (end_key[6] == 255) &&\			(end_key[7] == 255) && (end_key[8] == 255) && (end_key[9] == 255) && (end_key[10] == 255) && (end_key[11] == 255) && (end_key[12] == 255)){			for (i=0;i<13; i++) current_key[i] = 255;			return;		}		for(i=0;i<13;i++){			if (i != 12) current_key[i] = end_key[i];			else current_key[i] = end_key[i]+1;		}		i = 12;		while (current_key[i] > 255){			current_key[i] = 0;			current_key[i-1] += 1;			i--;		}	}}void set_init_key(unsigned int * init_key, const unsigned int * current_key, int mode){	int i;	if (mode == 64)		for (i=0;i<5;i++) init_key[i] = current_key[i];	else		for (i=0;i<13;i++) init_key[i] = current_key[i];}/*void set_block(void){	int i, j = 3, l=1;	long number = s_data.block_size, divisor, k;	while (number != 0){		divisor = 1;		for ( i = 0; i < j ;i ++) divisor *= 256;		k = number / divisor;		if (k >= 1 && j != 0){			block_key[l] = k;			number -= divisor * k;		}		else if (j!=0) block_key[i]=0;		if (j==0){			block_key[l] = number;			number = 0;		}		j--; l++;	}}*/int set_block(void){	int i, j = 4, l=0, ret=1;	char log_message[100];	BIGNUM *number, *div, *max_value, *k, *one, *zero;	BN_CTX *ctx;	div=BN_new();	k=BN_new();	max_value=BN_new();	one=BN_new();	number=BN_new();	zero=BN_new();	ctx = BN_CTX_new();		if (!BN_dec2bn(&max_value, "1099511627775")) ret=0;	if (!BN_dec2bn(&one, "1")) ret=0;	if (!BN_dec2bn(&one, "0")) ret=0;	if (BN_copy(number, s_data.block_size) == NULL) ret=0;	if (BN_cmp(number, max_value) == 1){		sprintf(log_message, "Server Error: Blocksize is too big");		server_log_message(s_data.log_file, log_message);    	ret=0;	}	if (BN_cmp(number, zero) <= 0){		sprintf(log_message, "Server Error: Blocksize must be higher than 0");		server_log_message(s_data.log_file, log_message);		ret=0;	}		while (!BN_is_zero(number) && ret != 0){		BN_dec2bn(&div, "1");		for ( i = 0; i < j ;i ++) if(!BN_lshift(div, div, 8)) ret=0;		if (!BN_div(k, NULL, number, div, ctx)) ret=0;		BN_cmp(k, one);		if ((BN_cmp(k, one) >= 0) && j != 0){			block_key[l] = atoi(BN_bn2dec(k));			if (!BN_mul(div, div, k, ctx)) ret=0;			if (!BN_sub(number, number, div)) ret=0;		}				if (j==0){			block_key[l] = atoi(BN_bn2dec(k));			if (!BN_dec2bn(&number, "0")){				ret=0;				break;			}		}		j--; l++;	}	BN_clear_free(div);	BN_clear_free(max_value);	BN_clear_free(k);	BN_clear_free(one);	BN_clear_free(number);	BN_clear_free(zero);	BN_CTX_free(ctx);		return ret;}void set_end_key(const int * init_key, int * end_key, int mode){	int i,j,k;		if (mode == 64){		for (i=0;i<5;i++) end_key[i] = 0;		for (i=4;i>=0;i--){			end_key[i] += init_key[i] + block_key[i];			if (end_key[i] > 255 && (i != 0)){				end_key[i-1] += 1;				end_key[i] -= 256;			}			else if (end_key[i] > 255 && (i == 0)){				for(j=0;j<5;j++) end_key[j] = 255;				break;			}		}	}	else{		for(i=0;i<8;i++) end_key[i] = init_key[i];		for(i=8;i<13;i++) end_key[i] = 0;		k=4;				for(i=12;i>=0;i--){						if (k != -1) end_key[i] += init_key[i] + block_key[k];						if (end_key[i] > 255 && (i != 0)){				end_key[i-1] += 1;				end_key[i] -= 256;							}			else if (end_key[i] > 255 && (i == 0)){				for(j=0;j<13;j++) end_key[j] = 255;				break;			}			if (k != -1) k--;		}			}}void set_sent_data(sent_data * st_data, int mode, const unsigned int * init_key, const unsigned int * end_key, int message){	int i;	st_data->mode = mode;	st_data->message = message;	if (mode == 64 && init_key != NULL && end_key != NULL)		for (i=0;i<5;i++){			st_data->init_key[i] = init_key[i];			st_data->end_key[i]  = end_key[i];		}	else if (mode == 128 && init_key != NULL && end_key != NULL){		for (i=0;i<13;i++){			st_data->init_key[i] = init_key[i];			st_data->end_key[i]  = end_key[i];					}	}	else{		st_data->init_key[0] = st_data->end_key[0] = '\0';	}}void delete_hostlist(void){	hosts_list temp;	while (list != NULL){		temp = list;		list = list->next;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -