예제 #1
0
파일: config.c 프로젝트: ohio813/reqrypt
/*
 * Reads the configuration from a set of vars.
 */
static void load_config(struct http_user_vars_s *vars, struct config_s *config)
{
    http_get_bool_var(vars, VAR_ENABLED, &config->enabled);
    http_get_bool_var(vars, VAR_HIDE_TCP, &config->hide_tcp);
    http_get_bool_var(vars, VAR_HIDE_TCP_DATA, &config->hide_tcp_data);
    http_get_enum_var(vars, VAR_HIDE_TCP_SYN, flag_def, DEF_SIZE(flag_def),
        &config->hide_tcp_syn);
    http_get_enum_var(vars, VAR_HIDE_TCP_ACK, flag_def, DEF_SIZE(flag_def),
        &config->hide_tcp_ack);
    http_get_enum_var(vars, VAR_HIDE_TCP_PSH, flag_def, DEF_SIZE(flag_def),
        &config->hide_tcp_psh);
    http_get_enum_var(vars, VAR_HIDE_TCP_FIN, flag_def, DEF_SIZE(flag_def),
        &config->hide_tcp_fin);
    http_get_enum_var(vars, VAR_HIDE_TCP_RST, flag_def, DEF_SIZE(flag_def),
        &config->hide_tcp_rst);
    http_get_enum_var(vars, VAR_SPLIT_MODE, split_def, DEF_SIZE(split_def),
        &config->split);
    config_enum_t log_level;
    if (http_get_enum_var(vars, VAR_LOG_LEVEL, log_level_def,
        DEF_SIZE(log_level_def), &log_level))
    {
        log_set_level(log_level);
    }
    http_get_bool_var(vars, VAR_HIDE_UDP, &config->hide_udp);
    http_get_enum_var(vars, VAR_GHOST_MODE, ghost_def, DEF_SIZE(ghost_def),
        &config->ghost);
    http_get_bool_var(vars, VAR_GHOST_CHECK, &config->ghost_check);
    http_get_bool_var(vars, VAR_GHOST_SET_TTL, &config->ghost_set_ttl);
    http_get_int_var(vars, VAR_GHOST_TTL, 0, UINT8_MAX,
        sizeof(config->ghost_ttl), &config->ghost_ttl);
    http_get_enum_var(vars, VAR_FRAG_MODE, frag_def, DEF_SIZE(frag_def),
        &config->fragment);
    http_get_int_var(vars, VAR_TCP_PORT, 0, UINT16_MAX,
        sizeof(config->tcp_port), (uint8_t *)&config->tcp_port);
    const char *tcp_proto_name;
    if (http_get_string_var(vars, VAR_TCP_PROTO, &tcp_proto_name))
    {
        config->tcp_proto = protocol_get(tcp_proto_name);
    }
    http_get_int_var(vars, VAR_UDP_PORT, 0, UINT16_MAX,
        sizeof(config->udp_port), &config->udp_port);
    const char *udp_proto_name;
    if (http_get_string_var(vars, VAR_UDP_PROTO, &udp_proto_name))
    {
        config->udp_proto = protocol_get(udp_proto_name);
    }
    http_get_int_var(vars, VAR_MTU, 0, UINT16_MAX, sizeof(config->mtu),
        (uint8_t *)&config->mtu);
    http_get_bool_var(vars, VAR_LAUNCH_UI, &config->launch_ui);
}
예제 #2
0
파일: packet.c 프로젝트: DPMI/libcap_utils
void header_init(struct header_chunk* header, const struct cap_header* cp, int layer){
	header->cp = cp;
	header->protocol = NULL;
	header->last_net = (struct network){"", "", 0};
	header->truncated = 0;
	header->ptr = NULL;
}

int header_walk(struct header_chunk* header){
	if ( !header->ptr ){
		header->protocol = protocol_get(PROTOCOL_ETHERNET);
		header->ptr = header->cp->payload;

		if ( limited_caplen(header->cp, header->ptr, header_size(header)) ){
			header->truncated = 1;
		}

		return 1;
	}

	return next_payload(header);
}

void header_dump(FILE* fp, const struct header_chunk* header, const char* prefix){
	if ( !header->protocol->dump ){
		fprintf(fp, "%s(not implemented)\n", prefix);
		return;
	}

	if ( header->truncated && !header->protocol->partial_print ){
		fprintf(fp, "%s[Packet size limited during capture]\n", prefix);
		return;
	}


	ptr_sanity(header->cp, header->ptr, NULL);
	header->protocol->dump(fp, header, header->ptr, prefix, 0);
}

void header_format(FILE* fp, const struct header_chunk* header, int flags){
	if ( header->truncated && !header->protocol->partial_print ){
		fprintf(fp, ": %s [Packet size limited during capture]", header->protocol->name);
		return;
	}

	if ( !header->protocol->format ){
		fprintf(fp, ": %s", header->protocol->name);
		return;
	}

	ptr_sanity(header->cp, header->ptr, NULL);
	header->protocol->format(fp, header, header->ptr, flags);
}

size_t header_size(const struct header_chunk* header){
	return header->protocol->size_dyn ? header->protocol->size_dyn(header, header->ptr) : header->protocol->size;
}
예제 #3
0
파일: packet.c 프로젝트: DPMI/libcap_utils
static int next_payload(struct header_chunk* header){
	/* stop processing if protocol doesn't define next_payload */
	if ( !header->protocol->next_payload ){
		return 0;
	}

	/* stop if previous header was truncated */
	if ( header->truncated ){
		return 0;
	}

	const char* next = header->ptr;
	const struct caputils_protocol* current = header->protocol;
	enum caputils_protocol_type type = current->next_payload(header, header->ptr, &next);

	header->ptr = next;
	header->protocol = protocol_get(type);
	if ( !header->protocol ){
		fprintf(stderr, "invalid protocol type %d, make sure protocol is registerd\n", type);
		abort();
	}

	/* validate payload pointer */
	if ( (header->ptr == NULL && type == PROTOCOL_DONE) || limited_caplen(header->cp, header->ptr, 0) ){
		header->ptr = NULL;
		header->truncated = 1;
		return 0;
	}

	/* make sure pointer is actually inside the captured packet (and not pointing at random data because of a corrupted packet) */
	ptr_sanity(header->cp, header->ptr, current);

	/* ensure there is enough data left */
	if ( limited_caplen(header->cp, header->ptr, header_size(header)) ){
		header->truncated = 1;
	}

	return
		type != PROTOCOL_UNKNOWN &&
		type != PROTOCOL_DONE;
}