【realtek sdk-3.4.14b】RTL8197FH-VG+RTL8812F WiFi防暴力破解(WiFi explosion-proof cracking )功能实现

sdk说明

** Gateway/AP firmware v3.4.14b – Aug 26, 2019**
 Wireless LAN driver changes as:
 Refine WiFi Stability and Performance
 Add 8812F MU-MIMO
 Add 97G/8812F multiple mac-clone
 Add 97G 2T3R antenna diversity
 Fix 97G/8812F/8814B MP issues
 Add CH144 DFS support for JP
 Fix PPPOE Dial on dial-on-demand abnormal when dual stack
 Fix Ethernet padding info disclosure
 Add WPA3 WEB UI
 Add RealSON support
 Add EasyMesh supports

AP说明

 802.11 a/b/g/n/ac compatible
 AP mode and client mode support
 Security support 64/128 bits WEP, WPA, and WPA2 (TKIP and AES-CCMP)
 Auto rate adaptive
 Wireless MAC address filter
 Broadcast SSID control
 IAPP (802.11f) support
 Auto channel selection
 Driver based MP functions
 WDS function support
 Universal repeater mode support
 WMM supported for AP mode
 Support WLAN ASIC of 8192CE, 8188RE, 8192DE, 8188ER, 8812E, 8192ER, 8881A, 8814AR, 8194AR, 8812BR, 8197F
 WPS function support
 WAPI function support
 Set WMM parameters manually

功能描述

        WiFi 防暴力破解功能说明,当一个终端用户连续输入错误密码超过100次,就将这个终端拉黑处理,拉黑期间即使终端输入正确的密码也不允许连接,拉黑5min之后自动将终端释放

功能实现

驱动修改

iff --git a/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd.h b/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd.h
index 0f26cb2..b6b54f8 100755
--- a/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd.h
+++ b/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd.h
@@ -235,6 +235,8 @@
 #include "core_ofld_data.h"
 #include "core_ofld_host.h"
 #endif
+#define PROC_STA_CONN_FAIL_INFO
+
 
 #ifdef DOT11K
 #define MAX_REPORT_FRAME_SIZE (PRE_ALLOCATED_BUFSIZE*4)
@@ -4595,6 +4597,7 @@
 	unsigned char 		used;
 	unsigned char		error_state;
 	unsigned char		addr[MACADDRLEN];
+	unsigned int        count;
 };
 #endif
 
diff --git a/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd_ioctl.c b/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd_ioctl.c
index e726e25..9724816 100755
--- a/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd_ioctl.c
+++ b/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd_ioctl.c
@@ -1431,6 +1431,10 @@
 #else	
 	{"acs_type",			INT_T,	_OFFSET(dot11RFEntry.acs_type), _SIZE(dot11RFEntry.acs_type), 1},
 #endif
+	{"deny_mac_count",			INT_T,	_OFFSET(dot11RFEntry.deny_mac_count), _SIZE(dot11RFEntry.deny_mac_count), 100},
+    {"deny_connect_pid",			INT_T,	_OFFSET(dot11RFEntry.deny_connect_pid), _SIZE(dot11RFEntry.deny_connect_pid), 65530},
+    {"empty_sta_conn_fail_flag",	INT_T,	_OFFSET(dot11RFEntry.empty_sta_conn_fail_flag), _SIZE(dot11RFEntry.empty_sta_conn_fail_flag), 0},
+    {"deny_interface_name",			SSID_STRING_T,	_OFFSET(dot11RFEntry.deny_interface_name), _SIZE(dot11RFEntry.deny_interface_name), 0},
 	// struct Dot11StationConfigEntry
 	{"ssid",		SSID_STRING_T,	_OFFSET(dot11StationConfigEntry.dot11DesiredSSID), _SIZE(dot11StationConfigEntry.dot11DesiredSSID), 0},
 	{"defssid",		DEF_SSID_STRING_T,	_OFFSET(dot11StationConfigEntry.dot11DefaultSSID), _SIZE(dot11StationConfigEntry.dot11DefaultSSID), 0},
