เกี่ยวกับ เฟิร์นฟลาวเวอร์
Fernflower เป็นตัวถอดรหัสเชิงวิเคราะห์ตัวแรกที่ใช้งานได้จริงสำหรับ Java และอาจเป็นสำหรับภาษาโปรแกรมระดับสูงโดยทั่วไป โดยปกติแล้ว มันยังอยู่ระหว่างการพัฒนา โปรดส่งรายงานข้อบกพร่องและคำแนะนำในการปรับปรุงไปที่ [เครื่องมือติดตามปัญหา](https://youtrack.jetbrains.com/newIssue?project=IDEA&clearDraft=true&c=Subsystem+Java. Decompiler)
เฟิร์นฟลาวเวอร์ และฟอร์จฟลาวเวอร์
Fernflower มีแพตช์บางส่วนจาก Forgeflower ขอขอบคุณอย่างจริงใจต่อผู้ดูแล Forgeflower สำหรับการสนับสนุนและการปรับปรุงอันมีค่าของพวกเขา
ใบอนุญาต
Fernflower ได้รับอนุญาตภายใต้ Apache License เวอร์ชัน 2.0
ทำงานจากบรรทัดคำสั่ง
java -jar fernflower.jar [-<option>=<value>]* [<source>]+ <destination>
* หมายถึง 0 ครั้งขึ้นไป
+ หมายถึง 1 ครั้งขึ้นไป
<source>: ไฟล์หรือไดเร็กทอรีพร้อมไฟล์ที่จะถอดรหัส ไดเร็กทอรีจะถูกสแกนแบบวนซ้ำ นามสกุลไฟล์ที่อนุญาตคือ class, zip และ jar แหล่งที่มานำหน้าด้วย -e= หมายถึงไฟล์ "library" ซึ่งจะไม่ถูกถอดรหัส แต่จะนำมาพิจารณาเมื่อวิเคราะห์ความสัมพันธ์ระหว่างคลาสหรือเมธอด โดยเฉพาะอย่างยิ่งการเปลี่ยนชื่อตัวระบุ (ตัวเลือก 'ren') จะได้รับประโยชน์จากข้อมูลเกี่ยวกับคลาสภายนอก
<destination>: ไดเรกทอรีปลายทาง
<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): ซ่อนสมาชิกคลาสสังเคราะห์
- din (1): ถอดรหัสคลาสภายใน
- dc4 (1): ยุบการอ้างอิงคลาส 1.4
- das (1): ถอดรหัสการยืนยัน
- hes (1): ซ่อนการร้องขอ super ที่ว่างเปล่า
- hdc (1): ซ่อนตัวสร้างเริ่มต้นที่ว่างเปล่า
- dgs (0): ถอดรหัสลายเซ็นทั่วไป
- ner (1): ถือว่า return ไม่ทิ้งข้อยกเว้น
- ถ้ำ (1): แยกการแจงนับ
- rgn (1): ลบการเรียกใช้ getClass() เมื่อเป็นส่วนหนึ่งของคำสั่งใหม่ที่ผ่านการรับรอง
- สว่าง (0): เอาต์พุตตัวอักษรตัวเลข "ตามที่เป็น"
- asc (0): เข้ารหัสอักขระที่ไม่ใช่ ASCII ในสตริงและตัวอักษรตัวอักษรในขณะที่ Unicode Escape
- bto (1): ตีความ int 1 เป็นบูลีนจริง (วิธีแก้ปัญหาข้อบกพร่องของคอมไพเลอร์)
- nns (0): อนุญาตให้ไม่ได้ตั้งค่าแอตทริบิวต์สังเคราะห์ (วิธีแก้ปัญหาสำหรับข้อผิดพลาดของคอมไพเลอร์)
- uto (1): พิจารณาประเภทที่ไม่ระบุชื่อเป็น java.lang.Object (วิธีแก้ปัญหาข้อบกพร่องทางสถาปัตยกรรมคอมไพเลอร์)
- udv (1): สร้างชื่อตัวแปรขึ้นมาใหม่จากข้อมูลการดีบัก หากมี
- ump (1): สร้างชื่อพารามิเตอร์ใหม่จากแอตทริบิวต์ที่เกี่ยวข้อง หากมี
- rer (1): ลบช่วงข้อยกเว้นที่ว่างเปล่า
- fdi (1): de-inline โครงสร้างในที่สุด
- mpm (0): เวลาประมวลผลสูงสุดที่อนุญาตต่อวิธีถอดรหัส หน่วยเป็นวินาที 0 หมายถึง ไม่มีขีดจำกัดบน
- ren (0): เปลี่ยนชื่อคลาสและองค์ประกอบของคลาสที่ไม่ชัดเจน (resp. obfuscated)
- urc (-): ชื่อเต็มของคลาสที่ผู้ใช้ระบุซึ่งใช้อินเทอร์เฟซ IIdentifierRenamer มันถูกใช้เพื่อกำหนดว่าตัวระบุคลาสใดที่ควรเปลี่ยนชื่อและจัดเตรียมชื่อตัวระบุใหม่ (ดู "การเปลี่ยนชื่อตัวระบุ")
- อินน์ (1): ตรวจสอบคำอธิบายประกอบ @NotNull เฉพาะ IntelliJ IDEA และลบโค้ดที่แทรกหากพบ
- lac (0): ถอดรหัสนิพจน์แลมบ์ดาเป็นคลาสที่ไม่ระบุชื่อ
- nls (0): กำหนดอักขระบรรทัดใหม่ที่จะใช้สำหรับเอาต์พุต 0 - 'rn' (Windows), 1 - 'n' (Unix) ค่าเริ่มต้นขึ้นอยู่กับระบบปฏิบัติการ
- ind: สตริงการเยื้อง (ค่าเริ่มต้นคือ 3 ช่องว่าง)
- crp (0): ใช้รูปแบบการบันทึกเมื่อเป็นไปได้
- cps (0): ใช้สวิตช์ที่มีรูปแบบที่เป็นไปได้
- log (INFO): ระดับการบันทึก ค่าที่เป็นไปได้ ได้แก่ TRACE, INFO, WARN, ERROR
- iec (0): รวมเส้นทางคลาสทั้งหมดไว้ในบริบทเมื่อทำการถอดรหัส
- isl (1): นิพจน์แลมบ์ดาแบบอินไลน์แบบง่าย
- ucrc (1): ซ่อนตัวสร้างและตัวรับบันทึกที่ไม่จำเป็น
- cci (1): ตรวจสอบว่าทรัพยากรใน try-with-resources ใช้อินเทอร์เฟซ
AutoCloseable
จริงหรือไม่ - jvn (0): เขียนทับชื่อตัวแปรโลคัลด้วยชื่อสไตล์ JAD
- jpr (0): รวมชื่อพารามิเตอร์ในการตั้งชื่อ JAD
การเปลี่ยนชื่อตัวระบุ
obfuscators บางตัวตั้งชื่อคลาสและองค์ประกอบสมาชิกให้สั้น ไม่มีความหมาย และเหนือสิ่งอื่นใดคือชื่อที่ไม่ชัดเจน การคอมไพล์โค้ดดังกล่าวใหม่ทำให้เกิดข้อขัดแย้งมากมาย ดังนั้นจึงแนะนำให้ปล่อยให้ตัวถอดรหัสเปลี่ยนชื่อองค์ประกอบตามลำดับ เพื่อให้มั่นใจว่าตัวระบุแต่ละตัวไม่ซ้ำกัน
ตัวเลือก 'ren' (เช่น -ren=1) เปิดใช้งานฟังก์ชันการเปลี่ยนชื่อ กลยุทธ์การเปลี่ยนชื่อเริ่มต้นจะเป็นดังนี้:
- เปลี่ยนชื่อองค์ประกอบหากชื่อเป็นคำสงวนหรือสั้นกว่า 3 ตัวอักษร
- ชื่อใหม่ถูกสร้างขึ้นตามรูปแบบง่ายๆ: (class|method|field)_<consecutive Unique number>
คุณสามารถเขียนทับกฎนี้ได้โดยการจัดเตรียมวิธีการหลัก 4 วิธีที่คุณเรียกใช้โดยตัวถอดรหัสขณะเปลี่ยนชื่อ เพียงส่งคลาสที่ใช้ org.jetbrains.java.decompiler.main.extern.IIdentifierRenamer ในตัวเลือก 'urc' (เช่น -urc=com.example.MyRenamer) ไปยัง Fernflower คลาสจะต้องพร้อมใช้งานบน classpath ของแอปพลิเคชัน
ความหมายของแต่ละวิธีควรชัดเจนจากการตั้งชื่อ: toBeRenamed กำหนดว่าจะเปลี่ยนชื่อองค์ประกอบหรือไม่ ในขณะที่อีกสามวิธีให้ชื่อใหม่สำหรับคลาส วิธีการ และฟิลด์ตามลำดับ