วิธีถอดรหัสไฟล์ Jar ทั้งหมด? [ปิด]


283

ไม่มีใครรู้ว่าตัวถอดรหัสฟรีที่สามารถถอดรหัสไฟล์ Jar ทั้งหมดแทนที่จะเป็นคลาสเดียวได้หรือไม่? ฉันมีปัญหากับคลาสย่อยเช่นชื่อ $ 1.class name $ 2.class name.class


127
โปรดจำไว้ว่ามีอีกสองสิ่ง: 1) เพียงเอ่ยถึง decompiler จะทำให้ "holier กว่าเจ้า" ออกมาและตัดสินคุณค่าเกี่ยวกับแรงจูงใจของคุณแม้จะไม่รู้ว่าการใช้งานตามแผนของคุณคืออะไร 2) JavaDecompiler ที่เป็นแฟนซีจะให้โค้ดที่ยอดเยี่ยมของคุณวางโครงสร้างได้ดีและง่ายต่อการอ่าน - ขาดความคิดเห็น มันเป็นเรื่องที่ดีอย่างน่าประหลาดใจการกู้คืนไฟล์ JAR ซึ่งมีแหล่งที่หายไปนานแล้วพร้อมชื่อตัวแปร แน่นอนว่าเราจะไม่ทำให้ไฟล์ JAR ของเรายุ่งเหยิง
แอนดรู

ดูเพิ่มเติมข้อสังเกตในการโพสต์เลือกและทดสอบ Java Decompiler
dma_k

8
ฉันหยุดโดยหัวข้อนี้หลายครั้งเมื่อฉันต้องการศึกษาว่ามีคนทำบางสิ่งบางอย่างให้กับปลั๊กอิน Bukkit ... ความคิดเห็นนั้นทำให้ฉันยิ้มได้เสมอ ฉันหวังว่าฉันจะโหวตได้ทุกครั้งที่แวะมา
Jane Panda

SecureTeam Java Decompilerสามารถทำเช่นนั้นได้
ซอฟต์แวร์ SecureTeam

Decompiler ออนไลน์ง่าย ๆ หากคุณไม่ต้องการดาวน์โหลดซอฟต์แวร์ใด ๆ javadecompilers.com
Nick Graham

คำตอบ:


313

2009: JavaDecompilerสามารถทำงานได้ดีกับ jar: ตั้งแต่ 0.2.5 ไฟล์ทั้งหมดในไฟล์ JAR จะถูกแสดง

http://java.decompiler.free.fr/sites/default/screenshots/screenshot1.png

ดูที่คำถาม "ฉันจะ" ถอดรหัส "ไฟล์คลาส Java ได้อย่างไร" .

ดูเหมือนว่า JD-Eclipse จะไม่เปลี่ยนแปลงไปตั้งแต่ปลายปี 2009 (ดูการเปลี่ยนแปลง )
ดังนั้นการรวมเข้ากับ Eclipse ล่าสุด (3.8, 4.2+) อาจเป็นปัญหาได้

JD-Core ได้รับการบำรุงรักษาอย่างแข็งขัน

ทั้งสองเป็นผลมาจากการทำงานที่ยอดเยี่ยมของผู้ใช้ (SO) เดอะเอ็มมานู Dupuy


2018: ตัวเลือกที่ทันสมัยกว่าที่กล่าวถึงในความคิดเห็นของDavid Kennedy Araujo :

JetBrains / IntelliJ ชุมชน / ปลั๊กอิน / java-Decompiler / เครื่องยนต์

Fernflower เป็นตัวแยกวิเคราะห์ตัวแรกที่ใช้งานได้จริงสำหรับ Java และอาจเป็นภาษาโปรแกรมระดับสูงโดยทั่วไป

java -jar fernflower.jar [-<option>=<value>]* [<source>]+ <destination>

java -jar fernflower.jar -hes=0 -hdc=0 c:\Temp\binary\ -e=c:\Java\rt.jar c:\Temp\source\

