Làm cách nào để dịch ngược toàn bộ tệp Jar? [đóng cửa]


283

Có ai biết về một trình dịch ngược miễn phí có thể dịch ngược toàn bộ tệp Jar thay vì một lớp không? Tôi có một vấn đề với các lớp con như tên $ 1. class name $ 2. class name. Class


127
Hãy nhớ hai điều nữa: 1) Việc chỉ đề cập đến một bộ dịch ngược sẽ khiến "thánh hơn cả bạn" xuất hiện và đưa ra những đánh giá giá trị về động cơ của bạn mặc dù không biết bạn sử dụng kế hoạch gì, vì vậy hãy cẩn thận khi nói chuyện với ai. 2) JavaDecompiler ưa thích sẽ cung cấp cho bạn một bản mã xuất sắc, được trình bày tốt và dễ đọc - chỉ thiếu các bình luận. Thật tuyệt vời, phục hồi một tệp JAR đã mất nguồn từ lâu với các tên biến. Tất nhiên, chúng tôi không làm xáo trộn các tệp JAR trong nhà của chúng tôi.
Andrew

Xem thêm nhận xét trong bài Chọn và kiểm tra trình dịch ngược java .
dma_k

8
Tôi đã dừng lại bởi chủ đề này rất nhiều lần khi tôi cần nghiên cứu cách ai đó hoàn thành một cái gì đó cho plugin Bukkit ... Nhận xét đó luôn để lại cho tôi một nụ cười. Tôi ước tôi có thể nâng cấp nó mỗi khi tôi dừng lại.
Jane Panda


Trình dịch ngược trực tuyến đơn giản nếu bạn không muốn tải xuống bất kỳ phần mềm nào. javadecompilers.com
Nick Graham

Câu trả lời:


313

2009: JavaDecompiler có thể thực hiện tốt công việc với jar: kể từ 0.2.5, Tất cả các tệp, trong các tệp JAR, được hiển thị.

http://java.decompiler.free.fr/sites/default/sc Greensshots / sc Muff1.png

Xem thêm câu hỏi "Làm thế nào để tôi dịch ngược các tệp lớp Java?" .

JD-Eclipse dường như không thay đổi kể từ cuối năm 2009 (xem Thay đổi ).
Vì vậy, sự tích hợp của nó với Eclipse mới nhất (3.8, 4.2+) có thể có vấn đề.

JD-Core được tích cực duy trì.

Cả hai đều là kết quả của công việc tuyệt vời của (người dùng SO) Emmanuel Dupuy .


2018: Một lựa chọn hiện đại hơn, được đề cập trong các bình luận của David Kennedy Araujo :

JetBrains / intellij-cộng đồng / plugin / java-dịch ngược / động cơ

Fernflower là trình dịch ngược phân tích thực sự hoạt động đầu tiên cho Java và có lẽ là ngôn ngữ lập trình cấp cao nói chung.

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\

Xem thêm Cách dịch ngược sang các tệp java ý tưởng intellij cho một lệnh làm việc với IntelliJ IDEA gần đây.


5
fyi, java dịch ngược hoạt động trên windows, mac và linux.
yanokwa

4
Đẹp @AlexS :) Bước tiếp theo: kiểm soát phiên bản ( stackoverflow.com/questions/59561/... ) Và sau đó liên tục Integration ( stackoverflow.com/questions/130592/... )
VonC

3
Với Trình dịch ngược Java, bạn có thể mở tệp JAR và đi đến Tệp, Lưu tất cả các nguồn. Nó lưu tất cả các tệp lớp vào các tệp java = D
Akira Yamamoto

2
Hãy nhớ rằng nó cũng có lỗi. Tôi có một lớp với một biến Thành viên và nó đã di chuyển nó đến tham số của hàm, phá hủy hiệu ứng của mã. Xem ra, nó sẽ giúp bạn
CharlesW

1
JD là một điểm khởi đầu tốt nhưng không dịch ngược mã phức tạp. Một thay thế tốt là sử dụng github.com/JetBrains/intellij-community/tree/master/plugins/ Kẻ
David Kennedy

37

Trước hết, đáng ghi nhớ rằng tất cả các tệp lưu trữ Java ( .jar/ .war/ etc ...) về cơ bản chỉ là .zipcác tệp ưa thích , với một vài biểu hiện và siêu dữ liệu được thêm vào.

