حول زهرة السرخس
يعد FernFlower أول برنامج فك تشفير تحليلي يعمل فعليًا لجافا وربما للغة برمجة عالية المستوى بشكل عام. وبطبيعة الحال، لا يزال قيد التطوير، يرجى إرسال تقارير الأخطاء واقتراحات التحسين إلى [متتبع المشكلات](https://youtrack.jetbrains.com/newIssue?project=IDEA&clearDraft=true&c=Subsystem+Java.Decompiler).
زهرة السرخس وForgeFlower
يتضمن FernFlower بعض التصحيحات من ForgeFlower. يتم التعبير عن خالص التقدير لمشرفي ForgeFlower على مساهماتهم وتحسيناتهم القيمة.
رخصة
تم ترخيص FernFlower بموجب ترخيص Apache الإصدار 2.0.
تشغيل من سطر الأوامر
java -jar fernflower.jar [-<option>=<value>]* [<source>]+ <destination>
* تعني 0 مرة أو أكثر
+ تعني مرة واحدة أو أكثر
<المصدر>: ملف أو دليل يحتوي على الملفات المراد فك ترجمتها. يتم فحص الدلائل بشكل متكرر. امتدادات الملفات المسموح بها هي class وzip وjar. المصادر التي تبدأ بـ -e= تعني ملفات "المكتبة" التي لن يتم فك ترجمتها، ولكن يتم أخذها في الاعتبار عند تحليل العلاقات بين الفئات أو الأساليب. يمكن أن تستفيد إعادة تسمية المعرفات بشكل خاص (s. option 'ren') من المعلومات حول الفئات الخارجية.
<الوجهة>: دليل الوجهة
<option>، <value>: خيار سطر أوامر بالقيمة المقابلة (راجع "خيارات سطر الأوامر" أدناه).
أمثلة:
java -jar fernflower.jar -hes=0 -hdc=0 c:Tempbinary -e=c:Javart.jar c:Tempsource
java -jar fernflower.jar -dgs=1 c:Tempbinarylibrary.jar c:TempbinaryBoot.class c:Tempsource
خيارات سطر الأوامر
باستثناء mpm وurc، تعني القيمة 1 أن الخيار نشط، و0 - غير مفعل. يتم إعطاء القيمة الافتراضية، إن وجدت، بين قوسين.
عادة، سيتم تغيير الخيارات التالية من قبل المستخدم، إن وجدت: hes، hdc، dgs، mpm، ren، urc. يمكن ترك بقية الخيارات كما هي: فهي تستهدف المهندسين العكسيين المحترفين.
- rbr (1): إخفاء طرق الجسر
- rsy (0): إخفاء أعضاء الفئة الاصطناعية
- الدين (1): فك الطبقات الداخلية
- DC4 (1): طي مراجع الفئة 1.4
- das (1): فك التأكيدات
- هيس (1): إخفاء الاستدعاء الفائق الفارغ
- hdc (1): إخفاء المنشئ الافتراضي الفارغ
- DGS (0): فك التوقيعات العامة
- ner (1): افترض العودة وليس رمي الاستثناءات
- دن (1): فك التعدادات
- rgn (1): إزالة استدعاء getClass()، عندما يكون جزءًا من عبارة جديدة مؤهلة
- مضاء (0): إخراج القيم الحرفية الرقمية "كما هي"
- asc (0): تشفير أحرف غير ASCII في سلسلة وأحرف حرفية أثناء هروب Unicode
- bto (1): تفسير int 1 على أنه صحيح منطقي (الحل البديل لخلل في برنامج التحويل البرمجي)
- ns (0): السماح بعدم تعيين السمة الاصطناعية (الحل البديل لخلل في برنامج التحويل البرمجي)
- uto (1): اعتبر الأنواع غير المسماة مثل java.lang.Object (حل بديل لخلل في بنية المترجم)
- udv (1): إعادة بناء أسماء المتغيرات من معلومات التصحيح، إذا كانت موجودة
- ump (1): إعادة بناء أسماء المعلمات من السمات المقابلة، إذا كانت موجودة
- rer (1): إزالة نطاقات الاستثناء الفارغة
- الاستثمار الأجنبي المباشر (1): إزالة الهياكل أخيرًا
- mpm (0): الحد الأقصى لوقت المعالجة المسموح به لكل طريقة مفككة، بالثواني. 0 يعني عدم وجود حد أعلى
- ren (0): إعادة تسمية الفئات الغامضة (المبهمة) وعناصر الفئة
- urc (-): الاسم الكامل للفئة التي يوفرها المستخدم والتي تطبق واجهة IIdentifierRenamer. يتم استخدامه لتحديد معرفات الفئة التي يجب إعادة تسميتها ويوفر أسماء معرفات جديدة (راجع "إعادة تسمية المعرفات")
- نزل (1): تحقق من التعليق التوضيحي @NotNull الخاص بـ IntelliJ IDEA وقم بإزالة الكود المدرج إذا تم العثور عليه
- lac (0): فك ترجمة تعبيرات لامدا إلى فئات مجهولة
- nls (0): تحديد حرف السطر الجديد الذي سيتم استخدامه للإخراج. 0 - 'rn' (Windows)، 1 - 'n' (Unix)، الافتراضي يعتمد على نظام التشغيل
- ind: سلسلة المسافة البادئة (الافتراضي هو 3 مسافات)
- crp (0): استخدم أنماط التسجيل حيثما كان ذلك ممكنًا
- cps (0): استخدم المفتاح مع الأنماط حيثما يكون ذلك ممكنًا
- السجل (INFO): مستوى التسجيل، والقيم المحتملة هي TRACE، INFO، WARN، ERROR
- iec (0): تضمين مسار الفصل بالكامل في السياق عند إلغاء الترجمة
- isl (1): تعبيرات لامدا البسيطة المضمنة
- ucrc (1): إخفاء مُنشئ السجل والحروف غير الضرورية
- cci (1): تحقق مما إذا كان المورد الموجود في تجربة الموارد يقوم بالفعل بتنفيذ واجهة
AutoCloseable
- jvn (0): استبدل أي أسماء متغيرات محلية بأسماء أنماط JAD
- jpr (0): تضمين أسماء المعلمات في تسمية JAD
إعادة تسمية المعرفات
يقوم بعض المُبهمين بإعطاء الفئات وعناصرها أسماء قصيرة، لا معنى لها وفوق كل شيء غامضة. تؤدي إعادة ترجمة هذا الرمز إلى عدد كبير من التعارضات. ولذلك فمن المستحسن السماح لبرنامج فك التحويل البرمجي بإعادة تسمية العناصر بدوره، مما يضمن تفرد كل معرف.
يقوم الخيار 'ren' (أي -ren=1) بتنشيط وظيفة إعادة التسمية. تتبع استراتيجية إعادة التسمية الافتراضية ما يلي:
- إعادة تسمية عنصر إذا كان اسمه كلمة محجوزة أو أقل من 3 أحرف
- يتم إنشاء الأسماء الجديدة وفقًا لنمط بسيط: (الفئة|الطريقة|الحقل)_<الرقم الفريد المتتالي>
يمكنك استبدال هذه القواعد من خلال توفير التنفيذ الخاص بك للطرق الرئيسية الأربعة التي يستدعيها برنامج إلغاء الترجمة أثناء إعادة التسمية. ما عليك سوى تمرير فئة تطبق org.jetbrains.java.decompiler.main.extern.IIdentifierRenamer في الخيار 'urc' (على سبيل المثال -urc=com.example.MyRenamer) إلى FernFlower. يجب أن يكون الفصل متاحًا في مسار فئة التطبيق.
يجب أن يكون معنى كل طريقة واضحًا من التسمية: يحدد toBeRenamed ما إذا كان سيتم إعادة تسمية العنصر، بينما توفر الثلاثة الأخرى أسماء جديدة للفئات والطرق والحقول على التوالي.