Gracias grande!, esto es lo que tengo hasta ahora:
void servidor_HTTP(volatile bool *on_sslstrip)
{
WSADATA wsa;
string contenido;
sockaddr_in dir_servidor;
int s_servidor;
WSAStartup(MAKEWORD(2, 0), &wsa);
while (*on_sslstrip){
if ((s_servidor = socket(AF_INET, SOCK_STREAM, 0)) == SOCKET_ERROR){
WSACleanup();
Sleep(20000);
continue;
}
else{
dir_servidor.sin_family = AF_INET;
dir_servidor.sin_addr.s_addr = inet_addr("127.0.0.1");
dir_servidor.sin_port = htons(80);
if (::bind(s_servidor, (struct sockaddr *)&dir_servidor, sizeof(dir_servidor)) == SOCKET_ERROR){
closesocket(s_servidor);
WSACleanup();
Sleep(20000);
continue;
}
sockaddr_in dir_cliente;
while (*on_sslstrip){
int tam = sizeof(dir_cliente);
int s_client = accept(s_servidor, (struct sockaddr *)&dir_cliente, &tam);
if (s_client == INVALID_SOCKET){//SOCKET_ERROR
printf("accept() failed: %d\n", WSAGetLastError());
printf("error");
break;
}
printf("Accepted client: %s:%d\n",
inet_ntoa(dir_cliente.sin_addr), ntohs(dir_cliente.sin_port));
}
}
}
}
Pero me da error, y me sale a la primera iteracion del segundo bucle, la idea recuerdo que es escuchar peticiones de salida en puerto 80 y recojer paquetes como por ejemplo un paquete HTTP, lo primero es acceder a esos paquetes, luego los redirigiría de puerto y haría lo mismo en el otro puerto, entonces tengo la esperanza de que el sistema no pueda hacer conexiones http ni por el puerto 80 puesto que redirigi el puerto, y entonces accedería a los paquetes y los mandaría a los servidores modificandolos y los regresaría a los clientes correspondientes de los paquetes.
Pero ahora estamos por la parte de recoger esos paquetes http o no que usen puerto 80.
Saludos y gracias.
WSAEINVAL
10022
Invalid argument.
Some invalid argument was supplied (for example, specifying an invalid level to the setsockopt function). In some instances, it also refers to the current state of the socket—for instance, calling accept on a socket that is not listening.
Buenas, lo que creaba antes era un servidor en el puerto 80 no era lo correcto, he probado con un cliente que trata de conectar a un puerto de nuestro ordenador para sacar los paquetes aquí el code:
string cliente_HTTP()
{
WSADATA wsa;
string contenido;
sockaddr_in dir;
int sock;
WSAStartup(MAKEWORD(2, 0), &wsa);
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == SOCKET_ERROR){
WSACleanup();
return "";
}
else{
dir.sin_family = AF_INET;
dir.sin_port = htons(80);
dir.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
if (connect(sock, (struct sockaddr*)&dir, sizeof(dir)) == SOCKET_ERROR){
closesocket(sock);
WSACleanup();
cout << "bad";
return "";
}
else{
cout << "Connected to " << inet_ntoa(dir.sin_addr) << "!" << endl;
cout << "hi";
char *respuesta = new char[1000]();
recv(sock, respuesta, 1000, 0);
closesocket(sock);
WSACleanup();
return string(respuesta);
}
}
}
Problema, que da conection refused al hacer el connect(), tiene sentido, pues no podemos conectar a un puerto 80, pues lo tenemos cerrado no se puede conectar, si lo hace si ponemos la ip de google. ¿como entonces accedemos a los paquetes salientes de nuestro ordenador??
Supongo que habrá que buscar esto para windows:
iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port <listenPort>