Làm thế nào để tôi dịch ngược các tập tin lớp Java Java? [đóng cửa]


556

Tôi có thể sử dụng chương trình nào để dịch ngược tệp lớp? Tôi thực sự sẽ nhận được mã Java hay chỉ là mã lắp ráp JVM?

Trong các câu hỏi về hiệu năng Java trên trang web này, tôi thường thấy các câu trả lời từ những người đã "dịch ngược" tệp lớp Java để xem cách trình biên dịch tối ưu hóa một số thứ nhất định.


4
Nghệ thuật "dịch ngược" cũng có thể được coi là kỹ thuật đảo ngược. Mặc dù đôi khi khi kỹ thuật đảo ngược một cái gì đó bạn không luôn có quyền truy cập vào nhị phân.
Makach

Không ai đề cập đến bytecodeviewer.com , có thể dịch ngược sang nguồn java và mã byte (đối với nguồn java dựa trên JAD).
Fernando Gonzalez Sanchez

Câu trả lời:


588

Cập nhật tháng 2 năm 2016:

www.javadecompilers.com liệt kê JAD là:

trình dịch ngược Java phổ biến nhất, nhưng chủ yếu chỉ ở độ tuổi này. Viết bằng C ++, nên rất nhanh.
Đã lỗi thời, không được hỗ trợ và không dịch ngược chính xác Java 5 trở lên

Vì vậy, số dặm của bạn có thể thay đổi với jdk gần đây (7, 8).

Cùng một trang web liệt kê các công cụ khác.

Và javadecompiler, như được ghi nhận bởi Salvador Valencia trong các bình luận (tháng 9 năm 2017), cung cấp một SaaS nơi bạn tải .classtệp lên đám mây và nó trả về cho bạn mã dịch ngược.


Câu trả lời gốc: Tháng Mười 2008

  • Bản phát hành cuối cùng của JSR 176, xác định các tính năng chính của J2SE 5.0 (Java SE 5), đã được xuất bản vào ngày 30 tháng 9 năm 2004.
  • Phiên bản Java mới nhất được JAD hỗ trợ, trình dịch ngược Java nổi tiếng được viết bởi ông Pavel Kouznetsov, là JDK 1.3 .
  • Hầu hết các trình dịch ngược Java có thể tải xuống ngày hôm nay từ Internet, chẳng hạn như dịch vụ giải mã Java DJ hoặc bộ giải mã Java Cavaj, được cung cấp bởi JAD: chúng không thể hiển thị các nguồn Java 5.

Trình dịch ngược Java (Tuy nhiên, một trình dịch ngược Java nhanh khác) có:

  • Hỗ trợ rõ ràng cho việc dịch ngược và phân tích các tệp Java 5+ .
  • Một GUI đẹp:

ảnh chụp màn hình

Nó hoạt động với các trình biên dịch từ JDK 1.1.8 cho đến JDK 1.7.0 và các trình biên dịch khác ( Jike , JRockit , v.v.).

Nó có một phiên bản demo trực tuyến thực sự đầy đủ chức năng! Bạn chỉ có thể thả một tệp jar trên trang và xem mã nguồn được dịch ngược mà không cần cài đặt bất cứ thứ gì.


5
+1 Điều đáng nói là nó cũng được mô đun hóa, do đó, lõi (được triển khai trong C ++) có thể được tận dụng ở nơi khác.
Quinn Taylor

1
jd-gui-0.3.3 cũng có sẵn ở đây
trả tiền

1
Trong trường hợp một người đã cài đặt trình biên dịch java java trên Eclipse Juno và Eclipse bắt đầu treo trên Khởi tạo DND của Marketplace buộc phải hủy toàn bộ quá trình: xóa jd. *. Jar khỏi thư mục trình cắm thêm của Eclipse chỉ sửa nó cho tôi.
LSerni

4
@Rishi giống như cách bạn bảo vệ IP của mình bằng bất kỳ ngôn ngữ hoặc nền tảng nào - luật sư giỏi. DRM chỉ là một dải băng.
Antimon

1
Bây giờ nó cung cấp SaaS nơi bạn tải tệp. Class lên đám mây và nó trả về cho bạn mã dịch ngược. Làm việc cho một POJO đơn giản.
Salvador Valencia

101

Có một vài dịch ngược trên mạng ... Một kết quả tìm kiếm nhanh:

  1. Procyon : mã nguồn mở (Apache 2) và được phát triển tích cực
  2. Krakatau : mã nguồn mở (GPLv3) và được phát triển tích cực
  3. CFR : mã nguồn mở (MIT) và được phát triển tích cực
  4. JAD
  5. Trình dịch ngược Java Java
  6. Mocha

Và nhiều thứ khác nữa.

Chúng tạo mã Java. Java đi kèm với một cái gì đó cho phép bạn xem mã byte JVM ( javap ).


