
32-बिट DOS और Win32 गेम्स (1993-2010) की रिवर्स इंजीनियरिंग के लिए Headless-Ghidra टूलकिट: स्वयं का LE/LX लोडर, Watcom कॉलिंग कन्वेंशन, लाइब्रेरी सिग्नेचर, MCP सर्वर

लगभग 1993–2010 के 32-बिट गेम्स को हेडलेस Ghidra के साथ डीकंपाइल करने के लिए एक टूलकिट:
आउटपुट एक वर्कस्पेस है जिसमें एक बड़ी .c फ़ाइल होती है जिसमें हर फ़ंक्शन के साथ-साथ इंडेक्स
(फ़ंक्शन्स, कॉल ग्राफ़, स्ट्रिंग्स, fixups/pointer tables, इम्पोर्ट्स) होते हैं जिन्हें आप grep कर सकते हैं और लोगों या AI एजेंट्स के बीच
बाँट सकते हैं। विश्लेषण के दौरान पाए गए नाम वापस Ghidra में जाते हैं और एक्सपोर्ट
फिर से जनरेट किया जाता है।
पूर्वापेक्षाएँ: Ghidra 12.x
(अनपैक किया हुआ), एक JDK 21+ (JAVA_HOME), Python 3.10+।
pipx install git+https://github.com/nemo22/retrokit # or from a checkout: pip install . (or python -m retrokit)
retrokit doctor # checks Python, Ghidra, Java, loader, cspecs
retrokit install-loader # once per Ghidra install (DOS LE/LX only)
Ghidra --ghidra DIR, $GHIDRA_INSTALL_DIR, या गेम या किट के बगल में स्थित ghidra/ghidra_* डायरेक्टरी के माध्यम से पाया जाता है। install-loader उस Ghidra के विरुद्ध javac के साथ लोडर को कंपाइल करता है (Gradle के बिना), इसे Ghidra/Extensions में इंस्टॉल करता है और Watcom कंपाइलर स्पेक्स को रजिस्टर करता है; Ghidra को अपडेट करने के बाद इसे फिर से चलाएँ (doctor आपको बताता है कि कब)।
retrokit info GAME.EXE # format, DOS extender, compiler, calling convention
retrokit analyze GAME.EXE # full pipeline -> GAME_analysis/ (-o DIR to choose)
retrokit show GAME_analysis FUN_00012345 main
retrokit tables GAME_analysis # function-pointer and string tables (from fixups)
retrokit names GAME_analysis # apply notes/names_*.csv, re-export
retrokit reexport GAME_analysis # re-run the fix-up passes + export without re-importing
analyze प्रारूप, लोडर और – Watcom के लिए – कॉलिंग कन्वेंशन का पता लगाता है
(--cspec watcom|watcomreg इसे ओवरराइड करता है) और उन्हें GAME_analysis/retrokit.json में संग्रहीत करता है;
बाद के कमांड को केवल वर्कस्पेस की आवश्यकता होती है। एक वर्कस्पेस:
GAME_analysis/
retrokit.json how the binary was analysed
decomp/ <exe>_decompiled.c, functions.csv (addr,name,size,callers,callees,cc,signature),
calls.txt, strings.txt, data_symbols.txt, memory_blocks.txt,
fixups.txt (source -> target of every pointer: the key to pointer tables
and to which function uses which string), imports.txt (PE)
notes/ findings, names_<topic>.csv proposals
ghidra_project/ the Ghidra project (open it in the Ghidra GUI too)
logs/
AI एजेंट: retrokit mcp GAME_analysis वर्कस्पेस पर एक MCP सर्वर (stdio, कोई अतिरिक्त पैकेज नहीं) है:
फ़ंक्शन, डीकंपाइल किया गया कोड, कॉल ग्राफ़, क्रॉस रेफ़रेंस, स्ट्रिंग्स, पॉइंटर
टेबल, डिसअसेम्बली और बाइट्स, लाइब्रेरीज़; यह नाम प्रस्तावों और नोट्स को रिकॉर्ड करता है और
लागू किए गए नामों के साथ पुनः निर्यात कर सकता है (अनुरोध पर, बैकग्राउंड में)। Claude Code:
claude mcp add retrokit -- retrokit mcp /path/to/GAME_analysis
अन्य क्लाइंट्स के लिए सेटअप, हर टूल और एक एजेंट को कैसे काम करना चाहिए: docs/MCP.md; एजेंट्स के लिए एक संक्षिप्त संस्करण AGENTS.md में।
नाम: प्रस्ताव notes/names_<topic>.csv में लिखें (addr,name,confidence,comment, confidence
V सत्यापित या G अनुमान); retrokit names WS फ़ंक्शन/लेबल का नाम बदलता है (V, G पर जीतता है,
टकरावों को _<addr> मिलता है) और पुनः निर्यात करता है।
पाइपलाइन क्या करती है:
retrokit libs (साथ ही info और analyze का हिस्सा ->
notes/libraries.md) उस काल की ~20 लाइब्रेरीज़ को पहचानता है - Miles/AIL, HMI SOS, DIGPAK,
Smacker, Bink, FMOD, BASS, DirectX, zlib, libjpeg, libpng, PKWARE DCL, Lua, ... - strings,
imports और data files से, उनके प्रारूपों पर नोट्स और port hints के साथ।
लाइब्रेरी कोड हस्ताक्षर द्वारा पाया जाता है (शामिल: Watcom C/C++ run-time, Open Watcom से
math और C++ लाइब्रेरीज़, zlib 1.0.4-1.2.3, libjpeg 6b; retrokit sigs build उन्हें उन
लाइब्रेरीज़ से बनाता है जो आपके पास हैं, sigs learn उन फ़ंक्शन्स से जिन्हें आपने पहचाना) -
पहले सटीक मिलान, फिर अन्य कंपाइलर संस्करणों से समान कोड - नामित, और retrokit/knowledge/*.h
से टाइप किया गया।switch jump tables अपने फ़ंक्शन्स के अंदर रखे गए, गलत "no return" फ़्लैग्स पूर्ववत किए गए,
short strings परिभाषित और string literals "text" के रूप में दिखाए गए, call sites पर
ADD ESP,n cleanups से parameter counts, prototypes callees-first पुनर्प्राप्त, export।अन्य कमांड्स: classes (RTTI से MSVC C++ classes), libs (उपयोग में लाइब्रेरीज़), convert (XMIDI/HMI/HMP -> MIDI, VOC -> WAV,
Smacker/Bink/FLIC -> MP4, सामग्री द्वारा), sigs match|build|learn (लाइब्रेरी हस्ताक्षर, देखें
docs/WORKFLOW.md),
entries (PE: बिना फ़ंक्शन के कोड पते), modules --rules FILE
(PE: फ़ंक्शन्स → assert paths के माध्यम से मूल स्रोत फ़ाइलें), strings EXE OUT (Ghidra के बिना PE string inventory),
match (संबंधित EXE में नाम स्थानांतरित करें: sequel, add-on, अन्य संस्करण),
le EXE info|dump|rec|s16|s32 (Ghidra पतों पर LE से tables पढ़ें), rnc (RNC ProPack),
flic info|png|video (Autodesk FLI/FLC)। विकल्पों के लिए retrokit COMMAND --help।
विस्तृत प्रक्रिया, क्या अपेक्षा करें और ज्ञात pitfalls docs/WORKFLOW.md में हैं; MCP
सर्वर docs/MCP.md में; AI एजेंट्स के लिए टास्क टेम्पलेट्स docs/AGENT_PROMPTS.md में; नियोजित
कार्य docs/ROADMAP.md में; रखरखाव और रिलीज़ docs/MAINTAINING.md में।
retrokit/ Python package (CLI: retrokit/cli.py)
ghidra_scripts/ headless Ghidra scripts used by the pipelines
tools/ standalone Python tools behind the CLI commands
le-loader/ LE/LX loader for Ghidra (Java) + Watcom compiler specs (data/languages/)
sigs/ library signatures (Open Watcom C run-time)
knowledge/ libraries.json (library catalog), library prototypes as C headers
scripts/ build_sigs.py: rebuilds the shipped signatures
tests/ synthetic test programs, scoring against the linker map, baseline
docs/ WORKFLOW, AGENT_PROMPTS, ROADMAP