ฉันจะ“ ถอดรหัส” ไฟล์คลาส Java ได้อย่างไร [ปิด]


556

ฉันสามารถใช้โปรแกรมใดในการถอดรหัสไฟล์คลาส? ฉันจะได้รับรหัส Java จริงหรือเป็นเพียงรหัสประกอบ JVM?

ในคำถามเกี่ยวกับประสิทธิภาพของ Java ในเว็บไซต์นี้ฉันมักจะเห็นคำตอบจากผู้ที่มี "decompiled" ไฟล์คลาส Java เพื่อดูว่าคอมไพเลอร์ช่วยปรับบางสิ่งให้เหมาะสมได้อย่างไร


4
ศิลปะของ "decompiling" สามารถถูกมองว่าเป็นวิศวกรรมย้อนกลับ แม้ว่าบางครั้งเมื่อวิศวกรรมย้อนกลับสิ่งที่คุณไม่สามารถเข้าถึงไบนารี
Makach

ไม่มีใครพูดถึงbytecodeviewer.comซึ่งสามารถถอดรหัสไปยังซอร์ส java และ bytecode (สำหรับซอร์ส java อ้างอิงตาม JAD)
เฟอร์นันโดกอนซาเลซซานเชซ

คำตอบ:


588

อัปเดตกุมภาพันธ์ 2559:

www.javadecompilers.comระบุว่า JAD เป็น:

decompiler Java ที่นิยมมากที่สุด แต่ส่วนใหญ่ของอายุนี้เท่านั้น เขียนด้วยภาษา C ++ เร็วมาก
ล้าสมัยไม่ได้รับการสนับสนุนและถอดรหัสไม่ถูกต้อง Java 5 และใหม่กว่า

ดังนั้นไมล์สะสมของคุณอาจแตกต่างกันไปตาม jdk ล่าสุด (7, 8)

รายการไซต์เดียวกันเครื่องมืออื่น ๆ

และ javadecompiler ดังที่ซัลวาดอร์วาเลนเซียระบุไว้ในความคิดเห็น (ก.ย. 2017) มี SaaS ที่คุณอัปโหลด.classไฟล์ไปยังคลาวด์และส่งคืนโค้ดที่ถอดรหัสให้คุณ


คำตอบเดิม: ตุลาคม 2008

  • รุ่นสุดท้ายของ JSR 176 ซึ่งกำหนดคุณสมบัติหลักของ J2SE 5.0 (Java SE 5) ได้รับการเผยแพร่เมื่อวันที่ 30 กันยายน 2547
  • ข่าวสารล่าสุดรุ่น Java สนับสนุนโดย JAD ที่มีชื่อเสียง Decompiler Java เขียนโดยนายพาเวล Kouznetsov เป็นJDK 1.3
  • Java decompilers ส่วนใหญ่สามารถดาวน์โหลดได้จากอินเทอร์เน็ตเช่น "DJ Java Decompiler" หรือ "Cavaj Java Decompiler" นั้นใช้พลังงานจาก JAD: พวกมันไม่สามารถแสดงแหล่งที่มาของ Java 5

Java Decompiler (มีอีกตัว Fast Java decompiler) มี:

  • การสนับสนุนที่ชัดเจนสำหรับการถอดรหัสและการวิเคราะห์ไฟล์Java .5+ “ .class”
  • GUI ที่ดี:

ภาพหน้าจอ

มันทำงานร่วมกับคอมไพเลอร์จาก JDK 1.1.8 ถึง JDK 1.7.0 และอื่น ๆ ( Jikes , JRockitฯลฯ )

มันมีเวอร์ชั่นเดโมออนไลน์ที่ใช้งานได้จริงอย่างสมบูรณ์! คุณสามารถวางไฟล์ jar บนหน้าและดูซอร์สโค้ดที่ถอดรหัสแล้วโดยไม่ต้องติดตั้งอะไรเลย


5
+1 เป็นมูลค่าการกล่าวขวัญว่ามันเป็นแบบโมดูลดังนั้นจึงสามารถใช้ประโยชน์จากแกนกลาง (ใช้ใน C ++) ที่อื่น
Quinn Taylor

1
JD-GUI-0.3.3 นอกจากนี้ยังมีที่นี่
amaidment

1
ในกรณีที่หนึ่งติดตั้งปลั๊กอินตัวถอดรหัส Eclipse java บน Eclipse Juno และ Eclipse เริ่มแขวนบน Marketplace DND Initialization บังคับให้ฆ่ากระบวนการทั้งหมด: ลบ jd. *. jar ออกจากไดเรกทอรีปลั๊กอิน Eclipse เพียงแก้ไขให้ฉัน
LSerni

