Gemme Jagex’s Vertigo
Oprindeligt postet den 2019-04-19.
Denne uge havde jeg til formål at arbejde på den faktiske kodebase for FPL og tilføje en ny funktion - en Save manager til at sikkerhedskopiere og gendanne filer. Som jeg nævnte sidste gang, er applikationen bygget på Electron ved hjælp af Typescript og gearing af brugen af React til levering af komponentbaserede moduler.
Opsætning af FPL var meget behageligt - det blev primært bygget af obelisk, den største mekaniker på Flashpoint-teamet. Jeg vil fortsat nævne det faktum, at jeg er en misbrugt Windows-udvikler indtil slutningen af tiden - FPL blev primært lavet til Windows, så udviklingsmiljøet var meget mere gunstigt.
Nogle problemer, der opstod:
- Spillene dukkede ikke op nogen steder. Dette blev løst ved at gå ind i configs og pege på en forbrugerinstallation af Flashpoint (Ultimate eller Infinity)
- Billederne og afspilningslisterne dukkede ikke op.
Måtte ændre sig
config.json
Til dette:
"imageFolderPath": "Images",
"jsonFolderPath": "Data",
"logoFolderPath": "Logos",
"playlistFolderPath": "Playlists"
- Omdirigering dukkede ikke op
Rettet ved kopiering
services.json
ind i forbrugerenFlashpoint’sData
folder
Sidesporing fra Save Manager
Den interne dokumentation er stadig et igangværende arbejde. Så det var nødvendigt at gøre en masse indledninger og spørgsmålstegn.
Da jeg løste buildproblemer, tog jeg en pause og fortsatte med at gøre nogle kurater. Jeg har ikke nævnt alle mine kurationer (siden Pebble’s Quarry har jeg også genopstået Postopia-eventyret og arbejdede sammen med en FPL-kollega for at gendanne flere af dem). Jeg forsøgte også at genoplive Waffle-drengens bjergeventyr, berømt tabt i vores samfund. Det lykkedes mig delvist at genskabe den manglende XML (der indlæser de separate Flash SWF’er korrekt) for at spille det første niveau, men ud over det kunne jeg ikke løse det.
Så jeg besluttede at sammenstille et gammelt Java-applet-spil fra freearcade.com, som jeg plejede at afspille om dagen. Det var et spil kaldet Vertigo, fra 1999, lavet af Andrew Gower fra RuneScape-berømmelse. Jeg antog fejlagtigt, at det ville være så let som de få, jeg gjorde efter min første.
Problem:
Få Vertigo til at arbejde på Flashpoint, da det ikke længere fungerer i browseren.
Problemer (hvis du vil have løsningen, skal du rulle ned):
- At gå den traditionelle rute til opsætning af filerne endte uden Flashpoint-omdirigeringsklager. Jeg havde brug for noget for at fejle, så jeg ville forstå problemet, så jeg gik direkte til JDK og brugte appletviewer.exe direkte med min indlejrede html- og klassefil. Det kastede mig denne fejl:
java.lang.ClassFormatError: Name index 0 in LocalVariableTable has bad constant type in class file vertigo
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at sun.applet.AppletClassLoader.findClass(AppletClassLoader.java:217)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.applet.AppletClassLoader.loadClass(AppletClassLoader.java:152)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at sun.applet.AppletClassLoader.loadCode(AppletClassLoader.java:626)
at sun.applet.AppletPanel.createApplet(AppletPanel.java:799)
at sun.applet.AppletPanel.runLoader(AppletPanel.java:728)
at sun.applet.AppletPanel.run(AppletPanel.java:378)
at java.lang.Thread.run(Thread.java:748)
Her begyndte min omvej - alt, hvad jeg læste online, nævnte, at det var inkompatibilitet mellem en ældre version af Java versus en nyere. Ved hjælp af denne kommando i Bash kan jeg hente hovedversionen (som fortæller brugeren, hvilken JDK-version, der blev brugt til at kompilere filen):
$ od --format=d1 vertigo.class -j 7 -N 1
0000007 45 0000010
Mellemnummeret (45) angav versionen. Her er en tabel over JDK-versioner og deres respektive større versioner:
Java Version | Major Version |
---|---|
1.1 | 45 |
1.2 | 46 |
1.3 | 47 |
1.4 | 48 |
5 | 49 |
6 | 50 |
7 | 51 |
8 | 52 |
9 | 53 |
10 | 54 |
11 | 55 |
Dette spil blev helt klart lavet med en af de tidligste mulige JDK’er - 1.1.
- Min tilgang gik sådan (som var forkert) - DownloadJDK 1.1.X version fra Oracle arkiver.
- Viser det originale JDK var et 16-bit-program, så installationen blev blokeret af denne fejl:
Ikke-understøttet 16-Bit Ansøgning
.
Det var da jeg lærte, at Win10 x64-arkitekturen faldt 16 bit-support fuldstændigt (en anden indikation af, hvordan gamle programmer mister support efter nogen tid). Så: *Spundet op en Windows 7 x32 virtuel maskine - Installeret det med succes der
- Sendte de udpakkede filer tilbage til min vært
- Ændret startJava.bat placeret i Flashpoint for at pege på den nye, gamle JDK og kørte spillet
- Endelig kunne jeg få nyttige GET-anmodninger om aktiver via omdirigering! Jeg indsamlede filerne på den måde.
- Et problem med dårlig klassefilformat dukkede op - tilsyneladende blev wrapper.class lavet med større version 48 i stedet for 45, så jeg jagtede efter filerne igen via Wayback
- Endelig efter alt dette hårde arbejde var dette resultatet:
Det var at kaste en række uden for rammerne og trække de forkerte aktiver ind.
- Den eneste kundeemne, jeg havde der, var efter at have brugt javap til at dekompilere klassefilerne, der var fejl med kodningen, og det gav mig nonsens unicode
- På dette tidspunkt opgav jeg - at lære gammel kodning til at oversætte koden til noget, der var fornuftigt, var den første kardinal synd af fejlfindere, der blev alt for kompliceret til en løsning
Opløsning:
- Gav op og spurgte Java-eksperterne om Flashpoint-uoverensstemmelsen
- nosamu pegede mig på Strawrat, en dygtig Java-ekspert, der havde reverse engineered Java-applets før
- Inden for ti minutter var problemet, der havde plaget mig i flere dage, løst
I stedet begyndte Strawrat ved det allerførste problem helt tilbage i begyndelsen -
java.lang.ClassFormatError: Name index 0 in LocalVariableTable has bad constant type in class file vertigo
Sådan gjorde de det:
- Brug en Java .class-fileditor - Dirty Joe Specielt denne ene går ikke ned med virkelig gamle Java-klassefiler
- Åbn Vertigo aktivklasser i programmet
- Klik på fanen Metoder, det viser en liste over metoder i den klasse. Den første skal vælges.
- Klik på kode i panelet til højre, der siger Attributter. Det skulle åbne et nyt vindue, der har en masse ting (Max Stack, Attributter, Undtagelser osv.)
- Højreklik på LocalVariableTable og vælg Delete Attribute
- Luk dette vindue, og gem klassefilen
Her er en demonstration:
TilsyneladendeLocalVariableTable
i klassefilen blev brudt og skulle slettes - den betragtes som valgfri, lignerLineNumberTable
.
Dette svar var så vidt ud over min ekspertise, at jeg vidste, at jeg aldrig ville have fundet det ud på egen hånd.
Jeg er meget taknemmelig overfor FPL-samfundet for deres ekspertise og guide-lignende reverse-engineering.
Du kan se spillet i FPL 6.0 eller download Vertigo her!