Thứ hai, để giải quyết vấn đề này, cá nhân tôi sử dụng một số công cụ xử lý vấn đề này ở tất cả các cấp độ:

  • Jad + Jadclipse khi làm việc trong IDE để dịch ngược.classtệp
  • WinRAR , công cụ nén yêu thích của tôi vốn hỗ trợ lưu trữ Java (một lần nữa, xem đoạn đầu tiên).
  • Ngoài So sánh , công cụ tìm khác biệt yêu thích của tôi, khi được định cấu hình chính xác có thể thực hiện so sánh nhanh giữa bất kỳ tệp lưu trữ nào, bao gồmjars. Rất đáng để thử.

Ưu điểm của tất cả những điều đã nói ở trên là tôi không cần phải nắm giữ bất kỳ công cụ bên ngoài nào khác làm tắc nghẽn môi trường làm việc của tôi. Mọi thứ tôi cần từ một trong những tệp đó có thể được xử lý bên trong IDE của tôi hoặc khác với các tệp khác nguyên bản.


lolz tôi tiếp tục giải nén các tiện ích mở rộng chrome và firefox và tôi quên rằng .jar cũng chỉ là zips :)
Carter Cole

36

Nếu bạn có cả bash shell và 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

Tôi có thể là một chút, rất nhỏ với điều đó, nhưng nó sẽ hoạt động ít nhiều như quảng cáo. Bạn nên kết thúc với việc $JAR.tmpchứa các tệp dịch ngược của bạn.


1
trên ubuntu sử dụng # / bin / bash thay vì # / bin / sh becausw pushd doesnt làm việc cho mặc định ubuntu bao ...!
mossplix

1
Tôi đang sử dụng javaptrong cấu trúc vòng lặp cơ bản này và nó hoạt động với tôi.
Hoàng tử Chris

25

Tôi đã có thành công hợp lý với một công cụ có tên (bực bội) " JD: Java Decompiler ".

Tôi đã tìm thấy nó tốt hơn hầu hết các trình dịch ngược khi xử lý các lớp được biên dịch cho Java 5 trở lên . Thật không may, nó vẫn có thể có một số trục trặc trong đó JAD thường sẽ thành công.


Tôi không thể tải xuống phiên bản Windows hoặc Linux của JD-GUI. Có phải vấn đề này chỉ xuất hiện với tôi?
mmdemirbas

@JanusTroelsen Tôi đã xóa nó. Cảm ơn bạn đã thông báo nó. Hãy giữ câu trả lời sạch sẽ :)
pramodc84

@ Zero3: đã cập nhật
Gowtham Gopalakrishnan

11

Cái gì đó như:

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

có lẽ?


1
Tôi đã sử dụng jad một thời gian và cần một cách nhanh chóng để trích xuất và dịch ngược toàn bộ bình. Cảm ơn, điều này đã giúp rất nhiều.
Alper Akture

5

Chèn phần sau vào 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 // thực thi
  • ln -s ./decomplie.jar.s / usr / bin / dj

Sẵn sàng để sử dụng, chỉ cần gõ dj your.jarvà bạn sẽ nhận được your.jar.srcthư mục với các nguồn. Sử dụng -dtùy chọn cho chế độ gỡ lỗi.


Cảm ơn, nhưng phải đổi "jad" thành "./jad" trên dòng 23 và chạy "bash decompile.jar.sh foo.jar -d" vì tôi không muốn làm ô nhiễm thư mục bin của mình
Sam

bất kỳ trình biên dịch lại? biên dịch lại tập tin jad vào jar?
N Jay

2

Một tệp jar chỉ là một tệp zip với phần mở rộng jar. Bạn sẽ có thể giải nén (winzip) một jar giống như một tệp zip.


1

Bạn giải nén nó và sau đó sử dụng jad chống lại dir.


Tôi không nghĩ rằng bạn có thể chạy nó chống lại dir. Bạn sẽ phải chỉ định lớp {dir} / ** / *.
Vihung

Trích xuất cái lọ và sử dụng cái gì đó như jad {dir}, tôi vừa thử nó và không hoạt động trên windows
Jaime Hablutzel

1

Lưu ý: Giải pháp này chỉ hoạt động cho người dùng Mac và * nix.

Tôi cũng đã cố gắng tìm Jad không có may mắn. Giải pháp nhanh chóng của tôi là tải xuống MacJad có chứa jad. Khi bạn đã tải xuống, bạn có thể tìm thấy jad trong [where-you-download-macjad] / MacJAD / Nội dung / Tài nguyên / jad.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.