Exemplo n.º 1
0
static int dns_global_initialize(struct state_conf *conf) 
{
	char *qtype_str = NULL;
	char *domain = NULL;

	// This is zmap boilerplate. Why do I have to write this? 
	num_ports = conf->source_port_last - conf->source_port_first + 1;
	udp_set_num_ports(num_ports);

	setup_qtype_str_map();

	// Want to add support for multiple questions? Start here. 
	if (!conf->probe_args) { // no parameters passed in. Use defaults
		domain = (char*) default_domain; 
		qtype = default_qtype;
	} else {
		char *probe_arg_delimiter_p = strchr(conf->probe_args, ','); 
		if (probe_arg_delimiter_p == NULL || 
				probe_arg_delimiter_p == conf->probe_args ||
				conf->probe_args + strlen(conf->probe_args) == probe_arg_delimiter_p + 1) {
			log_fatal("dns", "Invalid probe args. Format: \"A,google.com\"");
		}
		domain = probe_arg_delimiter_p + 1;
		qtype_str = xmalloc(probe_arg_delimiter_p - conf->probe_args + 1);
		strncpy(qtype_str, conf->probe_args, 
				probe_arg_delimiter_p - conf->probe_args);
		qtype_str[probe_arg_delimiter_p - conf->probe_args] = '\0'; 

		qtype = qtype_str_to_code(qtype_str);
		
		if (!qtype) {
			log_fatal("dns", "Incorrect qtype supplied. %s", qtype_str);
			return EXIT_FAILURE;
		}
	}

	free(qtype_str);

	return build_global_dns_packet(domain);
}
Exemplo n.º 2
0
int upnp_global_initialize(struct state_conf *state)
{
	int num_ports = state->source_port_last - state->source_port_first + 1;
	udp_set_num_ports(num_ports);
	return EXIT_SUCCESS;
}
Exemplo n.º 3
0
static int udp_dns_global_initialize(struct state_conf *conf) {
	char *args, *c;
	int dns_domain_len;
	unsigned char* dns_domain;

	num_ports = conf->source_port_last - conf->source_port_first + 1;
	udp_set_num_ports(num_ports);


	udp_send_msg_len = sizeof(udp_dns_msg_default);
	udp_send_msg = malloc(udp_send_msg_len);
	memcpy(udp_send_msg, udp_dns_msg_default, udp_send_msg_len);

	if (!(conf->probe_args && strlen(conf->probe_args) > 0))
		return(0);

	args = strdup(conf->probe_args);
	if (! args) exit(1);

	c = strchr(args, ':');
	if (!c) {
		free(args);
		free(udp_send_msg);
		log_fatal("udp_dns", "unknown UDP DNS probe specification (expected "
				"domain name with name:www.domain.com)");
		exit(1);
	}

	*c++ = 0;
	if (strcmp(args, "name") == 0) {
		free(udp_send_msg);
		// prepare domain name
		dns_domain_len=strlen(c)+2; // head 1 byte + null terminator
		dns_domain = malloc(dns_domain_len);
		convert_to_dns_name_format(dns_domain, (unsigned char*)c);

		udp_send_msg_len=dns_domain_len + DNS_HEAD_LEN + DNS_TAIL_LEN; // domain length +  header + tailer
		udp_send_msg = malloc(udp_send_msg_len);

		// create query packet
		memcpy(udp_send_msg, udp_dns_msg_default_head, sizeof(udp_dns_msg_default_head)); // header
		// random Transaction ID
		random_bytes(udp_send_msg, 2);
		memcpy(udp_send_msg + sizeof(udp_dns_msg_default_head), dns_domain, dns_domain_len); // domain
		memcpy(udp_send_msg + sizeof(udp_dns_msg_default_head) + dns_domain_len, udp_dns_msg_default_tail, sizeof(udp_dns_msg_default_tail)); // trailer
		free(dns_domain);
	} else {
		log_fatal("udp_dns", "unknown UDP DNS probe specification (expected "
				"domain name with name:www.domain.com)");
		free(udp_send_msg);
		free(args);
		exit(1);
	}

	if (udp_send_msg_len > MAX_UDP_PAYLOAD_LEN) {
		log_warn("udp_dns", "warning: reducing UDP payload to %d "
			        "bytes (from %d) to fit on the wire\n",
				MAX_UDP_PAYLOAD_LEN, udp_send_msg_len);
		udp_send_msg_len = MAX_UDP_PAYLOAD_LEN;
	}
	free(args);
	return EXIT_SUCCESS;
}