ดูเพิ่มเติมวิธีการถอดรหัสความคิด Intellij ของไฟล์ javaสำหรับคำสั่งที่ทำงานกับ IntelliJ IDEA ล่าสุด


5
fyi, decompiler java ใช้ได้กับ windows, mac และ linux
yanokwa

4
@AlexS nice :) ขั้นตอนต่อไป: การควบคุมเวอร์ชัน ( stackoverflow.com/questions/59561/ ...... ) จากนั้นบูรณาการอย่างต่อเนื่อง ( stackoverflow.com/questions/130592/… )
VonC

3
ด้วย Java Decompiler คุณสามารถเปิดไฟล์ JAR และไปที่ File, Save All Sources มันบันทึกไฟล์คลาสทั้งหมดลงในไฟล์ java = D
Akira Yamamoto

2
โปรดจำไว้ว่ามันทำให้เกิดข้อผิดพลาดเช่นกัน ฉันมีคลาสที่มีตัวแปร Member และมันย้ายไปยังพารามิเตอร์ของฟังก์ชันทำลายผลของโค้ด ระวังก็จะได้รับคุณ
CharlesW

1
JD เป็นจุดเริ่มต้นที่ดี แต่ไม่สามารถถอดรหัสรหัสที่ซับซ้อนได้ ทางเลือกที่ดีคือใช้github.com/JetBrains/intellij-community/tree/master/plugins/ …
David Kennedy

37

ก่อนอื่นควรจำไว้ว่าไฟล์เก็บถาวร Java ทั้งหมด ( .jar/ .war/ ฯลฯ ... ) นั้นเป็นเพียง.zipไฟล์แฟนซีโดยมีรายการและเมตาดาต้าที่เพิ่มเข้ามาเล็กน้อย

ประการที่สองเพื่อแก้ไขปัญหานี้ฉันใช้เครื่องมือหลายอย่างซึ่งจัดการปัญหานี้ในทุกระดับ:

  • Jad + Jadclipseขณะทำงานใน IDE สำหรับการถอดรหัส.classไฟล์
  • WinRARเครื่องมือบีบอัดที่ชื่นชอบสนับสนุนการเก็บถาวร Java (อีกครั้งโปรดดูย่อหน้าแรก)
  • นอกเหนือจากการเปรียบเทียบเครื่องมือ diff ที่ชื่นชอบเมื่อกำหนดค่าอย่างถูกต้องสามารถทำการเปรียบเทียบแบบทันทีระหว่างไฟล์เก็บถาวรใด ๆ รวมถึงjars คุ้มค่าที่จะลอง

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


lolz ฉันขยายโครเมี่ยมและ Firefox ส่วนขยายและฉันลืมไปว่า. jar ก็แค่รหัสไปรษณีย์ด้วยเช่นกัน :)
Carter Cole

36

หากคุณมีทั้ง bash shell และ jad:

JAR=(your jar file name)
unzip -d $JAR.tmp $JAR
pushd $JAR.tmp
for f in `find . -name '*.class'`; do
    jad -d $(dirname $f) -s java -lnc $f
done
popd

ฉันอาจจะเล็กไปหน่อย แต่สิ่งนี้ควรใช้ได้มากกว่าหรือน้อยกว่าที่โฆษณาไว้ คุณควรจะจบลงด้วยการ$JAR.tmpมีไฟล์ที่แปลแล้ว


1
บน ubuntu ใช้ #! / bin / bash แทน #! / bin / sh becausw pushd ไม่ทำงานสำหรับเชลล์ ubuntu เริ่มต้น ...
mossplix

1
ฉันใช้javapภายในโครงสร้างลูปพื้นฐานนี้และมันก็ใช้ได้สำหรับฉัน
Chris Prince

25

ฉันมีความสำเร็จที่สมเหตุสมผลด้วยเครื่องมือชื่อ (frustratingly) " JD: Java Decompiler "

ฉันได้พบมันได้ดีกว่า decompilers ที่สุดเมื่อต้องรับมือกับการเรียนการรวบรวมสำหรับ Java 5 และสูงกว่า น่าเสียดายที่มันยังคงมีอาการสะอึกที่ JAD จะประสบความสำเร็จตามปกติ