4
@Rishi เช่นเดียวกับที่คุณปกป้อง IP ของคุณในภาษาหรือแพลตฟอร์มใด ๆ - นักกฎหมายที่ดี DRM เป็น bandaid เท่านั้น
พลวง

1
ตอนนี้ให้บริการ SaaS ที่คุณอัปโหลดไฟล์. class ไปยังคลาวด์และส่งคืนโค้ดที่ถอดรหัสให้คุณ ทำงานเพื่อ POJO ง่าย ๆ
Salvador Valencia Valencia

101

มี decompilers อยู่สองสามตัว ... การค้นหาอย่างรวดเร็วให้ผลลัพธ์:

  1. Procyon : โอเพ่นซอร์ส (Apache 2) และพัฒนาอย่างแข็งขัน
  2. Krakatau : โอเพ่นซอร์ส (GPLv3) และพัฒนาขึ้นอย่างแข็งขัน
  3. CFR : โอเพ่นซอร์ส (MIT) และพัฒนาอย่างแข็งขัน
  4. JAD
  5. DJ Java Decompiler
  6. กาแฟโมคะ

และอื่น ๆ อีกมากมาย.

เหล่านี้ผลิตรหัส Java Java มาพร้อมกับสิ่งที่ให้คุณเห็นรหัส JVM ไบต์ ( javap )


2
ฉันขอเพิ่มด้วยได้ไหมว่า Procyon, CFR, JAD และ DJ มีให้บริการในรูปแบบเว็บ: javadecompilers.com
Andrew Rukin

javadecompilers.com - ผู้ช่วยชีวิต!
MarcoZen

kpdus.com/jad.htmlเป็นลิงก์โฆษณาบางลิงก์
marcinj

ขอบคุณ @marcinj ฉันพบลิงค์อื่นที่มีลิงค์ดาวน์โหลด
billjamesdev

51

ในการดูซอร์สโค้ด Java ให้ทำการถอดรหัสบางส่วน ไปค้นหาJAD

หากคุณต้องการเห็นไบต์โดยใช้javapซึ่งมาพร้อมกับ JDK


5
ฉันอยากจะแนะนำหนึ่งในตัวถอดรหัสโอเพ่นซอร์สแทนเพราะพวกเขากำลังพัฒนาอย่างแข็งขัน ใช้Procyon , CFR decompilerหรือKrakatau (Python) แทน
Janus Troelsen

29

ฉันลองหลายครั้งแล้วและดูเหมือนว่าProcyonจะทำงานได้ดีที่สุดสำหรับฉัน อยู่ระหว่างการพัฒนาและสนับสนุนคุณสมบัติมากมายของ Java เวอร์ชันล่าสุด

นี่คือสิ่งที่ฉันพยายาม:

  • CFR
    • สัญญา แต่มักจะล้มเหลวในการถอดรหัสวิธี ฉันจะคอยจับตาดูสิ่งนี้ พัฒนาอย่างแข็งขันพร้อมรองรับคุณสมบัติ Java ล่าสุด
  • Krakatau
    • ใช้แนวทางที่แตกต่างในการพยายามส่งออกโค้ด Java ที่เทียบเท่ากันแทนที่จะพยายามสร้างแหล่งต้นฉบับขึ้นใหม่ซึ่งมีศักยภาพในการทำให้ดีขึ้นสำหรับโค้ดที่สับสน จากการทดสอบของฉันมันเป็นเรื่องธรรมดากับ Procyon แต่ก็ยังดีที่มีบางอย่างที่แตกต่าง ฉันต้องใช้การ-skipตั้งค่าสถานะบรรทัดคำสั่งดังนั้นมันจะไม่หยุดข้อผิดพลาด พัฒนาอย่างแข็งขันและน่าสนใจเพียงพอที่เขียนไว้ใน Python
  • JD-GUI
  • JAD
    • ทำงานได้ แต่รองรับเฉพาะ Java 1.4 และต่ำกว่า นอกจากนี้ยังสามารถใช้ได้เป็นปลั๊กอิน Eclipse ไม่มีการพัฒนาอีกต่อไป

1
โปรดทราบว่าสิ่งที่ได้รับตอนนี้เปลี่ยนเป็นธงบรรทัดคำสั่งIGNORE_EXCEPTIONS -skip
พลวง



