
مفكك جافا، ومجمّع، ومفكك تعليمات
كراكاتاو توفر مُجمّعًا ومُفكّكًا لـ Java bytecode، مما يسمح لك بتحويل ملفات class الثنائية إلى تنسيق نصي قابل للقراءة البشرية، وإجراء التعديلات، وتحويلها مرة أخرى إلى ملف class، حتى للكود المشوش. يمكنك أيضًا إنشاء ملفات class خاصة بك من الصفر عن طريق كتابة bytecode يدويًا، ويمكنك فحص ومقارنة التفاصيل منخفضة المستوى لثنائيات Java. على عكس javap، يمكن لمفكك كراكاتاو التعامل مع الكود المشوش بشدة، ويمكن إعادة تجميع المخرجات المفككة إلى ملف class.
كما توفر كراكاتاو مفكّكًا لتحويل ثنائيات Java إلى كود مصدري قابل للقراءة. على عكس المفككات الأخرى، تم تصميم مفكك كراكاتاو خصيصًا للعمل مع الكود المشوش ويمكنه التعامل بسهولة مع الحيل التي تعطل المفككات الأخرى. ومع ذلك، لا يدعم مفكك كراكاتاو بعض ميزات Java 8+ مثل lambdas، لذا فهو يعمل بشكل أفضل على الكود الأقدم.
بناء جملة مجمّع كراكاتاو هو في الغالب مجموعة فائقة من بناء جملة Jasmin مع بعض عدم التوافق البسيط، ولكن على عكس Jasmin، يدعم كراكاتاو بالكامل مواصفات Java 19 bytecode وحتى يدعم بعض الميزات غير الموثقة الموجودة في الإصدارات القديمة من JVM. للحصول على نظرة عامة على بناء جملة المُجمّع، انظر الدليل التعليمي أو المواصفات الكاملة.
أولاً، ستحتاج لتثبيت Rust و Cargo. ثم انسخ هذا المستودع وشغّل cargo build --release. سينتج عن ذلك ملف ثنائي في target/release/krak2، يمكنك استدعاؤه مباشرة، أو إضافته إلى PATH، أو إنشاء رابط رمزي، إلخ.
يحتوي المفكك على وضعين: الوضع الافتراضي ووضع الرحلة ذهابًا وإيابًا (roundtrip). الوضع الافتراضي محسّن للقراءة وسهولة تعديل ملفات التجميع الناتجة. عندما يتم إعادة تجميع المخرجات، ستنتج ملفات class متكافئة في السلوك مع الأصل من منظور مواصفات JVM، ولكن ليس بالضرورة مطابقة بتًا بتًا (على سبيل المثال، قد يتم إعادة ترتيب إدخالات التجمع الثابت). ينتج وضع الرحلة ذهابًا وإيابًا مخرجات ستعيد تجميعها إلى ملفات class مطابقة بتًا بتًا للأصل، ولكن هذا يعني أن ملفات التجميع تحافظ على معلومات الترميز منخفضة المستوى مما يجعل قراءتها أصعب، مثل الترتيب الدقيق لإدخالات التجمع الثابت. يوصى باستخدام وضع الرحلة ذهابًا وإيابًا عند العمل مع كود يعتمد على سمات غير قياسية، مثل كود CLDC أو كود Scala.
مثال للاستخدام:
krak2 dis --out temp RecordTest.class
krak2 dis --out disassembled.zip --roundtrip r0lling-challenge.jar
يمكنك إما تفكيك ملف class فردي أو ملف jar كامل. إذا كان اسم ملف الإدخال ينتهي بـ .jar أو .zip، فسيتم التعامل معه كملف jar وسيتم تفكيك كل ملف .class داخل jar.
يتحكم الخيار --out في موقع المخرجات. إذا كانت قيمة --out دليلاً، فسيتم وضع المخرجات في ملفات فردية تحت ذلك الدليل. بخلاف ذلك، إذا كانت قيمة --out تنتهي بـ .jar أو .zip، فسيتم وضع المخرجات في ملف zip واحد في ذلك الموقع. إذا كانت قيمة --out تنتهي بـ .j، فسيتم كتابة المخرجات إلى ذلك الملف (لاحظ أن ملف .j واحد يمكن أن يحتوي على عدة فئات - سيتم تفكيك جميع الفئات وكتابتها في نفس الملف، واحدة تلو الأخرى.) إذا تم حذف الخيار --out بالكامل، فسيتم كتابة الفئات المفككة إلى الإخراج القياسي.
لتفكيك في وضع الرحلة ذهابًا وإيابًا كما هو موضح أعلاه، مرر الخيار --roundtrip (أو -r للاختصار).
يتيح لك مُجمّع كراكاتاو كتابة Java bytecode بتنسيق نصي صديق للبشر وتحويله إلى ملفات class ثنائية لـ Java.
krak2 asm --out temp Krakatau/tests/assembler/good/strictfp.j
يمكنك إما تجميع ملف .j فردي أو ملف jar كامل. إذا كان اسم ملف الإدخال ينتهي بـ .jar أو .zip، فسيتم التعامل معه كأرشيف zip وسيتم تجميع كل ملف .j بداخله.
يتحكم الخيار --out في موقع المخرجات. إذا كانت قيمة --out دليلاً، فسيتم وضع المخرجات في ملفات فردية تحت ذلك الدليل. بخلاف ذلك، إذا كانت قيمة --out تنتهي بـ .jar أو .zip، فسيتم وضع المخرجات في ملف zip واحد في ذلك الموقع. إذا كانت قيمة --out تنتهي بـ .class، فسيتم كتابة ملف class الناتج الفردي إلى ذلك الملف (إذا كان الإدخال يحتوي على عدة فئات، فسيحدث خطأ في هذه الحالة).
مفكك الإصدار v2 لا يزال قيد التطوير. لفك التجميع، تحتاج حاليًا إلى استخدام Krakatau v1.