print-802_11.c

来自「TCPDUMP的C语言源代码,是在数据链路层的应用」· C语言 代码 · 共 1,302 行 · 第 1/3 页

C
1,302
字号
		return 0;	memcpy(&pbody.timestamp, p, IEEE802_11_TSTAMP_LEN);	offset += IEEE802_11_TSTAMP_LEN;	pbody.beacon_interval = EXTRACT_LE_16BITS(p+offset);	offset += IEEE802_11_BCNINT_LEN;	pbody.capability_info = EXTRACT_LE_16BITS(p+offset);	offset += IEEE802_11_CAPINFO_LEN;	parse_elements(&pbody, p, offset);	PRINT_SSID(pbody);	PRINT_RATES(pbody);	PRINT_DS_CHANNEL(pbody);	return 1;}static inthandle_atim(void){	/* the frame body for ATIM is null. */	return 1;}static inthandle_disassoc(const u_char *p){	struct mgmt_body_t  pbody;	memset(&pbody, 0, sizeof(pbody));	if (!TTEST2(*p, IEEE802_11_REASON_LEN))		return 0;	pbody.reason_code = EXTRACT_LE_16BITS(p);	printf(": %s",	    (pbody.reason_code < NUM_REASONS)		? reason_text[pbody.reason_code]		: "Reserved" );	return 1;}static inthandle_auth(const u_char *p){	struct mgmt_body_t  pbody;	int offset = 0;	memset(&pbody, 0, sizeof(pbody));	if (!TTEST2(*p, 6))		return 0;	pbody.auth_alg = EXTRACT_LE_16BITS(p);	offset += 2;	pbody.auth_trans_seq_num = EXTRACT_LE_16BITS(p + offset);	offset += 2;	pbody.status_code = EXTRACT_LE_16BITS(p + offset);	offset += 2;	parse_elements(&pbody, p, offset);	if ((pbody.auth_alg == 1) &&	    ((pbody.auth_trans_seq_num == 2) ||	     (pbody.auth_trans_seq_num == 3))) {		printf(" (%s)-%x [Challenge Text] %s",		    (pbody.auth_alg < NUM_AUTH_ALGS)			? auth_alg_text[pbody.auth_alg]			: "Reserved",		    pbody.auth_trans_seq_num,		    ((pbody.auth_trans_seq_num % 2)		        ? ((pbody.status_code < NUM_STATUSES)			       ? status_text[pbody.status_code]			       : "n/a") : ""));		return 1;	}	printf(" (%s)-%x: %s",	    (pbody.auth_alg < NUM_AUTH_ALGS)		? auth_alg_text[pbody.auth_alg]		: "Reserved",	    pbody.auth_trans_seq_num,	    (pbody.auth_trans_seq_num % 2)	        ? ((pbody.status_code < NUM_STATUSES)		    ? status_text[pbody.status_code]	            : "n/a")	        : "");	return 1;}static inthandle_deauth(const struct mgmt_header_t *pmh, const u_char *p){	struct mgmt_body_t  pbody;	int offset = 0;	const char *reason = NULL;	memset(&pbody, 0, sizeof(pbody));	if (!TTEST2(*p, IEEE802_11_REASON_LEN))		return 0;	pbody.reason_code = EXTRACT_LE_16BITS(p);	offset += IEEE802_11_REASON_LEN;	reason = (pbody.reason_code < NUM_REASONS)			? reason_text[pbody.reason_code]			: "Reserved";	if (eflag) {		printf(": %s", reason);	} else {		printf(" (%s): %s", etheraddr_string(pmh->sa), reason);	}	return 1;}/********************************************************************************* * Print Body funcs *********************************************************************************/static intmgmt_body_print(u_int16_t fc, const struct mgmt_header_t *pmh,    const u_char *p){	switch (FC_SUBTYPE(fc)) {	case ST_ASSOC_REQUEST:		printf("Assoc Request");		return handle_assoc_request(p);	case ST_ASSOC_RESPONSE:		printf("Assoc Response");		return handle_assoc_response(p);	case ST_REASSOC_REQUEST:		printf("ReAssoc Request");		return handle_reassoc_request(p);	case ST_REASSOC_RESPONSE:		printf("ReAssoc Response");		return handle_reassoc_response(p);	case ST_PROBE_REQUEST:		printf("Probe Request");		return handle_probe_request(p);	case ST_PROBE_RESPONSE:		printf("Probe Response");		return handle_probe_response(p);	case ST_BEACON:		printf("Beacon");		return handle_beacon(p);	case ST_ATIM:		printf("ATIM");		return handle_atim();	case ST_DISASSOC:		printf("Disassociation");		return handle_disassoc(p);	case ST_AUTH:		printf("Authentication");		if (!TTEST2(*p, 3))			return 0;		if ((p[0] == 0 ) && (p[1] == 0) && (p[2] == 0)) {			printf("Authentication (Shared-Key)-3 ");			return wep_print(p);		}		return handle_auth(p);	case ST_DEAUTH:		printf("DeAuthentication");		return handle_deauth(pmh, p);		break;	default:		printf("Unhandled Management subtype(%x)",		    FC_SUBTYPE(fc));		return 1;	}}/********************************************************************************* * Handles printing all the control frame types *********************************************************************************/static intctrl_body_print(u_int16_t fc, const u_char *p){	switch (FC_SUBTYPE(fc)) {	case CTRL_PS_POLL:		printf("Power Save-Poll");		if (!TTEST2(*p, CTRL_PS_POLL_HDRLEN))			return 0;		printf(" AID(%x)",		    EXTRACT_LE_16BITS(&(((const struct ctrl_ps_poll_t *)p)->aid)));		break;	case CTRL_RTS:		printf("Request-To-Send");		if (!TTEST2(*p, CTRL_RTS_HDRLEN))			return 0;		if (!eflag)			printf(" TA:%s ",			    etheraddr_string(((const struct ctrl_rts_t *)p)->ta));		break;	case CTRL_CTS:		printf("Clear-To-Send");		if (!TTEST2(*p, CTRL_CTS_HDRLEN))			return 0;		if (!eflag)			printf(" RA:%s ",			    etheraddr_string(((const struct ctrl_cts_t *)p)->ra));		break;	case CTRL_ACK:		printf("Acknowledgment");		if (!TTEST2(*p, CTRL_ACK_HDRLEN))			return 0;		if (!eflag)			printf(" RA:%s ",			    etheraddr_string(((const struct ctrl_ack_t *)p)->ra));		break;	case CTRL_CF_END:		printf("CF-End");		if (!TTEST2(*p, CTRL_END_HDRLEN))			return 0;		if (!eflag)			printf(" RA:%s ",			    etheraddr_string(((const struct ctrl_end_t *)p)->ra));		break;	case CTRL_END_ACK:		printf("CF-End+CF-Ack");		if (!TTEST2(*p, CTRL_END_ACK_HDRLEN))			return 0;		if (!eflag)			printf(" RA:%s ",			    etheraddr_string(((const struct ctrl_end_ack_t *)p)->ra));		break;	default:		printf("Unknown Ctrl Subtype");	}	return 1;}/* * Print Header funcs *//* *  Data Frame - Address field contents * *  To Ds  | From DS | Addr 1 | Addr 2 | Addr 3 | Addr 4 *    0    |  0      |  DA    | SA     | BSSID  | n/a *    0    |  1      |  DA    | BSSID  | SA     | n/a *    1    |  0      |  BSSID | SA     | DA     | n/a *    1    |  1      |  RA    | TA     | DA     | SA */static voiddata_header_print(u_int16_t fc, const u_char *p, const u_int8_t **srcp,    const u_int8_t **dstp){	u_int subtype = FC_SUBTYPE(fc);	if (DATA_FRAME_IS_CF_ACK(subtype) || DATA_FRAME_IS_CF_POLL(subtype) ||	    DATA_FRAME_IS_QOS(subtype)) {		printf("CF ");		if (DATA_FRAME_IS_CF_ACK(subtype)) {			if (DATA_FRAME_IS_CF_POLL(subtype))				printf("Ack/Poll");			else				printf("Ack");		} else {			if (DATA_FRAME_IS_CF_POLL(subtype))				printf("Poll");		}		if (DATA_FRAME_IS_QOS(subtype))			printf("+QoS");		printf(" ");	}#define ADDR1  (p + 4)#define ADDR2  (p + 10)#define ADDR3  (p + 16)#define ADDR4  (p + 24)	if (!FC_TO_DS(fc) && !FC_FROM_DS(fc)) {		if (srcp != NULL)			*srcp = ADDR2;		if (dstp != NULL)			*dstp = ADDR1;		if (!eflag)			return;		printf("DA:%s SA:%s BSSID:%s ",		    etheraddr_string(ADDR1), etheraddr_string(ADDR2),		    etheraddr_string(ADDR3));	} else if (!FC_TO_DS(fc) && FC_FROM_DS(fc)) {		if (srcp != NULL)			*srcp = ADDR3;		if (dstp != NULL)			*dstp = ADDR1;		if (!eflag)			return;		printf("DA:%s BSSID:%s SA:%s ",		    etheraddr_string(ADDR1), etheraddr_string(ADDR2),		    etheraddr_string(ADDR3));	} else if (FC_TO_DS(fc) && !FC_FROM_DS(fc)) {		if (srcp != NULL)			*srcp = ADDR2;		if (dstp != NULL)			*dstp = ADDR3;		if (!eflag)			return;		printf("BSSID:%s SA:%s DA:%s ",		    etheraddr_string(ADDR1), etheraddr_string(ADDR2),		    etheraddr_string(ADDR3));	} else if (FC_TO_DS(fc) && FC_FROM_DS(fc)) {		if (srcp != NULL)			*srcp = ADDR4;		if (dstp != NULL)			*dstp = ADDR3;		if (!eflag)			return;		printf("RA:%s TA:%s DA:%s SA:%s ",		    etheraddr_string(ADDR1), etheraddr_string(ADDR2),		    etheraddr_string(ADDR3), etheraddr_string(ADDR4));	}#undef ADDR1#undef ADDR2#undef ADDR3#undef ADDR4}static voidmgmt_header_print(const u_char *p, const u_int8_t **srcp,    const u_int8_t **dstp){	const struct mgmt_header_t *hp = (const struct mgmt_header_t *) p;	if (srcp != NULL)		*srcp = hp->sa;	if (dstp != NULL)		*dstp = hp->da;	if (!eflag)		return;	printf("BSSID:%s DA:%s SA:%s ",	    etheraddr_string((hp)->bssid), etheraddr_string((hp)->da),	    etheraddr_string((hp)->sa));}static voidctrl_header_print(u_int16_t fc, const u_char *p, const u_int8_t **srcp,    const u_int8_t **dstp){	if (srcp != NULL)		*srcp = NULL;	if (dstp != NULL)		*dstp = NULL;	if (!eflag)		return;	switch (FC_SUBTYPE(fc)) {	case CTRL_PS_POLL:		printf("BSSID:%s TA:%s ",		    etheraddr_string(((const struct ctrl_ps_poll_t *)p)->bssid),		    etheraddr_string(((const struct ctrl_ps_poll_t *)p)->ta));		break;	case CTRL_RTS:		printf("RA:%s TA:%s ",		    etheraddr_string(((const struct ctrl_rts_t *)p)->ra),		    etheraddr_string(((const struct ctrl_rts_t *)p)->ta));		break;	case CTRL_CTS:		printf("RA:%s ",		    etheraddr_string(((const struct ctrl_cts_t *)p)->ra));		break;	case CTRL_ACK:		printf("RA:%s ",		    etheraddr_string(((const struct ctrl_ack_t *)p)->ra));		break;	case CTRL_CF_END:		printf("RA:%s BSSID:%s ",		    etheraddr_string(((const struct ctrl_end_t *)p)->ra),		    etheraddr_string(((const struct ctrl_end_t *)p)->bssid));		break;	case CTRL_END_ACK:		printf("RA:%s BSSID:%s ",		    etheraddr_string(((const struct ctrl_end_ack_t *)p)->ra),		    etheraddr_string(((const struct ctrl_end_ack_t *)p)->bssid));		break;	default:		printf("(H) Unknown Ctrl Subtype");		break;	}}static intextract_header_length(u_int16_t fc){	int len;	switch (FC_TYPE(fc)) {	case T_MGMT:		return MGMT_HDRLEN;	case T_CTRL:		switch (FC_SUBTYPE(fc)) {		case CTRL_PS_POLL:			return CTRL_PS_POLL_HDRLEN;		case CTRL_RTS:			return CTRL_RTS_HDRLEN;		case CTRL_CTS:			return CTRL_CTS_HDRLEN;		case CTRL_ACK:			return CTRL_ACK_HDRLEN;		case CTRL_CF_END:			return CTRL_END_HDRLEN;		case CTRL_END_ACK:			return CTRL_END_ACK_HDRLEN;		default:			return 0;		}	case T_DATA:		len = (FC_TO_DS(fc) && FC_FROM_DS(fc)) ? 30 : 24;		if (DATA_FRAME_IS_QOS(FC_SUBTYPE(fc)))			len += 2;		return len;	default:		printf("unknown IEEE802.11 frame type (%d)", FC_TYPE(fc));		return 0;	}}/* * Print the 802.11 MAC header if eflag is set, and set "*srcp" and "*dstp" * to point to the source and destination MAC addresses in any case if * "srcp" and "dstp" aren't null. */static inline voidieee_802_11_hdr_print(u_int16_t fc, const u_char *p, const u_int8_t **srcp,

⌨️ 快捷键说明

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