diff --git a/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd_proc.c b/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd_proc.c
index fa4f859..ff12549 100755
--- a/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd_proc.c
+++ b/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd_proc.c
@@ -1977,8 +1977,11 @@
 	PRINT_SINGL_ARG("    rfe_type: ", priv->pmib->dot11RFEntry.rfe_type, "%u");
 #endif
 	PRINT_SINGL_ARG("    pa_type: ", priv->pmib->dot11RFEntry.pa_type, "%d");
-	PRINT_SINGL_ARG("    acs_type: ", priv->pmib->dot11RFEntry.acs_type, "%d");
-
+	PRINT_SINGL_ARG("    acs_type: ", priv->pmib->dot11RFEntry.acs_type, "%d");  
+	PRINT_SINGL_ARG("	 deny_mac_count: ", priv->pmib->dot11RFEntry.deny_mac_count, "%d");	
+	PRINT_SINGL_ARG("	 deny_connect_pid: ", priv->pmib->dot11RFEntry.deny_connect_pid, "%d");
+	PRINT_SINGL_ARG("	 empty_sta_conn_fail_flag: ", priv->pmib->dot11RFEntry.empty_sta_conn_fail_flag, "%d");
+	PRINT_SINGL_ARG("	 deny_interface_name: ", priv->pmib->dot11RFEntry.deny_interface_name, "%s");
 #if	(defined(CONFIG_SLOT_0_8192EE) && defined(CONFIG_SLOT_0_EXT_LNA))||(defined(CONFIG_SLOT_1_8192EE) && defined(CONFIG_SLOT_1_EXT_LNA))
 	PRINT_SINGL_ARG("    lna_type: ", priv->pshare->rf_ft_var.lna_type, "%d");
 #endif
@@ -2408,11 +2411,19 @@
 
 	for (i=0; i<64; i++) {
 		if (priv->sta_conn_fail[i].used) {
-			PRINT_ARRAY_ARG("	    MAC addr: ", priv->sta_conn_fail[i].addr, "%02x", MACADDRLEN);
+			PRINT_ARRAY_ARG("       MACaddr:", priv->sta_conn_fail[i].addr, "%02x", MACADDRLEN);
 			PRINT_SINGL_ARG("	    Error state: ", priv->sta_conn_fail[i].error_state, "%d");
+		    PRINT_SINGL_ARG("	    MIC Error count: ", priv->sta_conn_fail[i].count, "%d");
 		}
 	}
-	memset(priv->sta_conn_fail, 0, sizeof(struct sta_conn_fail_info) * 64);
+	if (priv->pmib->dot11RFEntry.empty_sta_conn_fail_flag == 1)
+    {
+        //printk("Function:%s Line:%d g_total_count=%d g_deny_mac=%s\n",__func__,__LINE__,g_total_count,g_deny_mac);
+        priv->pmib->dot11RFEntry.empty_sta_conn_fail_flag = 0;
+		memset(priv->sta_conn_fail, 0, sizeof(struct sta_conn_fail_info) * 64);
+		memset(g_deny_mac,0,sizeof(g_deny_mac));
+		g_total_count = 0;
+	}  
 
 	return pos;
 }
diff --git a/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd_psk.c b/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd_psk.c
index 53ba304..a89fbfc 100755
--- a/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd_psk.c
+++ b/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd_psk.c
@@ -55,8 +55,39 @@
 #include "./8192cd_11r_cli.h"
 #endif
 #endif
