Mal was zum technischen
Alle drei Spiele haben den Segmentierungsansatz bekommen, wonach man das Spiel erst in Segmente/Einheiten zerlegt und dann jeweils die Funktionen darin entschlüsselt und am Ende wieder zusammensetzt, um dasselbe (!) Ergebnis wie die Original-Exe zu bekommen.
Schicksalsklinge (recht "einfach" dank Henne und dem gesamten Team im Projekt)
Die Kette lief so:
1. BrightEyes Projekt anschauen, wie das überhaupt geht, aus einer .exe -> C-Code zu kriegen. Dabei half mir Claude.
2. Das Projekt 1:1 nach-umsetzen und ... den C-Code 100% abschließend 100% bytegleich machen. Das war der allerletzte 0,0001% Schritt. Erledigt. Auch mit Claude.
3. Claude hat dafür die Schicksalsklinge selber gespielt, um zu prüfen, was wo hakt, emuliert in sich selber (amüsant anzusehen).
4. Dann war die Schicksalsklinge fertig.
5. Crystals DSA Forum nach Bugs durchforsten lassen und Patches (Claude) -> alles einspielen.
6. Lösungsbuch nutzen für Zauber und beabsichtigter Wirkung (Claude).
Sternenschweif (mittel), nicht optimierter Code, freundlicher Compiler, freundliche .exe
1. Hier war der Vorteil Schicksalsklinge schon zu haben, aber die .exe war eine andere und dann hat das alles doch relativ lange gedauert in Rechenzeit.
2. Gelöst mit Claude Opus und Fable.
3. Rechendauer: Etwa 1.5 Tage. Ziemlich viel Kontingent. Aber es ging straight forward, bis auf ein paar Entscheidungen, die zwischen drin getroffen werden mussten.
4. Anforderung: Auch hier lesbarer Quelltext in vernünftig geschrieben.
5. Lösungsbuch half beim Patchen.
Schatten über Riva (mittel-schwer), watcom compiler 10.6 optimierter Quellcode, schwer zu entschlüsseln in C++
1. Standardweg wie bei Sternenschweif führte zu 5% Lösungsrekonstruktion.
2. Zusätzlich dann Ghidra eingestellt (ein NSA entwickeltes frei verfügbares Programm, baut eine Art.. ersten Versuch auf, recht cool).
3. Dann ging das Drama los. Extrem zähe Rekonstruktion per K.I. (Claude) (Tage (!) an Rechendauer, geht seit ~10 Tagen)
4. Da steh ich im Moment ... bei etwa 70% Code-Rekonstruktion und ~ 90% der Funktionen. Es geht langsam voran.
Mein Weg
Ich versteh das Ding als Puzzle. Der unbekannte neue Quellcode ist ein Puzzlespiel, was wenn man es richtig baut, so aussieht wie das Original.
Wir haben das Glück, dass wir bestimmte Teile des Puzzles selber gestalten dürfen. Z.B. die Technik um die Farbe zu kreieren.
Einfach gesagt: Es gibt viele Quellcodes die zum selben Ergebnis führen :-)
Strategie: Zuerst die Ränder und Ecken.
Ränder und Ecken: Das sind in der Analogie Compiler, Einheiten, Funktionen, wo immer es geht.
Teile: Funktionen im Quellcode und deren Berandungen (Einheiten) müssen auch so passen wie im Originalpuzzle.
Farbe: Der Farbverlauf eines Teils ist die Funktion, man kann viele verschiedene Pinsel nehmen, aber am Ende sieht das Bild so aus wie das Original.
Linker: die Puzzleteile (Funktionen, Einheiten) müssen auch in der richtigen Reihenfolge zusammengesetzt werden.
Puzzle-Gefüge: Funktionen, Einheiten und alles müssen im Code zusammen. Das Puzzle darf halt nirgends mies aussehen und muss dem Original entsprechen.
Es gibt sehr viele Wege den Quellcode von früher wieder herzustellen.
Von Außen nach Innen Puzzeln: Da wo Teile zusammenhängen, weiß man, wie es besser passt wenigstens an einer Seite, weil es bis dahin schon stimmt.
Hier kann man "compilieren" (Quelltext vergleich machen) wenn die Teile grundlegend richtig liegen kann man das, was schon gelegt wurde, 1:1 vergleichen mit dem Original, so weiß man auch im Kauderwelsch noch, ob richtig rückgerechnet wurde.
Ähnlichkeit nutzen: Manche Funktionen sind sehr ähnlich und haben gleiche Verläufe. Technische Kopie nutzen!
Anderes Licht: Viele Puzzles löst man in anderem Licht besser. Anderer Ansatz, Funktion völlig neu schreiben (es gibt VIELE Lösungen)
KI Umsetzung
- Koordinator Claude Opus, 5.5 auf High eingestellt sagt: welche Agenten (Claude Opus, Fable, Gemini Argon, Grok SuperHeavy, ChatGPT Astra) auf welche Weise an das Problem gehen.
- Hunter Prinzip: Funktionen mit kleinen Resten zur Lösung verteilen an starke Agenten.
- Große Funktionen: Zuletzt
- Eigene CPUs nutzen: Permutatoren mittels Mutator / Operator / Code-Anweisungen erstellen die mechanisch stumpfdoof alles durchprobieren, bis was passt. Grade bei Resten-
Anderes alles bei Riva bisher genutztes und taugliches
Demo-Spiel (andere Exe) nutzen: Ja, die Schatten über Riva Demo hat unoptimierten Quellcode mit sehr ähnlichen und sogar identischen Funktionen. Das hat viel geholfen.
Transplantate: Manche Funktionen kann man echt 1:1 transplantieren. Die sind sozusagen baugleich.
Familien: Funktionsfamilien, die ähnlich sind, findet man wieder. (Schwester-Funktionen).
Alles zusammenlegen (regelmäßig Compilieren und Linken): Regelmäßig prüfen, ob die gefundenen Lösungen an das restliche Puzzlespiel perfekt passen. Auf eigenem PC.
Richter einführen: Mehrstufiger "das ist wirklich identisch" Richter-Funktionen einführen, der nicht überlistet werden kann, außer durch Admin und KI. Auf eigenem PC.
Permutatoren/Mutatoren: Bäumchen-Wechsel-Dich für Funktionsreste und gucken, ob das Ergebnis am Ende passt. Sehr viele Varianten prüfen. Automatisch. Skript, Python auf eigenem PC.
Regelwerke: Muster-Regeln finden und in Mutatoren einbauen
Register-Wand-Knacker: Emuliere den Compiler und finde, welche Register es lösen, und finde den passenden C/C++ code, der die Registerkombination erzeugt damit rückwärts.
Zu den KI's bei mir (Laufen in WSL)
Claude Opus: Manager, Coder und Rundumschlag gegen alles
Claude Fable: Muster/Regel-Finder, alle paar hunderte gleiche Funktionen: Regeln finden lassen und in den Mutator mechanisch einbauen lassen
ChatGPT Codex mit Astra/Sol/Luna: Schwere Funktionen, mittlere Funktionen, kleine Reste.
Google Gemini Argon: Aufgabenerlediger
Grok: Aufgabenerlediger
Tja, das wars!
Und so läuft das die meiste Zeit.
Funktionspakete an KI's geben die das bitte einbauen, testen und sagen, ob es geklappt hat.
Wenn ja, Hurra, wenn nein.
Andere Ansätze, Regelwerke.
Nebenher den Mutatorhaufen laufen lassen ..
Und immer mal wieder neuschreiben wenn es nicht vorwärts geht.
Und am Ende steht hoffentlich eine bytegleiche .exe in echtem C++ :o) (und ASM, ist auch einiges an Original ASM bei, das wird nich extra umgewandelt).
Alle drei Spiele haben den Segmentierungsansatz bekommen, wonach man das Spiel erst in Segmente/Einheiten zerlegt und dann jeweils die Funktionen darin entschlüsselt und am Ende wieder zusammensetzt, um dasselbe (!) Ergebnis wie die Original-Exe zu bekommen.
Schicksalsklinge (recht "einfach" dank Henne und dem gesamten Team im Projekt)
Die Kette lief so:
1. BrightEyes Projekt anschauen, wie das überhaupt geht, aus einer .exe -> C-Code zu kriegen. Dabei half mir Claude.
2. Das Projekt 1:1 nach-umsetzen und ... den C-Code 100% abschließend 100% bytegleich machen. Das war der allerletzte 0,0001% Schritt. Erledigt. Auch mit Claude.
3. Claude hat dafür die Schicksalsklinge selber gespielt, um zu prüfen, was wo hakt, emuliert in sich selber (amüsant anzusehen).
4. Dann war die Schicksalsklinge fertig.
5. Crystals DSA Forum nach Bugs durchforsten lassen und Patches (Claude) -> alles einspielen.
6. Lösungsbuch nutzen für Zauber und beabsichtigter Wirkung (Claude).
Sternenschweif (mittel), nicht optimierter Code, freundlicher Compiler, freundliche .exe
1. Hier war der Vorteil Schicksalsklinge schon zu haben, aber die .exe war eine andere und dann hat das alles doch relativ lange gedauert in Rechenzeit.
2. Gelöst mit Claude Opus und Fable.
3. Rechendauer: Etwa 1.5 Tage. Ziemlich viel Kontingent. Aber es ging straight forward, bis auf ein paar Entscheidungen, die zwischen drin getroffen werden mussten.
4. Anforderung: Auch hier lesbarer Quelltext in vernünftig geschrieben.
5. Lösungsbuch half beim Patchen.
Schatten über Riva (mittel-schwer), watcom compiler 10.6 optimierter Quellcode, schwer zu entschlüsseln in C++
1. Standardweg wie bei Sternenschweif führte zu 5% Lösungsrekonstruktion.
2. Zusätzlich dann Ghidra eingestellt (ein NSA entwickeltes frei verfügbares Programm, baut eine Art.. ersten Versuch auf, recht cool).
3. Dann ging das Drama los. Extrem zähe Rekonstruktion per K.I. (Claude) (Tage (!) an Rechendauer, geht seit ~10 Tagen)
4. Da steh ich im Moment ... bei etwa 70% Code-Rekonstruktion und ~ 90% der Funktionen. Es geht langsam voran.
Mein Weg
Ich versteh das Ding als Puzzle. Der unbekannte neue Quellcode ist ein Puzzlespiel, was wenn man es richtig baut, so aussieht wie das Original.
Wir haben das Glück, dass wir bestimmte Teile des Puzzles selber gestalten dürfen. Z.B. die Technik um die Farbe zu kreieren.
Einfach gesagt: Es gibt viele Quellcodes die zum selben Ergebnis führen :-)
Strategie: Zuerst die Ränder und Ecken.
Ränder und Ecken: Das sind in der Analogie Compiler, Einheiten, Funktionen, wo immer es geht.
Teile: Funktionen im Quellcode und deren Berandungen (Einheiten) müssen auch so passen wie im Originalpuzzle.
Farbe: Der Farbverlauf eines Teils ist die Funktion, man kann viele verschiedene Pinsel nehmen, aber am Ende sieht das Bild so aus wie das Original.
Linker: die Puzzleteile (Funktionen, Einheiten) müssen auch in der richtigen Reihenfolge zusammengesetzt werden.
Puzzle-Gefüge: Funktionen, Einheiten und alles müssen im Code zusammen. Das Puzzle darf halt nirgends mies aussehen und muss dem Original entsprechen.
Es gibt sehr viele Wege den Quellcode von früher wieder herzustellen.
Von Außen nach Innen Puzzeln: Da wo Teile zusammenhängen, weiß man, wie es besser passt wenigstens an einer Seite, weil es bis dahin schon stimmt.
Hier kann man "compilieren" (Quelltext vergleich machen) wenn die Teile grundlegend richtig liegen kann man das, was schon gelegt wurde, 1:1 vergleichen mit dem Original, so weiß man auch im Kauderwelsch noch, ob richtig rückgerechnet wurde.
Ähnlichkeit nutzen: Manche Funktionen sind sehr ähnlich und haben gleiche Verläufe. Technische Kopie nutzen!
Anderes Licht: Viele Puzzles löst man in anderem Licht besser. Anderer Ansatz, Funktion völlig neu schreiben (es gibt VIELE Lösungen)
KI Umsetzung
- Koordinator Claude Opus, 5.5 auf High eingestellt sagt: welche Agenten (Claude Opus, Fable, Gemini Argon, Grok SuperHeavy, ChatGPT Astra) auf welche Weise an das Problem gehen.
- Hunter Prinzip: Funktionen mit kleinen Resten zur Lösung verteilen an starke Agenten.
- Große Funktionen: Zuletzt
- Eigene CPUs nutzen: Permutatoren mittels Mutator / Operator / Code-Anweisungen erstellen die mechanisch stumpfdoof alles durchprobieren, bis was passt. Grade bei Resten-
Anderes alles bei Riva bisher genutztes und taugliches
Demo-Spiel (andere Exe) nutzen: Ja, die Schatten über Riva Demo hat unoptimierten Quellcode mit sehr ähnlichen und sogar identischen Funktionen. Das hat viel geholfen.
Transplantate: Manche Funktionen kann man echt 1:1 transplantieren. Die sind sozusagen baugleich.
Familien: Funktionsfamilien, die ähnlich sind, findet man wieder. (Schwester-Funktionen).
Alles zusammenlegen (regelmäßig Compilieren und Linken): Regelmäßig prüfen, ob die gefundenen Lösungen an das restliche Puzzlespiel perfekt passen. Auf eigenem PC.
Richter einführen: Mehrstufiger "das ist wirklich identisch" Richter-Funktionen einführen, der nicht überlistet werden kann, außer durch Admin und KI. Auf eigenem PC.
Permutatoren/Mutatoren: Bäumchen-Wechsel-Dich für Funktionsreste und gucken, ob das Ergebnis am Ende passt. Sehr viele Varianten prüfen. Automatisch. Skript, Python auf eigenem PC.
Regelwerke: Muster-Regeln finden und in Mutatoren einbauen
Register-Wand-Knacker: Emuliere den Compiler und finde, welche Register es lösen, und finde den passenden C/C++ code, der die Registerkombination erzeugt damit rückwärts.
Zu den KI's bei mir (Laufen in WSL)
Claude Opus: Manager, Coder und Rundumschlag gegen alles
Claude Fable: Muster/Regel-Finder, alle paar hunderte gleiche Funktionen: Regeln finden lassen und in den Mutator mechanisch einbauen lassen
ChatGPT Codex mit Astra/Sol/Luna: Schwere Funktionen, mittlere Funktionen, kleine Reste.
Google Gemini Argon: Aufgabenerlediger
Grok: Aufgabenerlediger
Tja, das wars!
Und so läuft das die meiste Zeit.
Funktionspakete an KI's geben die das bitte einbauen, testen und sagen, ob es geklappt hat.
Wenn ja, Hurra, wenn nein.
Andere Ansätze, Regelwerke.
Nebenher den Mutatorhaufen laufen lassen ..
Und immer mal wieder neuschreiben wenn es nicht vorwärts geht.
Und am Ende steht hoffentlich eine bytegleiche .exe in echtem C++ :o) (und ASM, ist auch einiges an Original ASM bei, das wird nich extra umgewandelt).