2
Tôi cũng có thể thêm, Procyon, CFR, JAD và DJ có sẵn dưới dạng dịch vụ web: javadecompilers.com
Andrew Rukin

javadecompilers.com - người cứu hộ bro!
MarcoZen 8/2/2016

kpdus.com/jad.html là một số liên kết quảng cáo
marcinj 7/11/2016

Cảm ơn @marcinj, tôi đã tìm thấy một liên kết khác có liên kết để tải xuống.
billjamesdev

51

Để xem mã nguồn Java, hãy kiểm tra một số trình dịch ngược. Đi tìm jad .

Nếu bạn muốn xem mã byte, chỉ cần sử dụng javap đi kèm với JDK.


5
Thay vào đó, tôi khuyên dùng một trong những trình dịch ngược mã nguồn mở, vì chúng được phát triển tích cực. Sử dụng Procyon , bộ dịch ngược CFR hoặc Krakatau (Python) thay thế.
Janus Troelsen

29

Tôi đã thử một vài, và Procyon dường như làm việc tốt nhất cho tôi. Nó đang được phát triển tích cực và hỗ trợ nhiều tính năng của các phiên bản Java mới nhất.

Đây là những cái khác tôi đã thử:

  • CFR
    • Hứa hẹn, nhưng thường thất bại phương pháp dịch ngược. Tôi sẽ để mắt đến cái này Cũng tích cực phát triển với sự hỗ trợ cho các tính năng Java mới nhất.
  • Krakatau
    • Đưa ra một cách tiếp cận khác ở chỗ nó cố gắng tạo ra mã Java tương đương thay vì cố gắng xây dựng lại nguồn ban đầu, có khả năng làm cho nó tốt hơn cho mã bị xáo trộn. Từ thử nghiệm của tôi, nó gần như ngang bằng với Procyon, nhưng vẫn rất tuyệt khi có gì đó khác biệt. Tôi đã phải sử dụng -skipcờ dòng lệnh để nó không dừng lại ở các lỗi. Tích cực phát triển, và thật thú vị, nó được viết bằng Python.
  • JD-GUI
    • Đã hoạt động, nhưng sản lượng của Procyon tốt hơn nhiều. Đây là một trang so sánh đầu ra Procyon với JD-GUI gốc . JD-GUI cũng có sẵn như là một plugin Eclipse , hoàn toàn không hoạt động với tôi. Dường như không phải là nguồn mở và sự phát triển dường như lẻ tẻ.
  • JAD
    • Đã hoạt động, nhưng chỉ hỗ trợ Java 1.4 trở xuống. Cũng có sẵn như là một plugin Eclipse . Không còn được phát triển.

1
Lưu ý rằng IGNORE_EXCEPTIONSđiều bây giờ đã được thay đổi thành cờ dòng lệnh -skip.
Antimon



13

Soot là một tùy chọn cho mã Java mới hơn. Ít nhất nó có lợi thế là vẫn được duy trì gần đây ...

Ngoài ra, Trình dịch ngược Java là một trình dịch ngược có cả tích hợp GUI và Eclipse độc ​​lập.

Cuối cùng, Jdec đã không được đề cập, mặc dù nó không được đánh bóng như các tùy chọn khác.


Bạn có biết cách dịch ngược tệp lớp cụ thể bằng Soot không? Tôi không chắc là nó có thể ...
Janus Troelsen

12

JD-GUI thực sự tốt. Bạn chỉ có thể mở tệp JAR và duyệt qua mã như thể bạn đang làm việc trên IDE. Đồ tốt.


11

Dưới đây là danh sách các trình dịch ngược vào tháng 2 năm 2015:

Procyon , mã nguồn mở, https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler

CFR , miễn phí, không có mã nguồn có sẵn, http://www.benf.org/other/cfr/

JD , miễn phí cho chỉ sử dụng phi thương mại, http://jd.benow.ca/

Hoa hướng dương , mã nguồn mở, https://github.com/fesh0r/fernflower ,

JAD - được đưa ra ở đây chỉ vì lý do lịch sử. Miễn phí, không có mã nguồn có sẵn, http://varaneckas.com/jad/ lỗi thời, không được hỗ trợ và không dịch ngược chính xác Java 5 trở lên.

Bạn có thể kiểm tra trình dịch ngược được đề cập ở trên trực tuyến, không cần cài đặt và đưa ra lựa chọn có giáo dục của riêng bạn.

Trình dịch ngược Java trên đám mây: http://www.javadecompilers.com/


1
Procyon hoạt động tốt nhất !!!!
MarcoZen

10

Có một vài chương trình bạn có thể sử dụng. Bạn sẽ nhận được mã Java thực tế, nhưng đôi khi mã sẽ bị xáo trộn nên các phương thức được đặt tên bằng một chữ cái hoặc số hoặc kết hợp ngẫu nhiên các chữ cái và số.

DJ dịch ngược Mocha


9

