
مفكك شيفرات & مفكك تجريبي لسكريبتات TLOU2 DC.

dconstruct هي أداة هندسة عكسية لملفات DC-Script المستخدمة في The Last of Us Part II. تحتوي على مفكك ومترجم عكسي.
يُنتج ملفات .asm تحتوي على الهياكل المفككة والبايت كود، بالإضافة إلى ملفات .dcpl (لغة DC شبه) تحتوي على كود شبيه بلغة C.
يمكنك أيضًا إجراء تعديلات على الملفات عبر سطر الأوامر، بما في ذلك استبدال هياكل كاملة بجهد ضئيل. وهذا يجعل إنشاء التعديلات (mods) التي تغير ببساطة بضع قيم داخل ملفات .bin أمرًا سهلاً للغاية.
-e، وإنشاء ملفات جديدة يمكن استخدامها للتعديلات (mods)أولاً، يُوصى بنقل مجلد dconstruct الذي تم فك ضغطه إلى موقع آمن، مثل C:\Program Files.
لجعل استخدام dconstruct سهلاً قدر الإمكان، يُوصى بإضافة مجلد .\bin داخل مجلد dconstruct إلى PATH. يمكنك معرفة المزيد هنا، أو اتباع هذه الخطوات السريعة:

dconstruct --about. يجب أن ترى بعض المخرجات من البرنامج ولا توجد رسالة خطأ.قم بتشغيل أمر مثل هذا في سطر الأوامر لإنشاء أول ملف مفكك لك:```shell dconstruct my_bin_file.bin
سيؤدي هذا بعد ذلك إلى إخراج ملف باسم `my_bin_file.bin.asm` في نفس الدليل الذي يحتوي على ملف الإدخال الخاص بك. يمكنك بعد ذلك فتح هذا الملف باستخدام محرر نصوص/أكواد. أوصي باستخدام شيء مثل VSCode الذي يوفر ميزات بحث متقدمة وهو جيد في التعامل مع الملفات الكبيرة. لا يُنصح باستخدام برنامج "المفكرة" القياسي في Windows.
لفك ترجمة ملف، أضف العلامة `--decompile` عند تشغيل الأمر.
# وسائط سطر الأوامر
- `-i` - ملف الإدخال أو المجلد. يمكن حذفه إذا مررت مسار الإدخال كوسيطة أولى.
- `-o` - مسار الإخراج. إذا كان مسار الإدخال الخاص بك هو مجلد، فلا يمكن أن يكون هذا ملفًا. إذا لم يتم تحديد إخراج، فسيتم وضع ملف .txt بجوار ملف الإدخال. إذا كان الإدخال مجلدًا ولم يتم تحديد إخراج، فسيقوم البرنامج بإنشاء دليل "output" في دليل العمل الحالي ووضع جميع الملفات فيه.
- يتم تحميل sidbase من `sidbase.bin` الموجود بجوار الملف القابل للتنفيذ.
- `--no_decompile` - لا يصدر كودًا مفكوكًا زائفًا إلى ملف .dcpl. سيتم وضع الملف بجوار ملف .asm. هذا خطأ افتراضيًا.
- `--no_optimize` - لا يحسن وينظف كود dcpl. يتضمن ذلك تضمين استدعاءات الدوال، وإزالة المتغيرات غير المستخدمة، وتحويل حلقات for المتوافقة إلى حلقات foreach، وتحويل بعض سلاسل if-else إلى تعبيرات match.
- `--pascal_case` - يحول أسماء دوال الألعاب إلى حالة Pascal في إخراج dcpl، على سبيل المثال get-boolean -> GetBoolean.
- `--graphs` - يصدر ملفات .svg تحتوي على رسوم بيانية لتدفق التحكم لجميع الدوال المفكوكة. يحصل كل ملف .bin على مجلده الخاص الذي يحتوي على جميع رسومه البيانية. هذا **يبطئ** سرعة فك الترجمة بشكل كبير، لذا لا يُنصح به عند فك ترجمة عدد كبير من الملفات في نفس الوقت.
- `--emit_once` - يمنع إصدار نفس الهيكل مرتين في التفكيك. إذا ظهر هيكل عدة مرات، فسيتم إصدار المثيل الأول فقط بالكامل، وسيتم استبدال جميع المناسبات الأخرى بعلامة `ALREADY_EMITTED`. يمكن أن يقلل هذا من حجم الملف بشكل كبير.
- `-e` - إجراء تعديل. مزيد من المعلومات في القسم أدناه.
- `--edit_file` - تقديم ملف تحرير. يحتوي ملف التحرير على تعديل واحد لكل سطر. يستخدم نفس بناء الجملة مثل العلامة -e.
# ما هو المفكك؟
[المفكك](https://en.wikipedia.org/wiki/Disassembler) هو أداة تقرأ التعليمات الثنائية (المعروفة أيضًا باسم [bytecode](https://en.wikipedia.org/wiki/Bytecode) أو [machine code](https://en.wikipedia.org/wiki/Machine_code)) وتترجم كل منها إلى نسخة قابلة للقراءة البشرية تسمى [mnemonic](https://en.wikipedia.org/wiki/Assembly_language#Mnemonics). بشكل عام، لا تحاول المفككات تفسير الكثير حول معنى هذه التعليمات وتقوم فقط بتحويلها 1-1 إلى إصداراتها القابلة للقراءة. على سبيل المثال، التعليمات:```arm
15 00 00 00
4A 01 01 00
43 31 01 00
1C 00 00 01
يتم تفكيكها إلى الإصدارات القابلة للقراءة البشرية التالية:```arm LookupPointer r0, 0 LoadStaticU64Imm r1, 1 Move r49, r1 CallFf r0, r0, 1
جميع الأرقام في البايت كود مكتوبة بنظام [الست عشري](https://en.wikipedia.org/wiki/hexadecimal). يمثل العمود الأول في كل صف `opcode`، أو نوع التعليمات التي سيتم تنفيذها. العمود التالي هو سجل الوجهة، حيث سيتم تخزين نتيجة العملية. آخر عمودين هما المعاملان 1 و2، وهما إما سجلات أو أرقام حرفية سيتم تنفيذ العملية عليها. ليست كل التعليمات تستخدم جميع البايتات الأربعة، على سبيل المثال، تعليمة `LookupPointer` الأولى تحتاج فقط إلى معامل واحد.
يضيف مفكك dconstruct أيضًا بعض المعلومات الإضافية المصممة لتسهيل قراءة التعليمات بعض الشيء. كما يقوم بإدراج تسميات (مثل `L_0`) لتسهيل تتبع الفروع في الكود.```arm
15 00 00 00 LookupPointer r0, 0 r0 = ST[0] -> <is-player-abby?>
4A 01 01 00 LoadStaticU64Imm r1, 1 r1 = ST[1] -> <player>
43 31 01 00 Move r49, r1 r49 = player
1C 00 00 01 CallFf r0, r0, 1 r0 = is-player-abby?(player)
2F 0D 00 00 BranchIfNot r0, 0xD IF NOT r0 => L_0
هذا مفيد عندما تريد النظر إلى المحتويات الخام للملف دون أن يقوم البرنامج بالكثير من التخمينات. لكن قراءته يمكن أن تكون صعبة للكتل الكبيرة من الكود، حيث لا يوجد هيكل على الإطلاق. وهنا يأتي دور المفكك.
المفكك هو عكس المترجم. المترجم هو برنامج يأخذ الكود المكتوب بواسطة البشر (مثل C، Java، C++، ...) وينتج تعليمات الآلة. في حالة TLOU2 والعديد من ألعاب ND الأخرى، لغة البرمجة النصية المستخدمة تسمى 'DC'، وهي في الأساس مجرد نسخة من لغة البرمجة Racket>)، و"الآلة" هي اللعبة نفسها التي تنفذ التعليمات أثناء تشغيل اللعبة. بشكل أساسي، يكتب المبرمجون بلغة DC ويستخدمون مترجمًا لتحويل هذا الكود إلى ملفات .bin التي تُشحن مع اللعبة.
المفكك يأخذ الكود المُفكك من الأعلى وينتج ما يُعرف بالشبه شيفرة. الشبه شيفرة هي محاولة لإعادة بناء الكود المصدري الأصلي الذي تم استخدامه لتوليد التعليمات الخام. هذا يهدف إلى جعل فهم الكود أسهل بكثير، ومع ذلك، فإن عملية توليد الشبه شيفرة معقدة للغاية لأن هناك العديد من الإصدارات المختلفة من الكود المصدري التي يمكن أن تولد الكود البايتي النهائي، بالإضافة إلى التحسينات التي تحدث أثناء التجميع.