13

Sootเป็นตัวเลือกสำหรับโค้ด Java ที่ใหม่กว่า อย่างน้อยก็มีข้อดีของการยังคงถูกรักษาไว้เมื่อเร็ว ๆ นี้ ...

นอกจากนี้Java Decompilerเป็น Decompiler มีทั้ง GUI แบบสแตนด์อะโลนและบูรณาการคราส

สุดท้ายJdecยังไม่ได้รับการกล่าวถึงแม้ว่าจะไม่ขัดเท่าตัวเลือกอื่น ๆ


คุณรู้วิธีถอดรหัสไฟล์คลาสที่เป็นรูปธรรมด้วย Soot หรือไม่? ฉันไม่แน่ใจว่าเป็นไปได้ ...
Janus Troelsen

12

JD-GUIนั้นดีจริงๆ คุณสามารถเปิดไฟล์JARและเรียกดูรหัสราวกับว่าคุณกำลังทำงานกับ IDE สิ่งที่ดี.


11

นี่คือรายการของเครื่อง decompilers ณ ก.พ. 2558:

Procyonโอเพ่นซอร์สhttps://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler

CFR , ฟรี, ไม่มีซอร์สโค้ด, http://www.benf.org/other/cfr/

JDฟรีสำหรับการใช้ที่ไม่ใช่เชิงพาณิชย์เท่านั้นhttp://jd.benow.ca/

Fernflowerเปิดแหล่งที่มา, https://github.com/fesh0r/fernflower ,

JAD - ให้ไว้ที่นี่ด้วยเหตุผลทางประวัติศาสตร์เท่านั้น ฟรีไม่มีซอร์สโค้ดให้ใช้งานhttp://varaneckas.com/jad/ ล้าสมัยไม่ได้รับการสนับสนุนและไม่สามารถถอดรหัสได้อย่างถูกต้อง Java 5 และใหม่กว่า

คุณสามารถทดสอบเครื่อง Decompilers ดังกล่าวทางออนไลน์โดยไม่จำเป็นต้องทำการติดตั้งและทำการศึกษาที่คุณเลือกเอง

Java decompilers ในระบบคลาวด์: http://www.javadecompilers.com/


1
Procyon ทำงานได้ดีที่สุด !!!!
MarcoZen

10

มีโปรแกรมไม่กี่โปรแกรมที่คุณสามารถใช้ได้ คุณจะได้รับรหัส Java จริง แต่บางครั้งรหัสจะถูกทำให้งงงวยดังนั้นวิธีการตั้งชื่อโดยตัวอักษรหรือตัวเลขหนึ่งตัวหรือการผสมตัวอักษรและตัวเลขแบบสุ่ม

DJ Decompiler Mocha


9

decompilers ส่วนใหญ่สำหรับ Java จะขึ้นอยู่กับJAD มันเป็นเครื่องมือที่ยอดเยี่ยม แต่น่าเสียดายที่ยังไม่ได้รับการปรับปรุงชั่วขณะหนึ่งและไม่รองรับ Java 1.5+ คลาสได้เป็นอย่างดี ฉันไม่เคยเห็นเครื่องมือใด ๆ ที่จะจัดการกับคลาสอย่างน้อย 1.5+ อย่างถูกต้อง


3
ที่นี่คุณไป: ฉันเพิ่งโพสต์คำตอบสำหรับคำตอบของคุณ;) JDK1.5 และได้รับการสนับสนุนมากขึ้น!
VonC

"ฉันไม่เคยเห็นเครื่องมือใด ๆ ที่จะจัดการกับคลาส 1.5+ อย่างถูกต้อง" - Procion, Fernflower, JDCore และ CFR (อันนี้จัดการกับ Java 8!)
Andrew Rukin


6

ลิงก์ JAD ทั้งหมดที่อยู่ในรายการดูเหมือนจะไม่สามารถใช้งานได้ดังนั้นฉันจึงพบไซต์นี้ ใช้งานได้ดี (สำหรับ Linux อย่างน้อย)! บน Ubuntu 11.10 ฉันต้องดาวน์โหลดสแตติกหนึ่งอย่างไม่ว่าด้วยเหตุผลใด

http://www.varaneckas.com/jad



5