Hầu hết các trình dịch ngược cho Java đều dựa trên JAD . Đây là một công cụ tuyệt vời, nhưng tiếc là đã không được cập nhật trong một thời gian và không xử lý tốt các lớp Java 1.5+. Tôi chưa thấy bất kỳ công cụ nào sẽ xử lý đúng hơn 1,5 lớp.


3
ở đây bạn đi: Tôi vừa đăng một câu trả lời cho câu trả lời của bạn;) JDK1.5 và được hỗ trợ nhiều hơn nữa!
VonC

"Tôi chưa thấy bất kỳ công cụ nào sẽ xử lý đúng hơn 1,5 lớp" - Procion, Fernflower, JDCore và CFR (công cụ này xử lý Java 8!)
Andrew Rukin


6

Tất cả các liên kết JAD được liệt kê cho đến nay dường như bị phá vỡ, vì vậy tôi tìm thấy trang web này. Hoạt động rất tốt (đối với Linux, ít nhất)! Trên Ubuntu 11.10, tôi phải tải xuống bản tĩnh vì bất kỳ lý do gì.

http://www.varaneckas.com/jad


5
  • JAD là một trong những hoạt động và đơn giản.

  • Ngoài ra, nếu bạn chỉ muốn xem các phương thức, hãy sử dụng javap.


5

Nếu bạn muốn xem trình biên dịch Java thực hiện một số điều nhất định, bạn không muốn dịch ngược, bạn muốn tháo gỡ. Dịch ngược bao gồm chuyển đổi mã byte thành nguồn Java, nghĩa là nhiều thông tin cấp thấp bị mất và nếu bạn đang tự hỏi về tối ưu hóa trình biên dịch, đây có lẽ là thông tin mà bạn quan tâm.

Dù sao, tôi tình cờ đã viết một trình dịch ngược Java mã nguồn mở . Không giống như Javap, điều này hoạt động ngay cả trên các lớp bệnh lý cao, vì vậy bạn có thể thấy các công cụ obfuscation đang làm gì cho các lớp của bạn. Nó cũng có thể thực hiện dịch ngược, mặc dù tôi không khuyên bạn nên dùng nó.


4

JAD không hoạt động với tôi (vấn đề Ubuntu 11.10) vì vậy tôi đã tiến lên và nhấm nháp JODO . Ít nhất là nó có mã nguồn Java mở và có thể dịch ngược đúng. Class của tôi .

Tôi khuyên bạn nên kiểm tra chi nhánh 'chi nhánh / chung' trước. Các thân cây không ổn định.


1
JODO được duy trì lẻ tẻ trong khi CFR và Procyon được tích cực phát triển và có hỗ trợ JDK 8.
Janus Troelsen

4

Trên nền tảng IntelliJ IDEA, bạn có thể sử dụng Trình giải mã IntelliJ của Java . Nó cho phép bạn hiển thị tất cả các nguồn Java trong quá trình gỡ lỗi của mình, ngay cả khi bạn không có tất cả các nguồn. Nó dựa trên các công cụ nổi tiếng JD-GUI .

nhập mô tả hình ảnh ở đây


@ NoOP's Bạn có phải là robot không? Hoặc chỉ không chú ý đến một chủ đề đánh giá?
naXa

Xin lỗi vì điều đó, thoạt nhìn có vẻ như link chỉ trả lời. Có lẽ bạn nên thêm chi tiết và câu trả lời của bạn chỉ tuân theo tiêu đề câu hỏi không có nội dung câu hỏi.
ashiquzzaman33

Điều này không cung cấp một câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ một tác giả, hãy để lại nhận xét bên dưới bài đăng của họ.
Kristijan Iliev

@Chris bạn đã thử giải pháp đề xuất chưa? Bạn thậm chí đã đọc câu hỏi ?
naXa

1
@ NoOP xin lỗi vì đã thô lỗ = (Tôi bị choáng ngợp bởi số lượng người đánh giá không chú ý.
naXa

1

Với AndroChef Java Decompiler, bạn có thể dịch ngược apk, dex, jar và các tệp lớp java. Thật đơn giản và dễ dàng. AndroChef JD dựa trên FernFlower . Bạn có thể đánh giá nó trong 10 lần sử dụng miễn phí.

AndroChef hỗ trợ các tính năng ngôn ngữ Java như generic, enums và chú thích. Theo một số nghiên cứu, AndroChef Java Decompiler có thể dịch ngược 98,04% ứng dụng Java được tạo bằng trình biên dịch Java truyền thống - tỷ lệ phục hồi rất cao. Nó là công cụ đơn giản nhưng mạnh mẽ cho phép bạn dịch ngược mã byte Java và Dalvik (DEX, APK) thành nguồn Java có thể đọc được.


1
@Dimitrius, vui lòng đọc kỹ câu trả lời trong quá trình đánh giá. Làm thế nào để bạn tưởng tượng bao gồm một FernFlower hoặc AndroChef ở đây?
naXa

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.