ฉันจะเปิดไฟล์ Java .class ด้วยวิธีที่มนุษย์อ่านได้อย่างไร


111

ฉันกำลังพยายามหาว่าไฟล์คลาสของ Java applet กำลังทำอะไรอยู่ภายใต้ประทุน การเปิดด้วย Notepad หรือ Textpad จะแสดงให้เห็นกลุ่มของ gobbledy-gook

มีวิธีใดบ้างที่จะทำให้มันกลับมาเป็นรูปแบบที่ค่อนข้างอ่านได้เพื่อที่ฉันจะได้ลองคิดดูว่ามันกำลังทำอะไรอยู่

  • สภาพแวดล้อม == ติดตั้ง Windows w / VS 2008

7
แค่ความหมายมันไม่ควรเป็นหนึ่ง = ไม่ใช่สอง? == เป็นคำถามในขณะที่ = เป็นคำสั่งและคุณกำลังแถลงเกี่ยวกับสภาพแวดล้อมของคุณ
icco

คุณสามารถชี้แจงคำถามนี้ได้หรือไม่? ความคิดทันทีของฉันคือคุณต้องการอ่าน bytecode จริง แต่ดูเหมือนว่าคุณต้องการถอดรหัสรหัสของคนอื่นจริงๆ
Outlaw Programmer

12
@icco = หมายถึงการมอบหมาย == หมายถึงความเท่าเทียมกัน เขากำลังบอกว่า (สภาพแวดล้อม == ติดตั้ง Windows w / VS2008) เป็นจริงไม่ได้สั่งให้ตั้งค่าสภาพแวดล้อมเป็น Windows ที่ติดตั้ง VS2008 ผู้ชายที่ไม่เหมือนใครและโง่เขลา
Blorgbeard ออก

7
สำหรับบันทึก == ไม่ได้ประกาศความเท่าเทียมกัน มันทดสอบความเท่าเทียมกัน คุณสามารถเขียน true == false และมีความหมายเท่ากับการเขียน Environment == ติดตั้ง Windows w / VS 2008 กล่าวคือไม่มีความหมายเลย
bwerks

คำตอบ:


208

jd-guiเป็นตัวถอดรหัสที่ดีที่สุดในขณะนี้ มันสามารถจัดการคุณสมบัติที่ใหม่กว่าใน Java เมื่อเทียบกับ JAD ที่เต็มไปด้วยฝุ่น


1
คำตอบนี้เป็นปัจจุบันเพียงใดในปี 2020
The Coding Wombat

ตราบใดที่ลิงก์ไปที่ไหนสักแห่งฉันคิดว่ามันดี ฉันไม่รู้ว่าตอนนี้มีตัวถอดรหัส Java ที่ดีกว่าหรือไม่เพราะฉันไม่ได้ใช้ Java มานานแล้ว
DarenW

77

หากคุณไม่สนใจที่จะอ่าน bytecode javap ควรใช้งานได้ดี เป็นส่วนหนึ่งของการติดตั้ง JDK มาตรฐาน

Usage: javap <options> <classes>...

where options include:
   -c                        Disassemble the code
   -classpath <pathlist>     Specify where to find user class files
   -extdirs <dirs>           Override location of installed extensions
   -help                     Print this usage message
   -J<flag>                  Pass <flag> directly to the runtime system
   -l                        Print line number and local variable tables
   -public                   Show only public classes and members
   -protected                Show protected/public classes and members
   -package                  Show package/protected/public classes
                             and members (default)
   -private                  Show all classes and members
   -s                        Print internal type signatures
   -bootclasspath <pathlist> Override location of class files loaded
                             by the bootstrap class loader
   -verbose                  Print stack size, number of locals and args for methods
                             If verifying, print reasons for failure

9

ตามที่ @MichaelMyers ชี้ให้ใช้

javap -c <name of java class file> 

เพื่อรับรหัสแอสเซมบลี JVM คุณยังสามารถเปลี่ยนเส้นทางผลลัพธ์ไปยังไฟล์ข้อความเพื่อการมองเห็นที่ดีขึ้น

javap -c <name of java class file> > decompiled.txt

7

คุณต้องการตัวถอดรหัส java คุณสามารถใช้เครื่องมือบรรทัดคำสั่งjavapเพื่อทำสิ่งนี้ นอกจากนี้Java Decompiler HOW-TO ยังอธิบายถึงวิธีที่คุณสามารถถอดรหัสไฟล์คลาสได้


2

