TRANSFORMERS: Forged to Fight es un juego de combate en 3D donde tomas el control de algunos de los soldados más carismáticos del universo Transformers. Hablamos de grandes nombres como Optimus Prime, Megatron, Bumblebee, Ratchet, Soundwave y Grindor, ni más ni menos. Sí, leíste bien. Tus personajes favoritos de cualquier Transformers
Este paquete contiene un arranque offline funcional de Transformers: Forged to Fight, además de todas las herramientas, parches y notas de ingeniería inversa utilizadas para lograrlo. Está pensado para que lo tome alguien que tenga el tiempo y la energía para dar el siguiente paso, mucho más grande, que es reconstruir el contenido del lado del servidor del juego desde cero. Todo aquí está documentado para que no tengas que empezar desde cero como lo hice yo.
Lee este archivo completo antes de tocar nada. La sección "Gotchas" en particular te ahorrará días.
El juego arranca completamente offline y llega a su pantalla de inicio interactiva real sin ningún servidor en vivo. Desde la pantalla de inicio, los menús navegan sin fallos: la base, la lista de bots (con un bot presente en la cuenta), el selector de modo de combate, la pantalla de cristales y las ventanas emergentes y consejos habituales. El flujo completo de inicio de sesión se completa, cada subsistema en línea se conecta y se superan las puertas de la primera experiencia y el tutorial. La pelea introductoria con guion (Optimus vs Starscream) incluso avanza lo suficiente como para comenzar a cargar la batalla, y los modelos 3D de los personajes se renderizan y animan.
Esta era la parte difícil y está resuelta. El cliente en sí está vivo nuevamente offline.
El juego real no funciona. La historia no muestra misiones y las peleas no pueden cargarse por completo. Esto no es un error y no es algo que un parche pueda arreglar.
Forged to Fight era completamente autoritario del servidor. La aplicación en el teléfono es esencialmente una pantalla con controles. Casi nada del juego vivía en la aplicación. Cada misión, cada pelea, cada alineación enemiga, las estadísticas y habilidades de toda la lista, la economía y todo el equilibrio vivían en los servidores de Kabam y se transmitían al dispositivo en cada sesión. Cuando los servidores se cerraron a principios de 2020, esa base de datos de contenido se fue con ellos y nunca se publicó ni archivó públicamente en ningún lugar al que yo pueda acceder.
Por lo tanto, la situación se divide claramente en dos. El arte y el audio sobrevivieron porque se envían dentro de la aplicación (consulta re_notes/ASSET_INVENTORY.txt). Cada personaje es un paquete de activos completo de Unity que contiene el modelo, las texturas, el esqueleto, los clips de animación, los controladores de animación, los efectos y el audio. Los entornos, edificios, interfaz de usuario, retratos, escenas cinemáticas y diálogos también están allí. Lo que no sobrevivió son los datos que le decían al juego qué activos usar, cómo ensamblarlos en una pelea o misión y cuáles eran realmente los números de cada bot. Todas las piezas están presentes. Simplemente no queda nada que sepa cómo unirlas. Reconstruir eso es el único trabajo que queda.
Hay cuatro partes móviles. Juntas hacen que el juego sin modificar piense que está hablando con Kabam.
Parches binarios nativos. El juego es Unity IL2CPP, por lo que la lógica vive en una biblioteca ARM compilada, libil2cpp.so, no en archivos de script editables. patches/patch_il2cpp.py reescribe seis funciones en esa biblioteca para superar las comprobaciones de servidor muerto: derrota dos rutas de fijación de certificados para que se acepte nuestro propio certificado TLS, obliga a que se ejecute el bloque de registro del administrador aunque la configuración en vivo sea nula, permite que el inicio de sesión tenga éxito con nuestra sesión de dispositivo local y silencia los errores fatales del subsistema que de otro modo mostrarían el diálogo de "no se pudo iniciar sesión". También reinyecta una sola entrada de dependencia (consulta la sección Gotchas) para que el hook de tiempo de ejecución realmente se cargue. La salida es libil2cpp.patched.so.
Un servidor Sparx falso. server/fakeserver.py actúa como el backend de Kabam. Escucha en TLS 443 y HTTP plano 80 y responde a las llamadas API del juego. Las respuestas predefinidas están en server/responses/, un archivo por endpoint, nombrado por método y ruta, por ejemplo GET__account_data.json. Algunos endpoints se responden dinámicamente en código en lugar de desde un archivo, porque el juego espera que repitan valores de la solicitud (los endpoints del tutorial y el endpoint de detalle del héroe). El sobre de respuesta es {"error":null,"result": ...}. Ten en cuenta que dentro de los payloads de error de Sparx, el campo se escribe err, no error. Ese detalle importa y es fácil pasarlo por alto.
Un hook nativo en tiempo de ejecución. tools/nativehook/ construye libdothook.so, una biblioteca pequeña que se carga en el juego al inicio y registra cada clave de datos que el juego lee, además de un par de empujones de comportamiento específicos. Este es el bucle de retroalimentación que hizo posible todo lo demás: te dice exactamente lo que el juego está pidiendo para que puedas sintetizar una respuesta y verificarla. Es un hook inline de sobrescritura de bytes puro instalado antes de la ejecución, porque la herramienta normal para esto (Frida) falla bajo la capa de traducción ARM del emulador.
Cableado del dispositivo. El emulador debe enviar los dominios de Kabam a la PC y confiar en el certificado falso. tools/provision_ldplayer.sh hace esto de una sola vez: envía la biblioteca parcheada y el hook, redirige los nombres de host de Kabam a la dirección LAN de la PC mediante el archivo hosts, monta la CA falsa en el almacén de confianza del sistema y relaja SELinux. Ejecútalo después de cada reinicio del emulador, porque esos montajes no sobreviven a un reinicio.
El flujo de datos en tiempo de ejecución es: el juego realiza una llamada HTTPS a un dominio de Kabam, el archivo hosts lo envía a la PC, el servidor falso responde con una respuesta de server/responses/, la biblioteca parcheada acepta el certificado y la respuesta, y el hook registra lo que se leyó. Ese bucle es cómo se levantó cada pantalla en esta compilación.