
يعيد بناء ثنائيات ويندوز القديمة إلى كود مصدري بلغة C عبر دمج مخرجات مفكك Ghidra مع نماذج لغوية كبيرة محلية، لإنتاج مرشّحات مجتازة لفحص الترجمة وتقارير مبنية على التشابه.
هذا المستودع هو إعادة بناء قيد التطوير للكود المصدري الخاص بـ RATS.EXE، إصدار Windows الأصلي من
Rats! (1994) من تأليف Sean O'Connor. يقوم
ببناء ملف تنفيذي Win32 باستخدام Microsoft Visual C++ 4.1 عبر
wibo، ويمكن اختباره في
DREAMM.
تستكشف التجربة إلى أي مدى يمكن للنماذج اللغوية المحلية أن تأخذ إعادة بناء المصدر على قاعدة أكواد صغيرة لكنها واقعية بدلًا من مثال مصغَّر. تظل دقة المطابقة متفاوتة، وهذا مفيد هنا: الهدف هو تقديم نظرة واقعية للعملية وقيودها الحالية، وليس إخفاء الدوال الصعبة.
تقتصر إعادة بناء الدوال على النماذج اللغوية المحلية. يُستخدم Codex وClaude لإعداد المستودع وتنسيق المعايير، لكن لا يُسمح لهما بكتابة أو تعديل المصدر المُعاد بناؤه.
ما لم يُذكر خلاف ذلك، استخدمت جميع التجارب Qwen3.8 27B BF16 على MacBook Pro لعام 2024 بمعالج Apple M4 Max (CPU من 16 نواة، GPU من 40 نواة) وذاكرة 128 GB. يعمل هذا النهج — بشكل غير كامل، لكنه مفيد: استغرقت الدوال الـ36 المُبقاة متوسط وقت مسجّل قدره 2m 32.1s لكل دالة لإعادة بنائها.
استنسخ المستودع مع الوحدات الفرعية، أو قم بتهيئتها بعد الاستنساخ:
git submodule update --init --recursive
الملف التنفيذي الأصلي غير مضمّن. نزّل إصدار Windows المجاني
من صفحة Rats! الرسمية وضع
RATS.EXE الخاص به في جذر المستودع لاستخدام أهداف الملف التنفيذي الأصلي
والمقارنة الثنائية.
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
يتم تنزيل أرشيف MSVC 4.1
المثبّت بمجموع اختباري (checksum)، ومكتبات MSVC 4.1 المطلوبة، وmsvcrt40.dll المتوافق مع wibo،
وDREAMM 4.0x21 عند الحاجة. تبقى هذه تبعيات بناء محلية متجاهَلة
ولا يتم إيداعها في المستودع.
يحتوي دليل ghidra/ المُودَع في المستودع على تصديرات assembly وdecompiler
لجميع الدوال الداخلية البالغ عددها 177. الـ assembly هو مرجع المقارنة المعتمَد؛
أما C المُفكَّكة فهي مجرد بذرة دلالية.
ثبّت binary-recons مرة واحدة، ثم
شغّله من جذر المستودع:
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
يكتشف الأداة Qwen تلقائيًا في ذاكرة التخزين المؤقت القياسية Hugging Face؛
ويمكن لـBINARY_RECONS_MODEL_PATH تجاوز ذلك. يحافظ binary-recons.toml على
الاختيار التلقائي داخل نطاقات أكواد اللعبة، ويشغّل ويوقف llama.cpp، ويحدد
ملفات المعاملات وأمر binary-comp. كل تشغيل محدود يغذّي دالة واحدة من Ghidra،
ويطلب من Qwen إصلاحات مركّزة للتجميع أو لفروقات الـ assembly،
ويحتفظ بأفضل مرشح آمن قابل للتجميع. استخدم --target-score 95 لجولة
أعمق أو --dry-run-prompt لفحص المطالبة دون تحميل Qwen.
تُسجَّل عمليات التشغيل المقيسة للنماذج المحلية في docs/MODEL_RESULTS.md.
تم توليد معظم المرشحين المُبقَين باستخدام
Qwen3.8 27B GGUF من Unsloth بصيغة BF16
(Qwen3.8-27B-BF16، مقدَّم باسم qwen3.8-27b-bf16) عبر llama.cpp بسياق
من 32,768 رمزًا والضبط المسبق للنموذج qwen. يستخدم سير العمل الحالي
تفكيك Ghidra كبذرة ميكانيكية، ويطلب من Qwen فقط عقدًا ذا معنى
وتعديلات مصدرية محدودة، ويتابع التعديلات الصالحة كمسار إصلاح،
ويحتفظ بأفضل نتيجة مقيسة بواسطة binary-comp. تم أيضًا قياس أداء
Gemma 4 31B IT BF16، لكن لا يُحتفظ بأي من مرشحيها في شجرة المصدر.
أُعيد قياس الدرجات أدناه من شجرة المصدر الحالية باستخدام MSVC 4.1 و
binary-comp في 2026-08-16. يشمل الوقت المسجَّل تشغيل الخادم المُدار،
والتوليد أو الإصلاح، والبناء، والمقارنة للمرشح المُبقى. ويستثني
عمليات التشغيل الاستكشافية غير الناجحة وجولات الإصلاح التي تمت بعد
إنتاج مرشح قابل للاستئناف بالفعل؛ تبقى تلك متاحة في سجلات التشغيل.
شكر خاص إلى:
| العنوان | الدالة | التشابه الحالي | الوقت المسجَّل |
|---|
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 |
استُنفدت محاولات إعادة البناء للعناوين التالية دون الاحتفاظ بتنفيذ مصدري. الوقت المستغرَق تراكمي عبر جميع المحاولات المسجَّلة.
| العنوان المؤجل | الوقت المستغرَق | النتيجة |
|---|---|---|
0x00401000 | 10m 29.7s | الدالة كبيرة جدًا لتمريرة أولى محدودة؛ تم الاحتفاظ بالهيكل الأصلي بنسبة 1.13% |
0x00403840 | 13m 10.0s | لا يوجد مرشح قابل للتجميع؛ كبيرة جدًا لتمريرة محدودة سريعة |
0x00406674 | — | تم التخطي: كبيرة جدًا لتمريرة محدودة سريعة |