Análisis del protocolo World of Tanks

Hola, hoy analizaremos el protocolo de tanques (móvil)

El autor no se hace responsable del material proporcionado en este artículo, todo lo que leíste o viste fue en un sueño. Las herramientas escritas durante el proceso de análisis del protocolo nunca se darán a conocer al público.





Las herramientas que necesitamos

  1. x64 dbg





  2. Cortador (Radare2)





  3. C ++ 4. WireShark





Inicio (Protocolo)

Comencé el análisis definiendo el protocolo que usa el juego para la comunicación (TCP / UDP).





Abrimos procmon (intentamos autorizar en el cliente del juego).





La actividad de la red muestra que el juego usa el protocolo UDP (en el momento de la autorización, seguro) noté paquetes de 12 bytes (mensajes ping / pong), pero lo más interesante es un paquete de 273 bytes y una respuesta de 30 bytes. puedo decir con seguridad que este paquete es un paquete. Después de un pequeño estudio del directorio del juego, encontré el archivo "loginapp_wot.pubkey". El contenido de este archivo es la clave pública RSA-2048 (pero más sobre eso más adelante) Ahora necesitamos para mirar el contenido de estos paquetes





Paquetes (cifrado asimétrico)

Open WireShark: ponga un filtro en el protocolo UDP e intente autorizar.









( ) (273 ) . , :









(  1-2 ) :





HEADER => [0x01, 0x00, 0x00, 0x04, 0x01, 0x31, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x02]
BODY => [? ? ? ? ?]
FOOTER => [0x02, 0x00]
      
      







 256  * 8 = 2048  ( RSA-2048)





x64dbg 2 ws2_32 [send / sendTo]





( ) . call stack,  0x100:





Json .







body .





?

(RSA-2048) .





.





 ( )

, .













 (caller)

.





Empalme  es un método para interceptar funciones API cambiando el código de la función de destino. En su lugar, se inserta una transición a una función que define el programador.





Primero, necesitamos llamar a la función de descifrado original.

Luego lee [ptr * dest]





Decidí escribir mi Dll en C ++ para hacer un trampolín de la función

No te olvides de observar la convención al llamar (__cdecl / __fastcall / __thiscall)





  1. Obtenemos la dirección de la función a través de GetModuleBaseAddress + RVA





  2. Funciones de empalme





Salir

Inyecte dll en el proceso del juego (usé CE).

Autorizamos el juego y disfrutamos.












All Articles