สิ่งที่คุณกำลังมองหาคือ java de-compiler ฉันแนะนำ JAD http://www.kpdus.com/jad.html ฟรีสำหรับการใช้งานที่ไม่ใช่เชิงพาณิชย์และทำงานให้เสร็จ

หมายเหตุ: สิ่งนี้จะไม่ทำให้โค้ดเหมือนกับสิ่งที่เขียน กล่าวคือคุณจะสูญเสียความคิดเห็นและอาจเป็นชื่อตัวแปรดังนั้นมันจะยากกว่าการอ่านซอร์สโค้ดปกติเล็กน้อย หากนักพัฒนาเป็นความลับจริงๆพวกเขาก็จะทำให้โค้ดของพวกเขาสับสนเช่นกันทำให้อ่านยากขึ้น


2

cpuguru หากแอพเพล็ตของคุณได้รับการคอมไพล์ด้วย javac 1.3 (หรือน้อยกว่า) ตัวเลือกที่ดีที่สุดของคุณคือใช้ Jad

น่าเสียดายที่ JDK ล่าสุดที่รองรับโดย JAD 1.5.8 (14 เมษายน 2544) คือ JDK 1.3

หากแอพเพล็ตของคุณได้รับการคอมไพเลอร์ด้วยคอมไพเลอร์ล่าสุดคุณสามารถลองใช้JD-GUI : ตัวถอดรหัสนี้อยู่ระหว่างการพัฒนาอย่างไรก็ตามจะสร้างซอร์ส Java ที่ถูกต้องโดยส่วนใหญ่สำหรับคลาสที่คอมไพล์ด้วย JDKs 1.4, 1.5 หรือ 1.6

DarenW ขอบคุณสำหรับโพสต์ของคุณ JD-GUI ยังไม่ใช่ตัวถอดรหัสที่ดีที่สุด ... แต่ฉันกำลังทำอยู่ :)



2

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



1

คุณต้องใช้ตัวถอดรหัส คนอื่นแนะนำ JAD มีตัวเลือกอื่น JAD ดีที่สุด

ฉันจะสะท้อนความคิดเห็นที่คุณอาจเสียไปเล็กน้อยเมื่อเทียบกับซอร์สโค้ดเดิม มันจะดูตลกเป็นพิเศษถ้าโค้ดใช้ generics เนื่องจากการลบ



1

หากไฟล์คลาสที่คุณต้องการดูเป็นโอเพนซอร์สคุณไม่ควรแยกไฟล์ แต่แนบไฟล์ต้นฉบับลงใน IDE ของคุณโดยตรง ด้วยวิธีนี้คุณสามารถดูโค้ดของคลาสไลบรารีบางคลาสราวกับว่าเป็นของคุณเอง


0

ตามที่แนะนำคุณสามารถใช้ JAD เพื่อถอดรหัสและดูไฟล์ได้ เพื่อให้อ่านง่ายขึ้นคุณสามารถใช้ปลั๊กอิน JADclipse สำหรับ eclipse เพื่อรวม JAD เข้ากับ eclipse โดยตรงหรือใช้ DJ Java Decompiler ซึ่งใช้งานง่ายกว่าบรรทัดคำสั่ง JAD


0

JAD เป็นตัวเลือกที่ยอดเยี่ยมหากคุณต้องการใช้โค้ด Java ที่อ่านได้ ถ้าคุณอยากจะขุดลงไปใน internals ของรูปแบบไฟล์แม้ว่าคุณจะต้องการ.class javapมันมาพร้อมกับ JDK และช่วยให้คุณสามารถ "ถอดรหัส" ไบต์โค้ดฐานสิบหกเป็น ASCII ที่อ่านได้ ภาษาที่สร้างยังคงเป็น bytecode (ไม่ใช่อะไรเลยเช่น Java) แต่มันค่อนข้างอ่านได้และให้คำแนะนำอย่างมาก

นอกจากนี้หากคุณต้องการจริงๆคุณสามารถเปิด.classไฟล์ใดก็ได้ในโปรแกรมแก้ไขเลขฐานสิบหกและอ่านรหัสไบต์โดยตรง javapผลที่ได้คือเหมือนกันกับการใช้


0

ไม่จำเป็นต้องถอดรหัส Applet.class ซอร์สโค้ดคลาส Java API สาธารณะมาพร้อมกับ JDK (หากคุณเลือกที่จะติดตั้ง) และอ่านได้ดีกว่า bytecode ที่ถอดรหัส คุณสามารถค้นหาการบีบอัดใน src.zip (อยู่ในโฟลเดอร์การติดตั้ง JDK ของคุณ)



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