+#include <linux/pid.h>
+#include <linux/signal.h>
+char g_deny_mac[16] = {0};
+int g_total_count = 0;
+char g_dev_name[16] = {0};
+int  send_signal_to_userspace(unsigned int deny_connect_pid) 
+{
+    struct pid *pid_struct;
+    struct task_struct *task;
+    int ret;
 
-//#define DEBUG_PSK
+    if (deny_connect_pid < 0) {
+        printk("Invalid PID\n");
+        return -EINVAL;
+    }
+    pid_struct = find_get_pid(deny_connect_pid);
+    task = pid_task(pid_struct, PIDTYPE_PID);
+    if (!task) {
+        printk("No such process\n");
+        return -ESRCH;
+    }
+
+    ret = send_sig(SIGUSR1, task, 0); //send SIGUSR1 to userspace
+    if (ret < 0) {
+        printk("Error sending signal\n");
+        return ret;
+    }
+
+    printk("Signal sent to process %d SIGUSR1=%d\n", deny_connect_pid,SIGUSR1);
+    return 0;
+}
 
 #define ETHER_ADDRLEN					6
 #define PMK_EXPANSION_CONST 	        "Pairwise key expansion"
@@ -4353,6 +4384,25 @@
 						else {
 							if (!memcmp(priv->sta_conn_fail[i].addr, pstat->cmn_info.mac_addr, MACADDRLEN)) {
 								priv->sta_conn_fail[i].error_state = RSN_MIC_failure;
+								if( priv->sta_conn_fail[i].count != priv->pmib->dot11RFEntry.deny_mac_count)
+									priv->sta_conn_fail[i].count++;		
+								g_total_count++;
+								if(g_total_count >= priv->pmib->dot11RFEntry.deny_mac_count)
+								{
+								     send_signal_to_userspace(priv->pmib->dot11RFEntry.deny_connect_pid);
+									 printk("4-2: ERROR_MIC_FAIL priv->sta_conn_fail[%d].count=%u\n",i,priv->sta_conn_fail[i].count);
+									 snprintf(g_deny_mac,sizeof(g_deny_mac),"%02x%02x%02x%02x%02x%02x",
+									 		 pstat->cmn_info.mac_addr[0],
+							  				 pstat->cmn_info.mac_addr[1],
+							  				 pstat->cmn_info.mac_addr[2],
+							   				 pstat->cmn_info.mac_addr[3],
+							   				 pstat->cmn_info.mac_addr[4],
+							 				 pstat->cmn_info.mac_addr[5]);
+									 strcpy(g_dev_name,priv->dev->name);
+									 strcpy(priv->pmib->dot11RFEntry.deny_interface_name,priv->dev->name);
+									 printk("Function:%s Line:%d priv->dev->name:%s priv->pmib->dot11RFEntry.deny_interface_name=%s\n",
+									 	__func__,__LINE__,priv->dev->name,priv->pmib->dot11RFEntry.deny_interface_name);
+								}
 								break;
 							}
 						}
@@ -5876,6 +5926,42 @@
 
 #endif  // CONFIG_IEEE80211W
 
