📄 wepserver.c
字号:
/******************************************************************************** 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 + -