
TRANSFORMERS: Forged to Fight ist ein 3D-Kampfspiel, in dem du einige der charismatischsten Kämpfer direkt aus dem Transformers-Universum übernimmst. Wir sprechen hier von großen Namen wie Optimus Prime, Megatron, Bumblebee, Ratchet, Soundwave und Grindor – nicht weniger. Ja, du hast richtig gelesen. Deine Lieblingsfiguren aus jedem Transformers
Dieses Paket enthält einen funktionierenden Offline-Start von Transformers: Forged to Fight sowie jedes Werkzeug, jeden Patch und jede Reverse-Engineering-Notiz, die verwendet wurden, um dorthin zu gelangen. Es ist gedacht für jemanden, der die Zeit und Energie hat, den nächsten und viel größeren Schritt zu tun: den serverseitigen Inhalt des Spiels von Grund auf neu aufzubauen. Alles hier ist dokumentiert, damit Sie nicht bei Null anfangen müssen, so wie ich es getan habe.
Lesen Sie diese gesamte Datei, bevor Sie etwas anfassen. Insbesondere der Abschnitt „Gotchas“ wird Ihnen Tage ersparen.
Das Spiel startet vollständig offline und erreicht seinen echten interaktiven Startbildschirm, ohne dass Live-Server vorhanden sind. Vom Startbildschirm aus navigieren die Menüs ohne Absturz: die Basis, das Bot-Roster (mit einem eigenen Bot im Konto), die Kampfmodusauswahl, der Kristallbildschirm und die üblichen Popups und Tipps. Der vollständige Anmeldevorgang wird abgeschlossen, jedes Online-Subsystem verbindet sich, und die Ersterfahrungs- und Tutorial-Gates werden überschritten. Der geskriptete Einführungskampf (Optimus vs. Starscream) kommt sogar weit genug, um mit dem Laden des Kampfes zu beginnen, und die 3D-Charaktermodelle werden gerendert und animiert.
Das war der schwierige Teil und er ist gelöst. Der Client selbst lebt offline wieder.
Das eigentliche Gameplay funktioniert nicht. Die Story zeigt keine Missionen, und Kämpfe können nicht vollständig geladen werden. Das ist kein Fehler und nichts, was ein Patch beheben kann.
Forged to Fight war vollständig serverautoritativ. Die App auf dem Telefon ist im Wesentlichen ein Bildschirm mit Steuerelementen. Fast nichts vom Spiel lebte in der App. Jede Mission, jeder Kampf, jede Gegneraufstellung, die gesamten Statistiken und Fähigkeiten des Rosters, die Wirtschaft und das gesamte Gleichgewicht lebten auf Kabams Servern und wurden jede Sitzung auf das Gerät gestreamt. Als die Server Anfang 2020 abgeschaltet wurden, verschwand diese Inhaltsdatenbank mit ihnen und wurde nie veröffentlicht oder öffentlich archiviert, soweit ich es erreichen kann.
Die Situation teilt sich also sauber in zwei Teile. Die Kunst und der Ton haben überlebt, weil sie in der App ausgeliefert werden (siehe re_notes/ASSET_INVENTORY.txt). Jeder Charakter ist ein vollständiges Unity-Asset-Bundle, das das Modell, die Texturen, das Rig, die Animationsclips, die Animator-Controller, Effekte und Audio enthält. Die Umgebungen, Gebäude, UI, Porträts, Zwischensequenzen und Dialoge sind ebenfalls alle vorhanden. Was nicht überlebt hat, sind die Daten, die dem Spiel sagten, welche dieser Assets verwendet werden sollen, wie sie zu einem Kampf oder einer Mission zusammengesetzt werden sollen und wie die Zahlen jedes Bots tatsächlich waren. Alle Teile sind vorhanden. Es gibt nur nichts mehr, das weiß, wie man sie zusammensetzt. Das wieder aufzubauen ist die gesamte verbleibende Aufgabe.
Es gibt vier bewegliche Teile. Zusammen lassen sie das unveränderte Spiel glauben, es spreche mit Kabam.
Native Binär-Patches. Das Spiel ist Unity IL2CPP, daher lebt die Logik in einer kompilierten ARM-Bibliothek, libil2cpp.so, nicht in bearbeitbaren Skriptdateien. patches/patch_il2cpp.py schreibt sechs Funktionen in dieser Bibliothek um, um an den toten Serverprüfungen vorbeizukommen: Es besiegt zwei Zertifikat-Pinning-Pfade, sodass unser eigenes TLS-Zertifikat akzeptiert wird, erzwingt, dass der Manager-Registrierungsblock ausgeführt wird, obwohl die Live-Konfiguration null ist, lässt die Anmeldung mit unserer lokalen Gerätesitzung erfolgreich sein und unterdrückt die fatalen Subsystem-Fehler, die sonst den Dialog „Anmeldung fehlgeschlagen“ einblenden würden. Es fügt auch einen einzelnen Abhängigkeitseintrag wieder ein (siehe den Abschnitt Gotchas), sodass der Runtime-Hook tatsächlich geladen wird. Die Ausgabe ist libil2cpp.patched.so.
Ein gefakter Sparx-Server. server/fakeserver.py vertritt Kabams Backend. Es lauscht auf TLS 443 und einfachem HTTP 80 und beantwortet die API-Aufrufe des Spiels. Vorgefertigte Antworten befinden sich in server/responses/, eine Datei pro Endpunkt, benannt nach Methode und Pfad, zum Beispiel GET__account_data.json. Einige Endpunkte werden dynamisch im Code beantwortet, anstatt aus einer Datei, weil das Spiel erwartet, dass sie Werte aus der Anfrage widergeben (die Tutorial-Endpunkte und der Helden-Detail-Endpunkt). Das Antwortenvelope ist {"error":null,"result": ...}. Beachten Sie, dass in Sparx-Fehlerdaten das Feld err geschrieben wird, nicht error. Dieses Detail ist wichtig und leicht zu übersehen.
Ein nativer Runtime-Hook. tools/nativehook/ baut libdothook.so, eine kleine Bibliothek, die beim Start in das Spiel geladen wird und jeden Datenkey protokolliert, den das Spiel liest, plus ein paar gezielte Verhaltensanpassungen. Dies ist die Rückkopplungsschleife, die alles andere möglich gemacht hat: Sie sagt Ihnen genau, wonach das Spiel fragt, sodass Sie eine Antwort synthetisieren und überprüfen können. Es handelt sich um einen reinen Byte-Overwrite-Inline-Hook, der vor der Ausführung installiert wird, da das normale Werkzeug dafür (Frida) unter der ARM-Übersetzungsschicht des Emulators abstürzt.
Geräteverkabelung. Der Emulator muss Kabams Domänen an den PC senden und dem gefälschten Zertifikat vertrauen. tools/provision_ldplayer.sh erledigt dies auf einmal: Es schiebt die gepatchte Bibliothek und den Hook, leitet die Kabam-Hostnamen über die Hosts-Datei auf die LAN-Adresse des PCs um, mountet die gefälschte CA in den Systemvertrauensspeicher und lockert SELinux. Führen Sie es nach jedem Emulator-Neustart aus, da diese Mounts einen Neustart nicht überleben.
Der Datenfluss zur Laufzeit ist: Das Spiel tätigt einen HTTPS-Aufruf an eine Kabam-Domäne, die Hosts-Datei leitet ihn an den PC weiter, der gefälschte Server antwortet mit einer Antwort aus server/responses/, die gepatchte Bibliothek akzeptiert das Zertifikat und die Antwort, und der Hook protokolliert, was gelesen wurde. Diese Schleife ist, wie jeder Bildschirm in diesem Build zum Laufen gebracht wurde.
README.md diese Datei
TECHNICAL_NOTES.md die tiefere technische Referenz: Patches, wiederhergestellte Datenformen, Erkenntnisse
patches/
patch_il2cpp.py die sechs nativen Patches plus die erneute Einbindung der Abhängigkeit
disasm_fn.py Hilfsprogramm: Disassemblieren einer Funktion an einem Offset
find_callers.py Hilfsprogramm: Aufrufer einer Funktion finden
find_str_ref.py Hilfsprogramm: Referenzen auf einen String finden
server/
fakeserver.py der gefälschte Sparx-Server
gen_certs.sh TLS-Zertifikat und CA regenerieren (dies ausführen, siehe unten)
setup_device.sh geräteseitige Netzwerk- und Vertrauenseinrichtung als Referenz
iterate.sh schnelle Neustart- und Erfassungsschleife
responses/ eine JSON-Datei pro Endpunkt, den das Spiel aufruft
tools/
provision_ldplayer.sh einmalige Neubereitstellung des Emulators in den funktionierenden Zustand
setup_arm64.sh Toolchain-Einrichtungsnotizen
decompile_targets.py Ghidra Headless-Decompiler an ausgewählten Offsets steuern
find_xrefs.py Kreuzreferenzsuche über die Binärdatei
apply_labels.py IL2CPP-Symbolbezeichnungen anwenden
light_analyze.py leichte statische Analyse-Helfer
frida_attach.py Frida-Helfer (zum Nachschlagen aufbewahrt, siehe libnb-Hinweis)
frida_run.py
hook_dot.js
nativehook/
hook.c Quelle von libdothook.so, der Runtime-Hook
libdothook.so vorgebauter Hook, arm64
deploy.sh Hook bauen und bereitstellen
relaunch_and_capture.sh Spiel neu starten und Logs erfassen
hook/dothook.c frühere Hook-Variante, zum Nachschlagen aufbewahrt
re_notes/
dump.cs der vollständige IL2CPP-Dump: jede Klasse, Methode und jedes Feld im Spiel
decomp_out.c dekompilierte Körper wichtiger Funktionen
decompile_targets.txt die Offsets, die es wert sind, dekompiliert zu werden
ASSET_INVENTORY.txt welche Kunst und Audio bereits in der App enthalten sind
re_notes/dump.cs ist die mit Abstand wertvollste Datei für die verbleibende Arbeit. Es ist das vollständige Typmodell des Spiels: jede Klasse, jede Methode und entscheidend jedes Datenfeld, das der Client vom Server liest. Es ist Ihre Karte der gesamten Backend-API. Wenn Sie wissen müssen, wie eine Antwort aussehen soll, finden Sie die Antwort darin.
Diese wurden absichtlich weggelassen, weil sie groß, urheberrechtlich geschützt oder geheim sind, oder weil Sie Ihre eigenen generieren sollten.
com.kabam.bigrobot, Version 9.2.0). Sie ist etwa 800 MB groß. Besorgen Sie sich Ihre eigene Kopie. Der Paketname und die Version sind in TECHNICAL_NOTES.md.libil2cpp.so und die Spiel-Assets. Beide stammen direkt aus der APK. Entpacken Sie die APK, die Bibliothek befindet sich unter lib/arm64-v8a/, die Assets unter assets/.server/gen_certs.sh aus, um Ihr eigenes Paar zu erstellen, und richten Sie dann den Gerätevertrauensspeicher auf die neue CA.patches/patch_il2cpp.py gegen die originale libil2cpp.so aus der APK aus.re_notes/dump.cs aus der Bibliothek und den globalen Metadaten der APK erstellt.Sie benötigen die APK, installiert auf einem ARM-Übersetzungs-fähigen Emulator (LDPlayer 9 wurde verwendet, mit Root und beschreibbarem System), Python auf dem PC und die Elemente aus dem obigen Abschnitt.
bash server/gen_certs.sh.python patches/patch_il2cpp.py path/to/original/libil2cpp.so --apply.tools/nativehook/deploy.sh.python server/fakeserver.py. Er muss vom Emulator aus auf den Ports 443 und 80 erreichbar sein.bash tools/provision_ldplayer.sh <Ihre-PC-LAN-IP>. Führen Sie dies nach jedem Emulator-Neustart erneut aus.Wenn es bei der Anmeldung hängt, überprüfen Sie als erstes den allerersten Punkt im Abschnitt Gotchas.
Dies sind diejenigen, die mich Stunden gekostet haben. Sie sind niedergeschrieben, damit sie Sie nicht dasselbe kosten.
libdothook.so verweist. Die genauen Bytes und Offsets sind im Patch-Skript und in TECHNICAL_NOTES.md dokumentiert.provision_ldplayer.sh erneut ausführen, sonst verbindet sich nichts.err, nicht error. Die Verwendung des falschen erzeugt Antworten, die der Client stillschweigend ignoriert oder falsch behandelt.Dies ist die eigentliche Arbeit, und sie ist umfangreich. Hier ist ihre Form und wo Sie beginnen sollten.
Das Ziel ist es, von Hand den serverseitigen Inhalt nachzubilden, der früher an den Client gestreamt wurde: die Quests und Missionen, die Karten und ihre Gegneraufstellungen, das vollständige Roster mit den Statistiken und Fähigkeiten jedes Bots, die Kampfformeln und die Wirtschaft. Nichts davon existiert mehr, daher muss alles von Grund auf neu erstellt werden, in der genauen Form, die der Client erwartet.
Die Methode, die funktioniert, ist die Schleife, um die dieses Projekt herum aufgebaut ist. Führen Sie das Spiel mit dem angehängten Hook aus. Der Hook protokolliert jeden Key, den der Client liest. Wenn der Client nach etwas fragt, das Sie nicht bereitgestellt haben, sehen Sie genau, was er wollte. Sie synthetisieren dann eine Antwort in der richtigen Form, legen sie in server/responses/ ab oder fügen sie dem dynamischen Handler in fakeserver.py hinzu, starten neu und überprüfen, ob der Client sie akzeptiert und fortfährt. Wiederholen. Jeder Bildschirm im aktuellen Build wurde auf diese genaue Weise zum Laufen gebracht. re_notes/dump.cs sagt Ihnen die Form jeder Struktur, bevor Sie überhaupt laufen, weil es jedes Feld auflistet, das der Client liest.
Eine vernünftige Reihenfolge, um es anzugehen:
decompile_targets.py) und lesen Sie die genauen Felder ab.ASSET_INVENTORY.txt aufgeführten Bundles, sodass Sie nur Zahlen und Fähigkeitsdefinitionen erstellen, keine Assets.TECHNICAL_NOTES.md für die Schlüssel.Seien Sie realistisch hinsichtlich des Umfangs. Selbst bei Spielen, bei denen Fans die Live-Serverdaten vor der Abschaltung gespeichert haben, ist das Aufsetzen eines privaten Servers ein langes Projekt. Hier gibt es keine gespeicherten Daten, von denen man ausgehen kann, also muss jede Zahl und jede Fähigkeit erforscht oder neu erfunden und dann gegen den Client verifiziert werden. Dies ist eine Mehrpersonen-, mehrjährige Anstrengung, wenn das Ziel das echte Spiel ist. Das heißt, der Weg ist kein Geheimnis mehr. Der Start ist gelöst, die Rückkopplungsschleife existiert, das Typmodell ist ausgelesen und die Assets sind intakt. Was bleibt, ist eine sehr große Menge sorgfältiger Datenrekonstruktion, nicht mehr Reverse Engineering des Unbekannten.
Beginnen Sie mit TECHNICAL_NOTES.md. Es ist die tiefere technische Referenz, mit den genauen Patches, den wiederhergestellten Datenformen und den spezifischen Erkenntnissen, detaillierter als diese README. Führen Sie dann die Schleife aus.
Viel Glück. Es ist jetzt eine echte Maschine. Sie muss nur noch ihren Inhalt wieder aufbauen.