encoding - Descifrando la codificación de protocolo MMORPG
reverse-engineering encryption (5)
A) Juego un MMO y no apoyo bots, votando ... B) Descarga Backtrack v.3, ejecuta un arpspoof en tu puerta de enlace predeterminada y tu host. Hay una aplicación que falsificará el certificado SSL sslmitm del servidor remoto (creo que es el nombre) que luego le permitirá crear una conexión completa a través de su host. Luego agrega fireup tcpdump / ethereal / wireshark (elige tu veneno pcap) y muévete al azar para descubrir qué paquete está haciendo qué. Ese será tu mayor desafío; pero proxying con un ataque de Hombre en Medio sobre ti es el camino a seguir.
C) No apruebo esta actividad, esta información solo se proporciona como información gratuita.
Planeo escribir un robot automatizado para un juego.
La parte difícil es descubrir cómo codificaron su protocolo ... Para que el bot funcione es fácil, simplemente haz que el personaje se ejecute y registre lo que hace en wireshark. Sin embargo, interpretar el entorno es más difícil ... Recibe aproximadamente 5 paquetes por segundo si está inactivo, por lo tanto, muchos garbarge.
Mi plan: como el juego se ejecuta bajo TCP, utilizaré freecap ( http://www.freecap.ru/eng ) para forzar el juego para que se conecte a un proxy que se ejecute en mi máquina. Necesitaré este proxy para poder inyectar paquetes, o quizás un servidor que sea capaz de reenviar paquetes capturados. De esta forma puedo recrear y jugar con lo que envía el servidor y comprender su codificación de protocolo.
- ¿Alguien sabe dónde puedo obtener un proxy que permite la inyección de paquetes o dónde puedo realizar la inyección de paquetes (no a través de hardware, como es el caso con la conexión inalámbrica o algo así!)
- De dónde puedo encontrar un servidor / proxy que reenvía paquetes capturados (es decir: reproduce una conexión).
- ¿Alguna mejor herramienta o metodología para la coincidencia de patrones? Algo que puede resaltar patrones de mensajes múltiples sería GENIAL.
O , ¿hay una mejor manera de descifrar esto aquí? ¿Posiblemente una estrategia de disgregación (mediante el enganche de una función winsock y el inicio del desmontaje desde allí)? No he hecho esto antes, así que no estoy seguro. O , ¿alguna otra idea?
Como ya hice algunos bots en el pasado (por diversión, sin fines de lucro o por supuesto, escribir bots de juegos es muy divertido), recomiendo lo siguiente:
- Si puede codificar y no hay protección contra trampas que le impida hacerlo, le recomiendo escribir una DLL inyectada por los siguientes motivos:
- Su DLL podrá acceder directamente al espacio de memoria del juego, y una vez que realice una ingeniería inversa de las estructuras de datos (ya sea hurgando en la memoria o desensamblando el código), tendrá acceso a una gran cantidad de datos. Esto también le permitirá evitar cualquier encriptación de red que pueda tener el juego. La desventaja de acceder directamente a la memoria de proceso es que las compensaciones y las estructuras de datos cambian entre versiones; sin embargo, las estructuras de datos no cambian muy a menudo con un juego estable, y puede compensar los cambios de desplazamiento buscando patrones de código en lugar de usar compensaciones fijas.
- De cualquier forma, aún podrá conectar las funciones de WinSock utilizando enlaces API (vea Microsoft Detours y el excelente, pero ahora comercial, madCodeHook).
- de lo contrario, solo puedo aconsejarle que proporcione editores de paquetes interactivos / en vivo como WPE Pro try.
En la mayoría de los escenarios, los métodos más geniales (ingeniería inversa del código y acceso directo a la memoria) tienden a ser los menos productivos. Requieren mucha habilidad (para entender el código) y tiempo, tanto inicialmente (para recorrer todo el código y desarrollar código para interactuar con la estructura de datos) como para el mantenimiento (en caso de que el juego se esté actualizando). (Por supuesto, a veces permiten hacer cosas geniales que es imposible de hacer con el cliente oficial, pero la mayoría de las veces esto es obvio como una trampa flagrante, y es probable que atraiga a los gerentes generales rápidamente). La mayoría de las veces, los robots se crean reemplazando gráficos / texturas de juegos con colores sólidos, y creando bots de "píxel" simples que buscan ciertos colores en la pantalla y reaccionan en consecuencia (por ejemplo, hacer clic en ellos).
Espero que esto ayude y recuerde, el engaño solo es divertido cuando no hace que el juego sea menos divertido para todos los demás;)
La interceptación del tráfico de red y el análisis de protocolo generalmente es un método menos favorecido para lograr su objetivo aquí. Para la mayoría de los juegos modernos, el cifrado es un factor serio, y existen serios dolores de cabeza asociados con el análisis de protocolo para cualquier factor menos trivial de los escenarios de juego más comunes.
La mayoría de las implementaciones modernas * de lo que intenta hacer dependen de leer y manipular el espacio de la memoria y el proceso de un cliente en ejecución. El cliente ya habrá hecho todas las piezas difíciles para usted, incluido el descifrado del tráfico y la clasificación en estructuras de datos mucho más fáciles de leer. Para interactuar con el servidor puede llamar funciones integradas en el cliente en lugar de crear series enteras de paquetes desde cero. La ventaja de este enfoque es que debe hacer mucho menos trabajo para interpretar los datos y producir actividad. Lo negativo es que a menudo hay algunos datos en el tráfico de la red que serían útiles para un bot pero el cliente los descarta, o que desea enviar tráfico al servidor que el cliente no puede producir (que, en mi propio pozo) -la jerarquía desarrollada para tal fin, está unos pocos pasos más abajo en la pendiente "trampa").
* ... Digo esto después de haber visto la evolución de la mayoría de las comunidades de robot / boto de MMORPG desde analizadores de protocolos de red como ShowEQ y Odin''s Eye / Excalibur hasta aplicaciones basadas en memoria como MacroQuest e InnerSpace . En ese sentido, InnerSpace proporciona un excelente marco extensible para la variante basada en la memoria / proceso de lo que está intentando, y debería considerarlo como una base para su proyecto si abandona el enfoque de análisis de red.
Probablemente haya algunas suposiciones razonables que pueda hacer que simplifiquen enormemente su tarea. Sin embargo, para hacer el mejor uso de ellos, probablemente necesites una mayor comodidad con la programación enrollada que suena como la que tienes.
En primer lugar, es una apuesta segura que el cifrado que están utilizando se divida en una de tres categorías:
- Ninguna
- Caseoso
- Mucho mejor de lo que es probable que se rompa
Con las probabilidades de que el medio caso sea muy bajo.
A continuación, es una apuesta segura que los paquetes se cifran / descifran cerca del borde del programa (justo cuando entran, justo antes de que se apaguen) y que el cuerpo del juego los trata en forma descifrada.
Finalmente, el protocolo que están usando probablemente consiste en cualquiera
- ascii con bloques de datos
- binario goo
Así que haga un pequeño paquete oliendo con un juego de cartas en modo promiscuo para ascii no encriptado. Si ves algo, genial, estás por delante del juego. Pero si no abandona toda la idea de tapping-the-line y, en su lugar, comienza a seguir el código a medida que regresa de los datos de envío al romperse y avanzar con un depurador. La figura de la capa más externa o tres será material de red estándar, luego vendrá la capa de cifrado, y más allá de eso, la gran cantidad de material que trata el protocolo sin encriptar.
Debería poder llegar tan lejos en una hora si hace calor, un fin de semana si es razonablemente hábil, motivado y diligente, y nunca si no tiene esperanza. Pero es posible en principio (y sin duda mucho más fácil en la práctica) hacerlo de esta manera.
Una vez que llegas a donde aparece algo que parece una sustancia pegajosa sin encriptar, se enreda y se pierde la forma mungled, entonces comienza a preocuparte por lo que significa.
- MarkusQ
Parece que no hay encriptación, por lo que puedes hacer un acercamiento de red.
Un buen lugar para comenzar sería encontrar los ID del paquete: la mayoría de las veces, algo cerca del frente del paquete va a ser un ID del tipo del paquete. Por ejemplo, mover podría ser 1, disparar disparar podría ser "2", el chat podría ser "4".
Puede escribir su propio proxy que escucha en un puerto para que su juego se conecte, y luego se conecta al servidor. Puede hacer que las teclas presionen los comandos de apagado del proxy, o puede hacer que su proxy escriba la información de depuración para ayudarlo a llegar más lejos.
(He escrito un bot para un juego en línea en PHP, de todas las cosas).