Hola ctlon,
Hookeas socket = Guardas el manejador.
No he dicho que no tenga el manejador, el manejador lo tengo la cosa es como enviar al cliente por el socket ya abierto puesto que send envía al servidor.
setsockopt activas SO_RCVTIMEO = Ya no queda "enganchado" y te llamara todo el rato. esta funcion tiene que estar escrita perfectamente para evitar fallos de conexion.
Esta función no la conocía.
Y no me digas que no funciona pq lo he probado aproposito. esto haciendolo simple, para mas detalles te lees la documentacion.
No sé como dices que de la manera que explicas te funcione, posiblemente sigues sin entender el problema que tengo.
de primeras tu no ejecutas nada, es el programa el que llama a la funcion y no tiene que leer nada, es la funcion la que copia los datos en el buffer.
Vuelves a no entenderlo o tal vez soy yo, te hago un apunte :p:
/*********************************************************************
* Hook a la función "RECV", aquí es donde haremos todo el proceso del antibot
*********************************************************************/
int WINAPI __stdcall recibir(SOCKET s, char* buf, int len, int flags)
{
int RecvBytes = (!announce)?_recv(s, buf, len, flags):Kami(buf);
if(RecvBytes == SOCKET_ERROR) return RecvBytes;
if((*(unsigned short*)buf)==0x283) CreateThread(0, 0, (LPTHREAD_START_ROUTINE)&Kami, 0, 0, 0);
if((*(unsigned short*)buf)==0x0041) RecvBytes=antibot(s, buf, RecvBytes, len, flags); // Si el packet recibido es del antibot lo ejecutamos
return RecvBytes;
}
Este es la función hookeada, el packet 0x283 es el de cuando el jugador accede al juego, lo que hace es crear otro thread para enviar el broadcast una vez que ha entrado al juego (esto es lo que hice rápido a tu manera pero de la forma que yo quiero).
Tu lo que dices es que ahí modifique el BUF, el cual luego obtiene el EXE, pero entonces el packet 0x283 no será recibido (ya que lo modifico por el 0x9a) por el EXE así que lo que yo quiero es que cuando entre al juego el DLL envíe un
nuevo packet al EXE por eso te comenté lo de ejecutar recibir (que obviamente no funciona así) porque habrá que ejecutar la función (la cual no sé cómo será, tal vez estoy hoy espeso) para enviarle los datos al EXE.
Ese recibir es el que he hecho rápido según tu manera (sin modificar el BUF de ningún packet) y obviamente no funciona porque la función no es ejecutada por el EXE, aquí te dejo la función kami:
/**********************************************************************
* La función Kami envía al cliente un mensaje
**********************************************************************/
int Kami(char* buf){
char msg[] = "Mensaje de prueba";
int len = 4+sizeof(msg);
if(!announce){
char* almacen
= (char*)malloc(len
); Sleep(1000); // Esperar 1 segundo una vez entrado al juego antes de enviar el mensaje
announce = 1;
recibir((SOCKET)NULL, (char*)almacen, len, 0);
ExitThread(0);
return 0;
}
announce = 0;
*(unsigned short*)buf = 0x9a; // Packet broadcast
*(unsigned short*)(buf+2) = len; // Tamaño del packet
memcpy(buf
+4, msg
, sizeof(msg
)); // Añadimos el mensaje return len;
}
Tal vez con las funciones entiendas por qué no funciona tu manera.
El codigo es precisamente de la MSDN. a mi me sorprende que como no sabiendo usar punteros a funciones seas capaz de hacer un hook.
Tal vez porque la función recv sé que se encuentra en Ws2_32.dll y que se llama recv, entonces puedo llamar a la dirección de memoria con GetProcAddres y el handle GetModuleHandle y así modificar los primeros 5 bytes para que apunte a mi función. No hay que ser un genio para hacer esto... si sé hacer punteros a funciones, en todo caso no sé como saber cual es la función que el EXE ejecuta cuando envía un broadcast :p.
Puedes seguir pensando que soy un idiota, la verdad es que me da igual pero creo que si no lo pensases tal vez avanzaríamos más rápido, más que nada porque el hecho de demostrarte que sé utilizar la función recv (que con mirar la doc basta) es una pérdida de tiempo, gracias por tu ayuda y espero que entiendas con ese código rápido que hice por qué es que no funciona lo que dices (o tal vez yo no te entiendo a ti).
P.D: Para que me entiendas, yo
no quiero modificar lo que recibe el EXE (esto ya lo hago para otras cosas), lo que quiero es
enviar algo nuevo al EXE desde el dll.
Saludos!