หากคุณต้องการดูว่าคอมไพเลอร์ Java ทำบางสิ่งได้อย่างไรคุณไม่ต้องการแยกส่วนประกอบคุณต้องการถอดแยกชิ้นส่วน การแยกส่วนเกี่ยวข้องกับการแปลง bytecode เป็นแหล่ง Java หมายความว่าข้อมูลระดับต่ำจำนวนมากสูญหายไปและหากคุณสงสัยเกี่ยวกับการปรับแต่งคอมไพเลอร์นี่อาจเป็นข้อมูลที่คุณสนใจ

อย่างไรก็ตามผมจะเกิดขึ้นจะได้เขียนมาเปิด Java disassembler ซึ่งแตกต่างจาก Javap วิธีนี้ใช้ได้ผลกับคลาสที่มีพยาธิสภาพสูงดังนั้นคุณสามารถดูว่าเครื่องมือทำให้งงงวยใดบ้างที่ทำกับคลาสของคุณเช่นกัน มันสามารถทำการแยกส่วนได้แม้ว่าฉันจะไม่แนะนำก็ตาม


4

JAD ไม่ทำงานสำหรับฉัน (Ubuntu 11.10 ปัญหา) ดังนั้นผมจึงได้ย้ายไปข้างหน้าและ sopped บนJodo อย่างน้อยก็มีซอร์สโค้ดของ Open Java และสามารถถอดรหัส. classของฉันได้อย่างถูกต้อง

ฉันแนะนำให้ไปที่สาขา 'สาขา / ทั่วไป'ก่อน ลำต้นไม่มั่นคง


1
JODO ได้รับการบำรุงรักษาเป็นระยะในขณะที่ CFR และ Procyon ได้รับการพัฒนาอย่างแข็งขันและมีการสนับสนุน JDK 8
Janus Troelsen

4

บนแพลตฟอร์ม IDEA IntelliJ คุณสามารถใช้Java Decompiler IntelliJ ปลั๊กอิน อนุญาตให้คุณแสดงซอร์ส Java ทั้งหมดในระหว่างกระบวนการดีบั๊กของคุณแม้ว่าคุณจะไม่ได้มีทั้งหมด มันขึ้นอยู่กับเครื่องมือที่มีชื่อเสียงJD-GUI

ป้อนคำอธิบายรูปภาพที่นี่


@ NoOP คุณเป็นหุ่นยนต์หรือเปล่า? หรือเพียงแค่ไม่ให้ความสนใจกับเรื่องที่รีวิว?
naXa

ขออภัยในตอนแรกดูเหมือนว่าลิงก์ตอบเท่านั้น บางทีคุณควรเพิ่มรายละเอียดเพิ่มเติมและคำตอบของคุณจะต้องสอดคล้องกับชื่อคำถามที่ไม่ได้มีเนื้อหาของคำถาม
ashiquzzaman33

สิ่งนี้ไม่ได้ให้คำตอบสำหรับคำถาม หากต้องการวิจารณ์หรือขอคำชี้แจงจากผู้แต่งโปรดแสดงความคิดเห็นใต้โพสต์ของพวกเขา
Kristijan Iliev

@ Chris คุณลองใช้วิธีแก้ปัญหาที่แนะนำแล้วหรือยัง? คุณยังอ่านคำถามหรือไม่
naXa

1
@ NoOP ขอโทษที่เป็นคนหยาบคาย = (ฉันมีคนวิจารณ์จำนวนมากที่ไม่ใส่ใจ
naXa

1

ด้วยAndroChef Java Decompilerคุณสามารถถอดรหัสไฟล์คลาส, apk, dex, jar และ java มันง่ายและสะดวก AndroChef JD จะขึ้นอยู่กับFernFlower คุณสามารถประเมินมันได้ฟรี 10 ครั้ง

AndroChef รองรับคุณสมบัติภาษา Java เช่นชื่อสามัญ, enums และคำอธิบายประกอบ จากการศึกษาบางอัน AndroChef Java Decompiler สามารถถอดรหัสแอพพลิเคชั่น Java 98.04% ที่สร้างด้วยคอมไพเลอร์ Java ดั้งเดิม - อัตราการกู้คืนที่สูงมาก มันเป็นเครื่องมือที่เรียบง่าย แต่ทรงพลังที่ช่วยให้คุณสามารถถอดรหัส Java และ Dalvik bytecode (DEX, APK) เป็นแหล่งจาวาที่อ่านได้


1
@Dimitrius โปรดอ่านคำตอบอย่างระมัดระวังระหว่างการตรวจสอบ คุณจินตนาการถึงการรวม FernFlower หรือ AndroChef ที่นี่ได้อย่างไร?
naXa

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.