+int check_mac_is_or_not_in_deny_list(struct rtl8192cd_priv *priv, char *mac)
+{
+ 
+ 	int i;
+    
+	printk("Function:%s Line:%d g_dev_name=%s priv->dev->name=%s g_total_count=%d priv->pmib->dot11RFEntry.empty_sta_conn_fail_flag=%d\n",
+			  	__func__,__LINE__,g_dev_name,priv->dev->name,g_total_count,priv->pmib->dot11RFEntry.empty_sta_conn_fail_flag );
+  
+	if ( priv->pmib->dot11RFEntry.empty_sta_conn_fail_flag == 1){
+			  memset(priv->sta_conn_fail, 0, sizeof(struct sta_conn_fail_info) * 64); 
+			  printk("Function:%s Line:%d empty sta conn fail list g_deny_mac=%s g_total_count=%d\n",
+			  	__func__,__LINE__,g_deny_mac,g_total_count);
+			  priv->pmib->dot11RFEntry.empty_sta_conn_fail_flag = 0;
+			  memset(g_deny_mac,0,sizeof(g_deny_mac));
+			  g_total_count = 0;
+			  return 0;
+	}
+      if(strlen(g_deny_mac)){
+		if(!strncmp(mac,g_deny_mac,sizeof(g_deny_mac))){
+			 printk("Auth Mac:%s g_deny_mac:%s \n",mac,g_deny_mac);
+			 return 1;
+		}
+	}
+ 	for (i=0; i<64; i++) {
+		if (!memcmp(priv->sta_conn_fail[i].addr, mac, MACADDRLEN) && g_total_count >=priv->pmib->dot11RFEntry.deny_mac_count)
+	    {
+	        printk("Auth Mac:%s sta_conn_fail Mac[%d]:%s\n",mac,i,priv->sta_conn_fail[i].addr);
+            return 1;
+		}
+ 	}
+	
+	
+	return 0;
+}
+
+
 int psk_indicate_evt(struct rtl8192cd_priv *priv, int id, unsigned char *mac, unsigned char *msg, int len)
 {
 	struct stat_info *pstat;
@@ -5900,6 +5986,13 @@
 #endif
 
 	pstat = get_stainfo(priv, mac);
+	
+    if(check_mac_is_or_not_in_deny_list(priv,pstat->cmn_info.mac_addr))
+    {
+    	 printk("Auth Mac %s in deny mac lists\n",pstat->cmn_info.mac_addr);
+		 ToDrv_DisconnectSTA(priv, pstat, RSN_MIC_failure);
+         return -1;    
+	}
 // button 2009.05.21
 #if 0
 	if (pstat == NULL)
diff --git a/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd_psk.h b/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd_psk.h
index f095eb5..b45fb6b 100755
--- a/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd_psk.h
+++ b/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/8192cd_psk.h
@@ -10,6 +10,9 @@
 
 #ifndef _8192CD_PSK_H_
 #define _8192CD_PSK_H_
+extern char g_deny_mac[16];
+extern int g_total_count;
+extern char g_dev_name[16];
 
 #define GMK_LEN						32
 #define GTK_LEN						32
diff --git a/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/ieee802_mib.h b/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/ieee802_mib.h
index c928555..7148f37 100755
--- a/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/ieee802_mib.h
+++ b/rtl819x/linux-3.10/drivers/net/wireless/rtl8192cd/ieee802_mib.h
@@ -518,6 +518,10 @@
 	unsigned char	txpwr_reduction;
 	unsigned char	rfe_type;
 	unsigned int	acs_type;
+	unsigned int    deny_mac_count;
+	unsigned int    deny_connect_pid;
+	unsigned int    empty_sta_conn_fail_flag;
+	char            deny_interface_name[16];
 	//NHM_ACS2_SUPPORT start
 	unsigned int	acs2_dis_clean_channel;
 	unsigned int	acs2_round; // 200ms per round <SS_AUTO_CHNL_ACS2_TO>

应用层修改

+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <pthread.h>
+#include <signal.h> 
+#include <errno.h>
+#define BLACK_MAC_DENY_FILE "/tmp/.hostapd_black_mac"
+int g_black_time = 5*60;  //5min
+int g_black_count = 100;  //100 time 
+char g_old_deny_mac[18] = {0};

+int add_black_mac_to_file(char *mac);
+void remove_mac_from_black_acl(void);
+int find_and_del_mac_from_old_file(char *mac);
+void sigcallback(int sigo);
+int get_deny_mac(char *mac, int len, char *value, char *ifname);
+int find_mac_from_file(char *mac);
+void del_ebtables_wifi_crak(void);
+void init_ebtables_wifi_crak(char *mac);
+int update_connect_pid_to_wifi(void);
+void update_deny_mac_count_to_mib(void);
+void disable_acl_list(void);
+
+void disable_acl_list(void)
+{
+	char buf[128] = {0};
+	
+	memset(buf,0,sizeof(buf));
+	snprintf(buf,sizeof(buf),"iwpriv %s set_mib aclmode=%d","wlan0",0);
+    system(buf);
+	
+	memset(buf,0,sizeof(buf));
+	snprintf(buf,sizeof(buf),"iwpriv %s set_mib aclmode=%d","wlan1",0);
+    system(buf);
+	
+	memset(buf,0,sizeof(buf));
+	snprintf(buf,sizeof(buf),"iwpriv %s set_mib aclmode=%d","wlan0-va0",0);
+    system(buf);
+	
+	memset(buf,0,sizeof(buf));
+	snprintf(buf,sizeof(buf),"iwpriv %s set_mib aclmode=%d","wlan1-va0",0);
+    system(buf);
+	
+	return;
+}
+int update_acl_list_to_wifi(char *value, char *ifname) 
+{
+	char buf[128] = {0};
+	
+	memset(buf,0,sizeof(buf));
+	snprintf(buf,sizeof(buf),"iwpriv %s set_mib aclmode=%d",ifname,2);
+    system(buf);
+	
+	memset(buf,0,sizeof(buf));
+	snprintf(buf,sizeof(buf),"iwpriv %s set_mib acladdr=%s",ifname,value);
+    system(buf);
+	
+    return 0;
+}
+int update_connect_pid_to_wifi(void) 
+{
+    pid_t process_id;
+	char buf[128] = {0};
+	
+	process_id= getpid(); 

+	memset(buf,0,sizeof(buf));
+	snprintf(buf,sizeof(buf),"iwpriv wlan0 set_mib deny_connect_pid=%d",process_id);
+    system(buf);
+	
+	memset(buf,0,sizeof(buf));
+	snprintf(buf,sizeof(buf),"iwpriv wlan1 set_mib deny_connect_pid=%d",process_id);
+    system(buf);
+	
+	memset(buf,0,sizeof(buf));
+	snprintf(buf,sizeof(buf),"iwpriv wlan0-va0 set_mib deny_connect_pid=%d",process_id);
+    system(buf);
+	
+	memset(buf,0,sizeof(buf));
+	snprintf(buf,sizeof(buf),"iwpriv wlan1-va0 set_mib deny_connect_pid=%d",process_id);
+    system(buf);
+	
+    return 0;
+}
+void update_deny_mac_count_to_mib(void)
+{
+	char buf[128] = {0};
+	memset(buf,0,sizeof(buf));
+	snprintf(buf,sizeof(buf),"iwpriv wlan0 set_mib deny_mac_count=%d",g_black_count);
+	system(buf);
+	
+	memset(buf,0,sizeof(buf));
+	snprintf(buf,sizeof(buf),"iwpriv wlan1 set_mib deny_mac_count=%d",g_black_count);
+	system(buf);
+	
+	memset(buf,0,sizeof(buf));
+	snprintf(buf,sizeof(buf),"iwpriv wlan0-va0 set_mib deny_mac_count=%d",g_black_count);
+	system(buf);
+	
+	memset(buf,0,sizeof(buf));
+	snprintf(buf,sizeof(buf),"iwpriv wlan1-va0 set_mib deny_mac_count=%d",g_black_count);
+	system(buf);
+	
+	return;
+}
+void empty_sta_conn_fail(char *ifname,int flag)
+{
+	char buf[128] = {0};
+
+    memset(buf,0,sizeof(buf));
+	snprintf(buf,sizeof(buf),"iwpriv wlan0 set_mib empty_sta_conn_fail_flag=%d",flag);
+    system(buf);
+	
+	memset(buf,0,sizeof(buf));
+	snprintf(buf,sizeof(buf),"iwpriv wlan1 set_mib empty_sta_conn_fail_flag=%d",flag);
+    system(buf);
+	
+	memset(buf,0,sizeof(buf));
+	snprintf(buf,sizeof(buf),"iwpriv wlan0-va0 set_mib empty_sta_conn_fail_flag=%d",flag);
+    system(buf);
+	
+	memset(buf,0,sizeof(buf));
+	snprintf(buf,sizeof(buf),"iwpriv wlan1-va0 set_mib empty_sta_conn_fail_flag=%d",flag);
+    system(buf);
+		
+	system("rm -rf /tmp/.hostapd_black_mac");
+	
+	return;
+}
+void del_ebtables_wifi_crak(void)
+{
+	system("ebtables -D INPUT -j WiFI_CRACK");
+	system("ebtables -F  WiFI_CRACK");
+	system("ebtables -X  WiFI_CRACK");
+	
+	return;
+}
+void init_ebtables_wifi_crak(char *mac)
+{
+	char buf[128] = {0};
+	
+	system("ebtables -N WiFI_CRACK");
+	system("ebtables -I INPUT -j WiFI_CRACK");
+	system("ebtables -A WiFI_CRACK -j RETURN");
+	
+    memset(buf,0,sizeof(buf));
+	snprintf(buf,sizeof(buf),"ebtables -t filter -I WiFI_CRACK -s %s -j DROP",mac);
+	system(buf);
+	
+	return;
+}
+void remove_mac_from_black_acl(void)
+{
+	char buf[128] = {0};
+	char mac[18] = {0};
+	char value[16] = {0};
+	char ifname[16] = {0};
+	int black_time = g_black_time;
+	
+	get_deny_mac(mac, sizeof(mac),value,ifname);
+	while(black_time--)
+	{
+		sleep(1);
+		printf("remove_mac_from_black_acl sleep black_time:%d mac:%s ifname:%s\n",black_time,mac,ifname);
+	}
+	
+	if(find_mac_from_file(mac))
+	{
+		find_and_del_mac_from_old_file(mac);
+	}
+	
+	memset(buf,0,sizeof(buf));
+	snprintf(buf,sizeof(buf),"ebtables -t filter -D WiFI_CRACK -s %s -j DROP",g_old_deny_mac);
+	system(buf);
+	
+	memset(buf,0,sizeof(buf));
+	snprintf(buf,sizeof(buf),"echo \"del mac=%s\" >/tmp/blcakmac.log",g_old_deny_mac);
+	system(buf);
+	
+	del_ebtables_wifi_crak();
+	disable_acl_list();
+	empty_sta_conn_fail(ifname,1);
+	printf("release client %s\r\n",g_old_deny_mac);
+	
+	return;
+}
+int find_mac_from_file(char *mac)
+{
+    char buf[8192] = {0};
+    char *p = NULL;
+	char result[8192] = {0};
+	
+    int ret = 0;
+    FILE * fp = fopen(BLACK_MAC_DENY_FILE,"r+");
+
+    if(fp == NULL)
+    {
+        printf("error open : %s \n",BLACK_MAC_DENY_FILE);
+        return 0;
+    }
+    else
+    {
+        fgets(buf,sizeof(buf),fp);
+		if(strlen(buf) == 0)
+		{
+			  fclose(fp);
+			  printf("%s is empty\n",BLACK_MAC_DENY_FILE);
+			  return 0;
+		}
+        if(p = strstr(buf,mac)) 
+        {
+			strncpy(result,p,17);
+			printf("find mac is %s\n",mac);
+			ret = 1;
+        }
+        fclose(fp);
+    }
+	
+    return ret;
+}
+int find_and_del_mac_from_old_file(char *mac)
+{
+    char buf[8192] = {0};
+    char cmd[9000] = {0};
+    char *p = NULL;
+    char *q = NULL;
+
+	char result[8192] = {0};
+    int ret = 0;
+    FILE * fp = fopen(BLACK_MAC_DENY_FILE,"r+");
+
+    if(fp == NULL)
+    {
+        printf("error open : %s \n",BLACK_MAC_DENY_FILE);
+        return 0;
+    }
+    else
+    {
+        fgets(buf,sizeof(buf),fp);
+		if(strlen(buf) == 0)
+		{
+			  fclose(fp);
+			  printf("%s is empty\n",BLACK_MAC_DENY_FILE);
+			  return 0;
+		}
+        if(p = strstr(buf,mac)) 
+        {
+		     if(q = strstr(p,";")) 
+            {
+                q = q + 1;
+				strncpy(result,buf,strlen(buf)-strlen(p));
+                ret = 1;
+            }
+			if(strlen(result) || strlen(q))
+			{
+				memset(cmd,0,sizeof(cmd));
+				snprintf(cmd, sizeof(cmd),"echo -n \"%s%s;\" > %s", result,q,BLACK_MAC_DENY_FILE);
+				system(cmd);
+			}
+			else
+			{
+				memset(cmd,0,sizeof(cmd));
+				snprintf(cmd, sizeof(cmd),"echo -n \"\" > %s", BLACK_MAC_DENY_FILE);
+				system(cmd);
+			}
+			printf("delete mac is %s\n",mac);
+        }
+        fclose(fp);
+    }
+	
+    return ret;
+}
+
+int add_black_mac_to_file(char *mac)
+{
+    char tmpbuf[8192] = {0};
+    char buf[8192] = {0};
+     char cmd[9000] = {0};
+    char *p = NULL;
+
+    FILE * fp = fopen(BLACK_MAC_DENY_FILE,"a+");
+
+    if(fp == NULL)
+   {
+        printf("error open : %s \n",BLACK_MAC_DENY_FILE);
+        return 0;
+   }
+   else
+   {
+        fgets(buf,sizeof(buf),fp);
+        if(p = strstr(buf,mac))
+        {
+			printf("mac had existed in file\n");
+            fclose(fp);
+            return 1;
+        } 
+        else
+        {
+			mac[18] = '\0';
+       
+            sprintf(tmpbuf,"%s%s;",buf,mac);
+            printf("tmpbuf=%s\n",tmpbuf);            
+            if(strlen(tmpbuf) > 8100)
+            {
+                fclose(fp);
+				memset(cmd,0,sizeof(cmd));
+				snprintf(cmd,sizeof(cmd),"rm -rf %s",BLACK_MAC_DENY_FILE);
+                system(cmd);
+                return 1;
+            }
+            snprintf(cmd, sizeof(cmd),"echo -n \"%s\" > %s", tmpbuf,BLACK_MAC_DENY_FILE);
+            system(cmd);
+        }
+        fclose(fp);
+    }
+
+    return 0;
+}
+
+int get_deny_mac(char *mac,int len,char *value,char *ifname)
+{
+    char macaddr[18] = {0};
+    char line[128] = {0};   
+    int i =0;
+    //char value[128] = {0};
+    char wifi_info_file[64] = {0};
+    FILE *fp = NULL;
+	char *p = NULL;
+	char *q = NULL;
+	int found = 0;
+    char ifacename[4][16] = {"wlan0","wlan0-va0","wlan1","wlan1-va0"};
+    
+    for(i = 0;i <4; i++)
+	{
+		memset(wifi_info_file,0,sizeof(wifi_info_file));
+		snprintf (wifi_info_file, sizeof(wifi_info_file),"/proc/%s/sta_conn_fail", ifacename[i]);
+		fp = fopen (wifi_info_file, "r");
+		if(fp != NULL)
+		{
+			while(fgets(line, sizeof(line), fp))
+			{
+				if (p = strstr (line, "MACaddr:"))
+				{
+					q = p + 8;
+					strncpy(value,q,12);
+					
+					for (i = 0; i < 12; i+=2) 
+					{
+						if(i < 10)
+						  snprintf(macaddr + strlen(macaddr),sizeof(macaddr)-strlen(macaddr), "%c%c:", value[i], value[i+1]);
+						else
+						  snprintf(macaddr + strlen(macaddr),sizeof(macaddr)-strlen(macaddr), "%c%c", value[i], value[i+1]);
+					}
+					strncpy(ifname,ifacename[i],strlen(ifacename[i]));
+					macaddr[17] = '\0';
+					found = 1;
+					printf("Found macaddr is %s ifname=%s\n",macaddr,ifname);
+				}
+			} 
+			fclose(fp);
+			if(found)
+			{
+				printf("Found macaddr is %s\n",macaddr);
+				strncpy(mac,macaddr,strlen(macaddr));
+				printf("Found mac is %s\n",mac);
+				break;
+			}	
+		}
+	}
+
+    return found;
+}
+
+void sigcallback(int sigo)
+{
+  char mac[18] = {0};
+  char buf[256] = {0};
+  char value[16] = {0};
+  char ifname[16] = {0};
+   
+  if(sigo == SIGUSR1)
+  {  
+	  printf("recv signo is SIGUSR1[%d]\n",sigo);
+	  get_deny_mac(mac, sizeof(mac),value,ifname);
+	  if(strlen(g_old_deny_mac) == 0)
+	  {
+		  strncpy(g_old_deny_mac,mac,strlen(mac));
+	  }
+		  
+	  if(strncmp(mac,g_old_deny_mac,strlen(g_old_deny_mac)) != 0)
+	  {
+		  
+		 strncpy(g_old_deny_mac,mac,strlen(mac));
+	  }		  
+	  printf("get deny mac from hostapd and mac is %s\r\n",mac);
+	  snprintf(buf,sizeof(buf),"echo \"recv signo from hostapd and mac:%s g_old_deny_mac=%s\" >>/tmp/blcakmac.log",
+							mac,g_old_deny_mac);
+	  system(buf);
+
+	  
+	  printf("g_black_time:%d\r\n",g_black_time);
+	  del_ebtables_wifi_crak();
+	  init_ebtables_wifi_crak(mac); 
+	  update_acl_list_to_wifi(value,ifname);
+	  add_black_mac_to_file(mac);
+	  pthread_t gtid = 0;
+	  pthread_create(&gtid, NULL, remove_mac_from_black_acl, NULL);
+      pthread_detach(gtid);
+  }
+  printf("get deny mac from driver and mac is %s\r\n",mac);
+}
+

 
+int main(int argc, char *argv[])
+{    	
+	printf("------------------------->argc %d<------------------------------\r\n",argc);	
+	if(argc == 4)
+	{
+		char buf[128] = {0};
+		g_black_time = atoi(argv[2]);   
+	    g_black_count = atoi(argv[3]);
+		printf("argv[2]:%s argv[3]:%s g_black_time:%d g_black_count=%d\n", argv[2],argv[3],g_black_time,g_black_count);	
+	}
+	update_deny_mac_count_to_mib();
+	update_connect_pid_to_wifi();
+    signal(SIGUSR1, sigcallback);
+    while(1)
+	{
+		sleep(10);
+	}
+}

测试工具

 

https://github.com/baihengaead/wifi-crack-tool

 

rtl819x-sdk-v3.4.14b是Realtek(瑞昱)推出的一个软件开发工具包(SDK),用于开发和定制基于rtl819x系列芯片的网络设备。该SDK为开发人员提供了一套完整的工具和资源,可以帮助他们快速而高效地构建和定制自己的网络设备。 这个SDK具有丰富的功能和组件,包括了一系列的开发工具和库,以及各种API和驱动程序。它支持多种应用场景,例如家庭路由器、无线接入点、无线网桥等。开发人员可以使用该SDK进行软件开发、编译和调试,以满足自己特定的需求。 rtl819x-sdk-v3.4.14b-full-package是该SDK的完整版本。它包含了所有的工具、库和资料,以及相关的文档和示例代码。使用这个完整包,开发人员可以方便地开始他们的开发工作,无需额外下载或安装其他组件。 对于开发人员来说,rtl819x-sdk-v3.4.14b-full-package的使用具有很多优势。首先,它提供了丰富的开发资源,减少了开发工作的时间和精力。其次,它是经过实践验证和经过优化的版本,具有较高的稳定性和可靠性。最后,该SDK是免费提供的,开发人员可以免费获取和使用,加快了他们的开发进程。 总之,rtl819x-sdk-v3.4.14b-full-package是一个功能强大且完整的软件开发工具包,适用于开发和定制基于rtl819x系列芯片的网络设备。它为开发人员提供了一套完善的工具和资源,帮助他们快速、高效地构建和定制网络设备。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wellnw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值