24/07/2015 07:44
| Como terminar con los tramposos
Hace un año, o más, mi hermano me contó cómo hacían ciertos hackers para jugar con ayuda de motores de ajedrez sin ser detectados. Este truco lo supo de fuentes confiables: unos hackers israelíes que hacían de las suyas en Buho21. Puestos sobre la pista, nos pusimos a investigar. Queríamos saber más detalles. Cuando nos enteramos de todo, abandonamos Buho y buscamos otros sitios donde jugar. Pero yo sospecho que en P8 algunos hacen lo mismo, especialmente en bala.
Les cuento cómo hacen estos hackers (o los jugadores tramposos que usan los programitas hechos por éstos).
El programa en cuestión hace lo siguiente:
1. Se carga en memoria y se pone al tope del ZOrder, es decir: encima de todas las ventanas. Figura como un visor o banner, puesto donde se quiera, por ejemplo, en la esquina superior derecha de la pantalla;
2. El programa carga en memoria, como un proceso adjunto, el motor de ajedrez que el programero prefiera, por ejemplo Rybka. Debe ser UCI, luego verán por qué. Este motor queda "comunicado" con el programa mediante algo que se llama "tubería" (pipeline). Se trata de un bucle sin fin de mensajes. El motor arranca y queda a la espera de órdenes por parte del "host", que sería el programita que estoy describiendo;
3. Constantemente, algo así como 3 o 4 veces por segundo (esta frecuencia se puede ajustar), este programita saca una instantánea de la ventana siguiente en el ZOrder, que es la de P8 (o la ventana del server de ajedrez que ustedes quieran; yo pondré a P8 de ejemplo). Esta instantánea, o "captación" de ventana, es simplemente un bitmap idéntico a lo que ve el ojo humano. Esto se logra mediante las funciones gráficas de la librería GDI de Windows;
4. Cada vez que el programa "mira" la ventana de P8, la escanea en busca del tablero. El programa está diseñado para saber dónde buscarlo, en qué coordenadas espaciales debe rastrear el tablero, todo según la resolución de la pantalla. Si no lo encuentra, sigue a la espera. Si lo encuentra, supone que la partida ya está en juego, y entonces se pone en acción:
5. Una vez que ha localizado en el bitmap de la pantalla la zona del tablero, la escanea con precisión, para determinar qué pieza está en cada casilla. Esto se conoce como OCR: reconocimiento óptico de caracteres. Las figuras de las piezas se analizan igual que caracteres. Este análisis prescinde de las medidas: es topológico. En cualquier página dedicada a “chess programming” encontrarán módulos y plugins para hacer OCR de tableros de ajedrez. Se usan mucho en edición de libros, etc.;
6. Una vez que se escanea el tablero y se hace su OCR, se obtiene una versión "simbólica" del mismo con todas las piezas en juego, es decir: el programa ya sabe a qué posición se ha llegado en la partida. Esta versión simbólica de la posición ya no es una imagen, un bitmap: es información pura. Por ejemplo, una matriz de 64 elementos, cada uno indicando una pieza (con su color), o bien, una casilla vacía;
7. Esta información se recodifica en formato FEN. Las líneas FEN son la forma estándar de codificar posiciones de ajedrez. Por ejemplo:
2r1r1k1/pb3p2/2q3p1/4p3/5n1p/4NR2/PPP2PPP/R1Q2BK1 b -- - 3 24
Ustedes no entienden ese dialecto, pero los programas de ajedrez así;
8. Una vez que el programa convierte la información visual en simbólica y luego en formato FEN, pregunta si esta línea FEN es nueva, o si ya se ha despachado. Si esta línea FEN (esta posición en el tablero), es distinta a la que se ha procesado anteriormente, es que sobre el tablero se ha movido una pieza, y entonces hay que iniciar un nuevo proceso de cálculo, que es lo que explicaré en el punto siguiente. Pero si la posición FEN es igual, es que no ha habido cambios en el tablero, y entonces se sigue "pensando" la posición actual, la ya reconocida;
9. Detectada una nueva posición, el programa se la pasa al motor para que la piense. El protocolo UCI permite pasarle a los motores posiciones FEN y darles la orden "go", para que ellos se pongan a pensar cuál es la mejor jugada en esa situación concreta. No hay límites de tiempo: el motor piensa indefinidamente. Cuanto más tiempo pase, mejor será su apreciación;
10. Dije que el motor estaba comunicado con el programa. No sólo recibe mensajes: también los envía al host. De estos mensajes, el que le importa al programero es cuál es la mejor jugada posible en la actual posición. El motor la brinda en formato antiguo, por así decir: algo así como "b1-c3", "e4-f5", etc. Como los viejos programas de DOS;
11. Esta jugada es la que muestra el programa usado por los programeros. Su único trabajo es saber interpretar esa extraña notación. Imagino que algunos de estos programas ya son capaces de traducir esos códigos a cosas como "Cf3", "AxT", etc;
12. El programero sólo debe mirar el visor de su programa, para saber qué aconseja el motor para esa posición. No está obligado a jugar lo que el motor sugiere: ese es el problema más grave para nosotros, porque de nada sirve analizar luego la partida sospechosa, buscando coincidencias con las jugadas propuestas por (digamos) Fritz;
13. El programa también sabe detectar qué bando debe jugar, claro está. Sin ese dato, nada puede hacer;
14. Todo este proceso parece lento, pero créanlo: si el hacker programa en C/C++ (y no en C#, Java, Ruby, Phyton, VB y cosas parecidas) y el programero cuenta con una PC decente, todos esos pasos se hacen en milisegundos. Lo único que consume tiempo (segundos) es lo que tarda el motor en "pensar" las jugadas. Pero no se hagan los incrédulos: pónganse a jugar a 1 min contra Stockfish, y después me cuentan...;
15. El detector de programeros de P8 (así como el de Buho21) es incapaz de detectar esta trampa, debido a que la ventana de juego jamás pierde su orden en el ZOrder mientras el programa que describí hace su trabajo. La ventana de juego jamás se “desactiva” dado que nadie "sale" de ella. Por eso, la trampa pasa desapercibida.
Corre el mito de que los programeros no juegan blitz, ni mucho menos bala. Pues sepan que no es así. Al contrario: con mucho tiempo, un humano le puede empatar a Rybka, pero a 1 min, ¡ni hablar! Es precisamente en la velocidad donde las "máquinas" nos sacan la mayor ventaja. Y con el truco que expliqué, cualquier estúpido puede jugar bala o blitz con ayuda de un motor, y aplastar a los mejores.
Mi hermano, que sabe esto mucho antes que yo, discutió aquí con no sé quiénes acerca de la incapacidad de hacer trampa a 1 min. Ya ven que es justamente a ese ritmo donde el programero tiene todas las chances a su favor. Hagan la prueba: pónganse a jugar a 1 min contra cualquier motor fuerte...
¿Cómo detectar a esta clase de programeros? Acá van algunas pistas (para Pablo, especialmente):
1. Debería ser posible que, desde el server, se obligue al cliente a "tomar una instantánea" de la pantalla y enviarla a determinada autoridad de P8, en el caso de que se sospeche de cierto jugador. Si en esa instantánea se descubre una especie de visor puesto sobre la ventana de juego, mostrando signos como "d3-e4", es que el jugador debe ir preso;
2. El cliente podría interceptar mensajes de Windows como por ejemplo el que se envía a una ventana para captar su imagen. Puesto que el programa de los hackers hace eso N veces por segundo, si el cliente es capaz de frustrar esos mensajes, el programero quedará "game over";
3. También se podría revisar periódicamente la lista de procesos activos, en busca de motores conocidos. El problema es que así habrían "falsos positivos", por ejemplo: un jugador honesto que, mientras está jugando, tiene abierto Arena con Rybka cargado...
En fin, hagan lo que quieran con estos datos. O lo que puedan. Como dije, yo intuyo que acá en P8 hay unos cuántos que se han bajado esos programitas diabólicos... No lo puedo asegurar. Pero el día que se los pueda detectar, seré el primero en carcajear.
|