ไม่มีใครรู้ว่าตัวถอดรหัสฟรีที่สามารถถอดรหัสไฟล์ Jar ทั้งหมดแทนที่จะเป็นคลาสเดียวได้หรือไม่? ฉันมีปัญหากับคลาสย่อยเช่นชื่อ $ 1.class name $ 2.class name.class
ไม่มีใครรู้ว่าตัวถอดรหัสฟรีที่สามารถถอดรหัสไฟล์ Jar ทั้งหมดแทนที่จะเป็นคลาสเดียวได้หรือไม่? ฉันมีปัญหากับคลาสย่อยเช่นชื่อ $ 1.class name $ 2.class name.class
คำตอบ:
2009: JavaDecompilerสามารถทำงานได้ดีกับ jar: ตั้งแต่ 0.2.5 ไฟล์ทั้งหมดในไฟล์ JAR จะถูกแสดง
ดูที่คำถาม "ฉันจะ" ถอดรหัส "ไฟล์คลาส 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 ล่าสุด
ก่อนอื่นควรจำไว้ว่าไฟล์เก็บถาวร Java ทั้งหมด ( .jar
/ .war
/ ฯลฯ ... ) นั้นเป็นเพียง.zip
ไฟล์แฟนซีโดยมีรายการและเมตาดาต้าที่เพิ่มเข้ามาเล็กน้อย
ประการที่สองเพื่อแก้ไขปัญหานี้ฉันใช้เครื่องมือหลายอย่างซึ่งจัดการปัญหานี้ในทุกระดับ:
.class
ไฟล์jar
s คุ้มค่าที่จะลองข้อได้เปรียบของทั้งหมดข้างต้นคือฉันไม่จำเป็นต้องถือเครื่องมือภายนอกอื่นใดที่ทำให้สภาพแวดล้อมการทำงานของฉันไม่เหมือนกัน ทุกอย่างที่ฉันต้องการจากไฟล์เหล่านั้นสามารถจัดการได้ภายใน IDE ของฉันหรือแตกต่างกับไฟล์อื่น ๆ โดยกำเนิด
หากคุณมีทั้ง 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
มีไฟล์ที่แปลแล้ว
javap
ภายในโครงสร้างลูปพื้นฐานนี้และมันก็ใช้ได้สำหรับฉัน
ฉันมีความสำเร็จที่สมเหตุสมผลด้วยเครื่องมือชื่อ (frustratingly) " JD: Java Decompiler "
ฉันได้พบมันได้ดีกว่า decompilers ที่สุดเมื่อต้องรับมือกับการเรียนการรวบรวมสำหรับ Java 5 และสูงกว่า น่าเสียดายที่มันยังคงมีอาการสะอึกที่ JAD จะประสบความสำเร็จตามปกติ
สิ่งที่ต้องการ:
jar -xf foo.jar && find . -iname "*.class" | xargs /opt/local/bin/jad -r
อาจจะ?
ใส่ข้อมูลต่อไปนี้ลงใน 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
พร้อมใช้งานเพียงพิมพ์dj your.jar
แล้วคุณจะได้รับyour.jar.src
โฟลเดอร์พร้อมแหล่งที่มา ใช้-d
ตัวเลือกสำหรับโหมดดีบั๊ก
ไฟล์ jar เป็นไฟล์ zip ที่มีส่วนขยาย jar คุณควรจะ unzip (winzip) jar เหมือนไฟล์ zip
คุณแยกมันแล้วใช้ jad กับ dir
หมายเหตุ: วิธีนี้ใช้ได้กับผู้ใช้ Mac และ * nix เท่านั้น
ฉันยังพยายามค้นหาจาดโดยไม่มีโชค ทางออกที่รวดเร็วของฉันคือการดาวน์โหลดMacJadที่มี jad เมื่อคุณดาวน์โหลดแล้วคุณสามารถค้นหา jad ได้ใน [where-you-download-macjad] / MacJAD / เนื้อหา / ทรัพยากร / jad