
Rekonstruiert Legacy-Windows-Binärdateien in C-Quellcode, indem Exporte des Ghidra-Dekompilierers mit lokalen LLMs kombiniert werden, wodurch kompilierungsgeprüfte Kandidaten und ähnlichkeitsbasierte Berichte erzeugt werden.
Dieses Repository ist eine in Arbeit befindliche Rekonstruktion des Quellcodes für
RATS.EXE, die ursprüngliche Windows-Version von
Rats! (1994) von Sean O'Connor. Es erstellt
eine Win32-Programmdatei mit Microsoft Visual C++ 4.1 unter
wibo und kann in
DREAMM getestet werden.
Das Experiment untersucht, wie weit lokale LLMs die Quellcode-Rekonstruktion an einer kleinen, aber realistischen Codebasis statt an einem Spielzeugbeispiel vorantreiben können. Die Übereinstimmungstreue bleibt uneinheitlich, was hier nützlich ist: Ziel ist es, eine realistische Sicht auf den Prozess und seine aktuellen Grenzen zu vermitteln, nicht schwierige Funktionen zu verstecken.
Die Funktionsrekonstruktion ist auf lokale LLMs beschränkt. Codex und Claude werden für die Repository-Einrichtung und die Benchmark-Orchestrierung verwendet, dürfen den rekonstruierten Quellcode jedoch nicht schreiben oder bearbeiten.
Sofern nicht anders angegeben, wurden alle Experimente mit Qwen3.8 27B BF16 auf einem MacBook Pro von 2024 mit Apple M4 Max (16-Kern-CPU, 40-Kern-GPU) und 128 GB Arbeitsspeicher durchgeführt. Der Ansatz funktioniert – unvollkommen, aber nützlich: Die 36 beibehaltenen Funktionen benötigten eine durchschnittliche protokollierte Zeit von 2m 32.1s pro Funktion zur Rekonstruktion.
Mit Submodulen klonen oder diese nach dem Klonen initialisieren:
git submodule update --init --recursive
Die ursprüngliche Programmdatei ist nicht enthalten. Laden Sie die kostenlose Windows-Version
von der offiziellen Rats!-Seite herunter und
legen Sie deren RATS.EXE im Repository-Stammverzeichnis ab, um die Ziele original-executable und
binary-comparison zu verwenden.
make # build out/RATS_RE.EXE, .map, .obj, and .asm
make toolchain # download, extract, and verify Microsoft Visual C++ 4.1
make run # launch the rebuilt executable in DREAMM
make run-original # launch the preserved original RATS.EXE
make test # bounded DREAMM smoke test of the rebuilt executable
make test-original # bounded DREAMM smoke test of the original executable
make debug # start the rebuilt executable in DREAMM's debugger
make report # report similarity for every reconstructed function
make compare-func FUNC=SaveHighScores ADDR=00409092
Das per Prüfsumme fixierte
MSVC-4.1-Archiv,
die erforderlichen MSVC-4.1-Bibliotheken, wibos kompatible msvcrt40.dll und DREAMM
4.0x21 werden bei Bedarf heruntergeladen. Sie bleiben ignorierte lokale Build-Abhängigkeiten
und werden nicht committet.
Das eingecheckte Verzeichnis ghidra/ enthält Assembly- und Decompiler-Exporte für
alle 177 internen Funktionen. Assembly ist die maßgebliche Vergleichsinstanz; dekompilierter
C-Code ist nur ein semantischer Seed.
Installieren Sie binary-recons einmal und
führen Sie es dann aus dem Repository-Stammverzeichnis aus:
python3 -m pip install -e /path/to/binary-recons
binary-recons --next-function # reconstruct the next safe missing target
binary-recons --address 0x409092 # reconstruct or improve a specific target
Das Tool findet Qwen automatisch im Standard-Hugging-Face-Cache;
BINARY_RECONS_MODEL_PATH kann dies überschreiben. binary-recons.toml hält die automatische
Auswahl innerhalb der Spielcode-Bereiche, startet und stoppt llama.cpp und definiert
die transaktionalen Dateien sowie den binary-comp-Befehl. Jeder begrenzte Lauf seedet eine
Funktion aus Ghidra, bittet Qwen um fokussierte Compile- oder Assembly-Diff-Reparaturen
und behält den besten sicher kompilierenden Kandidaten. Verwenden Sie --target-score 95 für einen
tieferen Durchlauf oder --dry-run-prompt, um den Prompt zu prüfen, ohne Qwen zu laden.
Gemessene lokale Modell-Läufe sind in docs/MODEL_RESULTS.md dokumentiert.
Die meisten beibehaltenen Kandidaten wurden mit Unsloths
Qwen3.8 27B GGUF in BF16
(Qwen3.8-27B-BF16, bereitgestellt als qwen3.8-27b-bf16) über llama.cpp mit einem
32.768-Token-Kontext und dem Modell-Preset qwen erzeugt. Der aktuelle Workflow
verwendet Ghidras Dekompilierung als mechanischen Seed, bittet Qwen nur um einen
aussagekräftigen Contract und begrenzte Quellcode-Änderungen, folgt gültigen Änderungen
als Reparatur-Trajektorie und behält das beste mit binary-comp gemessene Ergebnis.
Gemma 4 31B IT BF16 wurde ebenfalls benchmarkt, aber keiner seiner Kandidaten ist im
Quellbaum enthalten.
Die folgenden Ähnlichkeitswerte wurden am 16.08.2026 aus dem aktuellen Quellbaum mit
MSVC 4.1 und binary-comp neu gemessen. Die protokollierte Zeit umfasst den Start des
verwalteten Servers, die Generierung oder Reparatur, den Build und den Vergleich für den
beibehaltenen Kandidaten. Sie schließt erfolglose explorative Läufe und Reparaturrunden
aus, die nach der Erzeugung eines fortsetzbaren Kandidaten erfolgten; diese bleiben in den
Laufprotokollen verfügbar.
Besonderer Dank geht an:
| Adresse | Funktion | Aktuelle Ähnlichkeit | Protokollierte Zeit |
|---|
0x0040215C | IsLevelIndexInRange | 65.31% | 3m 06.4s |
0x00402205 | ShowLevelComplete | 93.96% | 5m 26.1s |
0x0040250C | SubmitHighScore | 97.37% | 1m 49.7s |
0x004026D0 | RenderScoreboard | 95.40% | 2m 30.9s |
0x00402BF3 | AddLevelToTable | 73.85% | 4m 04.6s |
0x00402DC6 | UpdateGameDisplay | 78.18% | 1m 36.4s |
0x00402EE7 | GetLevelDisplayInfo | 71.70% | 2m 15.9s |
0x00402FD5 | GetLevelIndex | 87.27% | 5m 48.3s |
0x00403430 | IsBombAtLevel | 80.62% | 27.3 s |
0x00403607 | PlaceLevel | 80.00% | 2m 32.6s |
0x00404764 | DrawLevelIndicator | 97.33% | 1m 35.6s |
0x0040499F | RenderCornerGlyph | 69.83% | 1m 50.9s |
0x00404D6E | DrawBitmapPair | 98.67% | 1m 04.6s |
0x00404E3B | RenderBitmapToWindow | 94.74% | 26.4 s |
0x00404ECE | DrawBitmapToWindow | 95.59% | 59.3 s |
0x00404F8B | DrawScore | 96.20% | 1m 32.4s |
0x0040507F | DrawScorePanel | 97.97% | 2m 45.0s |
0x0040525D | DrawScoreDigits | 94.20% | 2m 13.7s |
0x00405343 | RenderScoreOverlay | 77.78% | 1m 28.1s |
0x0040546B | DrawFrameBorder | 84.93% | 37.0 s |
0x0040552E | ExplodeBomb | 64.71% | 1m 50.9s |
0x0040560E | RenderExplosionWave | 85.07% | 5m 40.0s |
0x0040591A | DrawBombExplosion | 89.31% | 1m 45.8s |
0x00405AF5 | DrawPausedOverlay | 96.21% | 1m 05.1s |
0x00405C52 | HighScoreDialogProc | 79.82% | 41.5 s |
0x00405DB8 | ScorePanelDialogProc | 50.34% | 1m 53.1s |
0x00405F72 | DemoVersionDialogProc | 46.31% | 4m 18.5s |
0x004061D3 | OrderDialogProc | 53.16% | 10m 46.5s |
0x00408854 | DrawStartButton | 70.80% | 1m 35.6s |
0x00408A51 | UpdateMainMenuState | 97.56% | 28.9 s |
0x00408AD3 | InitializeGameLevel | 83.72% | 5m 35.7s |
0x00408E6A | LoadLevelData | 77.50% | 52.5 s |
0x00408F02 | LoadHighScores | 79.61% | 1m 15.0s |
0x00409092 | SaveHighScores | 94.12% | 1m 25.9s |
0x0040910C | LoadLevelBitmaps | 98.93% | 7m 08.4s |
0x00409DB6 | IsRatsHelpFile | 91.67% | 41.5 s |
Rekonstruktionsversuche für die folgenden Adressen wurden ausgeschöpft, ohne eine Quellcode-Implementierung beizubehalten. Die aufgewendete Zeit ist kumulativ über alle protokollierten Versuche.
| Aufgeschobene Adresse | Aufgewendete Zeit | Ergebnis |
|---|---|---|
0x00401000 | 10m 29.7s | Funktion zu groß für einen begrenzten ersten Durchlauf; ursprüngliches 1.13%-Gerüst beibehalten |
0x00403840 | 13m 10.0s | Kein kompilierbarer Kandidat; zu groß für einen schnellen begrenzten Durchlauf |
0x00406674 | — | Übersprungen: zu groß für einen schnellen begrenzten Durchlauf |