ฉันไม่สามารถดาวน์โหลด JD-GUI เวอร์ชัน Windows หรือ Linux ปัญหานี้เกิดขึ้นกับฉันหรือไม่
mmdemirbas

@JanusTroelsen ฉันลบมัน ขอบคุณสำหรับการแจ้งเตือน ช่วยรักษาคำตอบให้สะอาด :)
pramodc84

@ Zero3: อัพเดท
Gowtham Gopalakrishnan

11

สิ่งที่ต้องการ:

jar -xf foo.jar && find . -iname "*.class" | xargs /opt/local/bin/jad -r

อาจจะ?


1
ฉันใช้ jad มาระยะหนึ่งแล้วและต้องการวิธีที่รวดเร็วในการแยกและบีบอัดขวดทั้งหมด ขอบคุณสิ่งนี้ช่วยได้มาก
Alper Akture

5

ใส่ข้อมูลต่อไปนี้ลงใน decompile.jar.sh

# Usage: decompile.jar.sh some.jar [-d]

# clean target folders
function clean_target {
  rm -rf $unjar $src $jad_log
}

# clean all debug stuff
function clean_stuff {
  rm -rf $unjar $jad_log
}

# the main function
function work {
  jar=$1
  unjar=`basename $jar.unjar`
  src=`basename $jar.src`
  jad_log=jad.log

  clean_target

  unzip -q $jar -d $unjar
  jad -d $src -ff -r -lnc -o -s java $unjar/**/*.class > $jad_log 2>&1

  if [ ! $debug ]; then
    clean_stuff
  fi

  if [ -d $src ] 
    then
      echo "$jar has been decompiled to $src"
    else
      echo "Got some problems check output or run in debug mode"
  fi
}

function usage {
  echo "This script extract and decompile JAR file"
  echo "Usage: $0 some.jar [-d]"
  echo "    where: some.jar is the target to decompile"
  echo "    use -d for debug mode"
}

# check params
if [ -n "$1" ]
  then
    if [ "$2" == "-d" ]; then
      debug=true
      set -x
    fi
    work $1
  else
    usage
fi
  • chmod + x decomplie.jar.sh // executable
  • ln -s ./decomplie.jar.s / usr / bin / dj

พร้อมใช้งานเพียงพิมพ์dj your.jarแล้วคุณจะได้รับyour.jar.srcโฟลเดอร์พร้อมแหล่งที่มา ใช้-dตัวเลือกสำหรับโหมดดีบั๊ก


ขอขอบคุณ แต่ต้องเปลี่ยน "jad" เป็น "./jad" ในบรรทัดที่ 23 และเรียกใช้ "bash decompile.jar.sh foo.jar -d" เนื่องจากฉันไม่ต้องการทำให้โฟลเดอร์ถังขยะของฉันสกปรก
Sam

recompiler ใด ๆ คอมไพล์ไฟล์ jad อีกครั้งใน jar?
N Jay

2

ไฟล์ jar เป็นไฟล์ zip ที่มีส่วนขยาย jar คุณควรจะ unzip (winzip) jar เหมือนไฟล์ zip


1

คุณแยกมันแล้วใช้ jad กับ dir


ฉันไม่คิดว่าคุณสามารถเรียกใช้กับ dir คุณจะต้องระบุ {dir} / ** / *. class
Vihung

แตกไหและใช้อย่าง jad {dir} ฉันเพิ่งทดสอบและไม่ทำงานบน windows
Jaime Hablutzel

1

หมายเหตุ: วิธีนี้ใช้ได้กับผู้ใช้ Mac และ * nix เท่านั้น

ฉันยังพยายามค้นหาจาดโดยไม่มีโชค ทางออกที่รวดเร็วของฉันคือการดาวน์โหลดMacJadที่มี jad เมื่อคุณดาวน์โหลดแล้วคุณสามารถค้นหา jad ได้ใน [where-you-download-macjad] / MacJAD / เนื้อหา / ทรัพยากร / jad

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