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

📄 hostap_filter.c

📁 该系统是基于Linux平台的WLAN应用
💻 C
📖 第 1 页 / 共 2 页
字号:
				}else{//first node type is dst mac				//	p_cfg_node->type = CFG_BLOCK_TYPE_DA;					memcpy(p_cfg_node, &frame_mgmt_da, sizeof(cfg_block_t));					printf("type is %d\n", p_cfg_node->type);					memcpy(p_cfg_node->value.value_mac, filter.dst_mac, 6);					p_cfg_node->left = cfg_false;					p_cfg_node->right = cfg_true;				}			}else{//first node type is src mac				memcpy(p_cfg_node, &frame_mgmt_sa, sizeof(cfg_block_t));				printf("sa type is %d\n", p_cfg_node->type);				memcpy(p_cfg_node->value.value_mac, filter.src_mac, 6);				make_cfg_node(CFG_BLOCK_TYPE_SA, LEFT_SON, p_cfg_node);					make_cfg_node(CFG_BLOCK_TYPE_SA, RIGHT_SON, p_cfg_node);			}		}else{//first node type is frame type			memcpy(p_cfg_node, &frame_type, sizeof(cfg_block_t));			p_cfg_node->value.value_type = filter.type_num;			make_cfg_node(CFG_BLOCK_TYPE_TYPE, LEFT_SON, p_cfg_node);			make_cfg_node(CFG_BLOCK_TYPE_TYPE, RIGHT_SON, p_cfg_node);		}	}else{//this is not the first node		if ((father_node_type == CFG_BLOCK_TYPE_TRUE) || (father_node_type == CFG_BLOCK_TYPE_FALSE)){			return ;		}		current_node_type = get_current_node_type(father_node_type, left_or_right_son);		printf("current node type is %d\n", current_node_type);		if (current_node_type == -1){//father node is true or false nodeand no current node exist			//not attach this node to father node here, do it afterwards for one time			return ;		}		if ((p_cfg_node = (cfg_block_t *)malloc(sizeof(cfg_block_t))) == NULL){			perror("not enough memory\n");			return ;		}		switch (current_node_type){			case CFG_BLOCK_TYPE_TYPE:				memcpy(p_cfg_node, &frame_type, sizeof(cfg_block_t));				p_cfg_node->value.value_type = filter.type_num;				break;			case CFG_BLOCK_TYPE_SA:				//here we do mgmt and data's sa filter, so we must confirm which frame type is ,and so take measure accordingly				if (filter.type_num == WLAN_FC_TYPE_MGMT){					memcpy(p_cfg_node, &frame_mgmt_sa, sizeof(cfg_block_t));					memcpy(p_cfg_node->value.value_mac, filter.src_mac, 6);				}else if (filter.type_num == WLAN_FC_TYPE_DATA){					memcpy(p_cfg_node, &frame_data_fromds_sa, sizeof(cfg_block_t));					memcpy(p_cfg_node->value.value_mac, filter.src_mac, 6);							}				break;			case CFG_BLOCK_TYPE_DA:				if (filter.type_num == WLAN_FC_TYPE_MGMT){					memcpy(p_cfg_node, &frame_mgmt_da, sizeof(cfg_block_t));					memcpy(p_cfg_node->value.value_mac, filter.dst_mac, 6);									}else{					memcpy(p_cfg_node, &frame_data_fromds_da, sizeof(cfg_block_t));					memcpy(p_cfg_node->value.value_mac, filter.dst_mac, 6);								}				break;			case CFG_BLOCK_TYPE_STYPE:				memcpy(p_cfg_node, &frame_stype, sizeof(cfg_block_t));				p_cfg_node->value.value_type = filter.stype[filter.stype_num_tmp];				break;			case CFG_BLOCK_TYPE_FALSE:				father_node->left = cfg_false;				return ;				break;			case CFG_BLOCK_TYPE_TRUE:				father_node->right = cfg_true;				return ;				break;			default :				printf("error exit\n");				exit(0);		}		if (left_or_right_son == LEFT_SON){			father_node->left = p_cfg_node;		}else if (left_or_right_son == RIGHT_SON){			father_node->right = p_cfg_node;		}else{			printf("invalid input\n");		}		printf("test..........................\n");		make_cfg_node(current_node_type, LEFT_SON, p_cfg_node);		make_cfg_node(current_node_type, RIGHT_SON, p_cfg_node);			}	return ;}//two cases, one for no type, one for typeint make_cfg(){	printf("make cfg begin...\n");	printf("init cfg...\n");	if ((cfg_false = (cfg_block_t *)malloc(sizeof(cfg_block_t))) == NULL){		perror("no enough memory\n");		return -1;	}	if ((cfg_true = (cfg_block_t *)malloc(sizeof(cfg_block_t))) == NULL){		perror("no enough memory\n");		return -1;	}		cfg_false->type = CFG_BLOCK_TYPE_FALSE;	cfg_true->type = CFG_BLOCK_TYPE_TRUE;	printf("init cfg end\n");	printf("form cfg...\n");	make_cfg_node(-1, 0, NULL);	if (filter.type_num = WLAN_FC_TYPE_NO){			}	printf("make cfg end\n");	return 0;}void printf_cfg_node(cfg_block_t *cfg_node){	int i = 0;	if (cfg_node == NULL){		return ;	}	printf("----------cfg_node's type is %d\n", cfg_node->type);	if (cfg_node->type == CFG_BLOCK_TYPE_FALSE){		printf("false\n");		return ;	}	if (cfg_node->type == CFG_BLOCK_TYPE_TRUE){		printf("true\n");		return ;	}			if (cfg_node->byte_or_bit == BYTE_TYPE){		printf("bit or byte is %d\n", cfg_node->byte_or_bit);		printf("bytes offset is %d\n", cfg_node->byte_offset);		printf("bytes len is %d\n", cfg_node->bytes);		printf("cfg_node's mac is 0x");		for (i = 0; i < 6; i++){			printf("%0x ", cfg_node->value.value_mac[i]);		}		printf("\n");	}else{		printf("bit or byte is %d\n", cfg_node->byte_or_bit);				printf("cfg node's value is %0x\n", cfg_node->value.value_type);			}	return ;	}void show_cfg_node(cfg_block_t *cfg_node){	if (cfg_node == NULL){		return;	}else{		printf_cfg_node(cfg_node);		show_cfg_node(cfg_node->left);		show_cfg_node(cfg_node->right);	}	return ;	}void show_cfg(){	if (cfg == NULL){		printf("error: no cfg\n");		return; 	}else{		printf("\n----------------------------show cfg begin--------\n");		show_cfg_node(cfg);		printf("..........................\n");		show_cfg_node(cfg);		printf("\n----------------------------show cfg end----------\n");	}	return ;}int main(){//	u8 src_mac[] = "111111111111";//	u8 dst_mac[] = "222222222222";	//init filter	memset(&filter, 0, sizeof(filter_t));	printf("hostap_filter\n");	//test add_rules//	add_rules(WLAN_FC_TYPE_MGMT, WLAN_FC_STYPE_BEACON, src_mac, dst_mac);//	add_rules(WLAN_FC_TYPE_MGMT, WLAN_FC_STYPE_AUTH, NULL, NULL);//	add_rules(WLAN_FC_TYPE_CTRL, WLAN_FC_STYPE_RTS, NULL, NULL);//	add_rules(WLAN_FC_TYPE_DATA, WLAN_FC_STYPE_DATA, NULL, NULL);//	show_filter();	u8 stype[] = {		WLAN_FC_STYPE_AUTH,		WLAN_FC_STYPE_BEACON,		WLAN_FC_STYPE_PROBE_RESP,	};	u8 src_mac[6] = {		0x00,0x11,0xd8,0x22,0xac,0xee	};	u8 dst_mac[6] = {		0x00,0x15,0xe9,0x32,0x02,0xb7	};//	memset(dst_mac, 0xff, 6);	//printf("%0x\n", src_mac[0]);	//	add_rule(WLAN_FC_TYPE_MGMT, stype, sizeof(stype)/sizeof(stype[0]), NULL, NULL);//	add_rule(WLAN_FC_TYPE_MGMT, stype, 2, src_mac, dst_mac);	add_rule(WLAN_FC_TYPE_MGMT, stype, 3, dst_mac, src_mac);//	add_rule(WLAN_FC_TYPE_DATA, NULL, 0, NULL, NULL);	printf("filter src mac is %0x\n", filter.has_src_mac);	show_new_filter();	make_cfg();	show_cfg();	/* filter packet here with a filter */	char *pcap_file = "./pcap/auth12.pcap";	start_to_filter(pcap_file);	return 0; }#define BIT_TYPE 1#define BYTE_TYPE 0void dispatch_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data){	//we use cfg to store cfg and filter pkt_data	static num = 0;	static pass_num = 0;	static block_num = 0;	cfg_block_t *current_node;	cfg_block_t *next_node;	int i = 0;	u_char frame_bit_value = 0;	char result = 0;//0 for true , -1 for false	/*	if ( (current_node = (cfg_block_t *)malloc(sizeof(cfg_block_t))) == NULL){		perror("not enough memeory");		return ;	}	if ( (next_node = (cfg_block_t *)malloc(sizeof(cfg_block_t))) == NULL){		perror("not enough memory");		return ;	}*/	num++;	current_node = cfg;	next_node = cfg;	int loop_num = 0;	do {		loop_num++;		printf("loop_num = %d\n", loop_num);				current_node = next_node;		// bit or byte case		if (current_node->byte_or_bit == BYTE_TYPE){		//	printf("0x%0x: 0x%0x: 0x%0x: 0x%0x: 0x%0x: 0x%0x", );			if (memcmp(&pkt_data[current_node->byte_offset], current_node->value.value_mac, 6) ==  0) {				result = 0;			} else				result = -1;			for (i = 0; i < current_node->bytes; i++){			printf("0x%0x: ", pkt_data[current_node->byte_offset + i]);						printf("0x%0x: ", current_node->value.value_mac[i]);					if (pkt_data[current_node->byte_offset + i] != current_node->value.value_mac[i]){//					result = -1;				}			}		}else{			if (current_node->bit_offset == 2){//type block				frame_bit_value = WLAN_FC_GET_TYPE(pkt_data[0]);				if (frame_bit_value == current_node->value.value_type){					result = 0;				}else{					result = -1;				}			}else if (current_node->bit_offset == 4){//stype block				frame_bit_value = WLAN_FC_GET_STYPE(pkt_data[0]);				if (frame_bit_value == current_node->value.value_type){					result = 0;				}else{					result = -1;				}							}		} // if  (current_node->byte_or_bit == BYTE_TYPE){		if (result == 0){			printf("next node is right son\n");			next_node = current_node->right;				}else{			printf("next node is left son\n");			next_node = current_node->left;			if (next_node == NULL)				printf("null");			printf(".................current node's type is %d\n", current_node->type);		}		printf("loop end\n");			if (next_node == NULL)				printf("null\n");	} while( (next_node->type != CFG_BLOCK_TYPE_TRUE) && (next_node->type != CFG_BLOCK_TYPE_FALSE)  );	if (next_node->type == CFG_BLOCK_TYPE_TRUE){		pass_num++;		printf("pass\n");	}else{		block_num++;		printf("blocked\n");	}	printf("this is  num frame %d\n", num);	printf("pass %d\n", pass_num);	printf("block %d\n", block_num);}void start_to_filter(char *pcap_file){	pcap_t *pd = NULL;	char errstr[PCAP_ERRBUF_SIZE + 1];	pd = pcap_open_offline(pcap_file, errstr);	if (pd == NULL){		perror("pcap open file error\n");		return ;	}	pcap_loop(pd, 0, dispatch_handler, NULL);	return ;}

⌨️ 快捷键说明

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