Java 클래스 파일을 어떻게 "디 컴파일"합니까? [닫은]


556

클래스 파일을 디 컴파일하기 위해 어떤 프로그램을 사용할 수 있습니까? 실제로 Java 코드를 받습니까 아니면 JVM 어셈블리 코드입니까?

이 사이트의 Java 성능 관련 질문에서, 종종 Java 클래스 파일을 "디 컴파일"한 사람들의 응답을보고 컴파일러가 특정 사항을 최적화하는 방법을 확인합니다.


4
"디 컴파일"기술은 리버스 엔지니어링으로 생각할 수도 있습니다. 때로는 리버스 엔지니어링을 할 때 항상 바이너리에 액세스 할 수있는 것은 아닙니다.
Makach 2016 년

아무도 bytecodeviewer.com을 언급하지 않았는데 , 이는 java 소스와 바이트 코드로 디 컴파일 할 수 있습니다 (java 소스의 경우 JAD를 기반으로 함).
페르난도 곤잘레스 산체스

답변:


588

2016 년 2 월 업데이트 :

www.javadecompilers.com 은 JAD를 다음과 같이 나열합니다.

가장 인기있는 Java 디 컴파일러이지만 주로이 시대에만 사용됩니다. C ++로 작성되었으므로 매우 빠릅니다.
오래되고 지원되지 않으며 올바르게 Java 5 이상을 디 컴파일하지 않습니다.

따라서 마일리지는 최근 jdk (7, 8)에 따라 다를 수 있습니다.

동일한 사이트에 다른 도구가 나열됩니다.

Salvador Valencia주석 (2017 년 9 월) 에 언급 한 바와 같이 javadecompiler 는 .class파일을 클라우드에 업로드 하고 디 컴파일 된 코드를 반환 하는 SaaS를 제공합니다 .


원래 답변 : 2008 년 10 월

  • J2SE 5.0 (Java SE 5)의 주요 기능을 정의하는 JSR 176의 최종 릴리스는 2004 년 9 월 30 일에 공개되었습니다.
  • Pavel Kouznetsov가 작성한 유명한 Java 디 컴파일러 인 JAD가 지원하는 최신 Java 버전은 JDK 1.3 입니다.
  • "DJ Java Decompiler"또는 "Cavaj Java Decompiler"와 같이 오늘날 인터넷에서 다운로드 할 수있는 대부분의 Java 디 컴파일러는 JAD에 의해 구동되며 Java 5 소스를 표시 할 수 없습니다.

Java Decompiler (아직 다른 Fast Java 디 컴파일러)에는 다음이 있습니다.

  • Java 5+ ".class"파일의 디 컴파일 및 분석을위한 명시 적 지원
  • 좋은 GUI :

스크린 샷

JDK 1.1.8에서 JDK 1.7.0까지의 컴파일러 및 기타 ( Jikes , JRockit 등) 와 함께 작동합니다 .

실제로 완벽하게 작동 하는 온라인 라이브 데모 버전 이 있습니다! 페이지에 jar 파일을 드롭하고 아무것도 설치하지 않고 디 컴파일 된 소스 코드를 볼 수 있습니다.


5
+1 모듈화되어 있으므로 코어 (C ++로 구현)를 다른 곳에서 활용할 수 있습니다.
Quinn Taylor

1
JD-GUI-0.3.3도 가능합니다 여기에
amaidment

1
경우 하나의 이클립스 주노에서 이클립스 자바 디 컴파일러 플러그인을 설치하고, 이클립스는 전체 프로세스를 죽이고 강제 마켓 플레이스 DND 초기화에 매달려 시작 :.. 법학을 제거하는 * 항아리 이클립스 플러그인 디렉토리에서 그냥 날 위해 그것을 해결했습니다.
LSerni

4
@Rishi는 변호사 나 모든 언어 또는 플랫폼에서 IP를 보호하는 것과 같은 방법입니다. DRM은 반창고 일뿐입니다.
안티몬

1
이제 .class 파일을 클라우드에 업로드하고 디 컴파일 된 코드를 반환하는 SaaS를 제공합니다. 간단한 POJO를 위해 일했습니다.
살바도르 발렌시아

101

디 컴파일러가 몇 개 있습니다 ... 빠른 검색 결과 :

  1. 프로키온 : 오픈 소스 (Apache 2) 및 적극적으로 개발
  2. 크라 카타 우 : 오픈 소스 (GPLv3) 및 적극적으로 개발
  3. CFR : 오픈 소스 (MIT) 및 적극적으로 개발
  4. JAD
  5. DJ 자바 디 컴파일러
  6. 모카

그리고 더 많은.

이것들은 Java 코드를 생성합니다. Java에는 JVM 바이트 코드 ( javap ) 를 볼 수있는 기능이 있습니다 .


2
또한 Procyon, CFR, JAD 및 DJ를 웹 서비스로 사용할 수 있다고 덧붙일
Andrew Rukin

javadecompilers.com- 생명의 은인 형제!
MarcoZen

kpdus.com/jad.html 은 AD 링크입니다
marcinj

@marcinj에게 감사드립니다. 다운로드 할 수있는 다른 링크가 있습니다.
billjamesdev

51

Java 소스 코드를 보려면 디 컴파일러를 확인하십시오. jad 검색으로 이동하십시오 .

바이트 코드를 보려면 JDK와 함께 제공되는 javap 를 사용하십시오 .


5
대신 오픈 소스 디 컴파일러 중 하나를 사용하는 것이 좋습니다. 대신 Procyon , CFR 디 컴파일러 또는 Krakatau (Python)를 사용하십시오.
야누스 Troelsen

29

나는 여러 가지를 시도했지만 Procyon 은 나에게 가장 잘 작동하는 것처럼 보였다. 현재 개발 중이며 최신 Java 버전의 많은 기능을 지원합니다.

이것들은 내가 시도한 다른 것입니다.

  • CFR
    • 유망하지만 종종 메소드 디 컴파일에 실패했습니다. 나는 이것에 계속 내 눈을 유지합니다. 또한 최신 Java 기능을 지원하여 적극적으로 개발되었습니다.
  • 크라 카타 우
    • 원본 소스를 재구성하는 대신 동등한 Java 코드를 출력하려고 시도하는 다른 접근 방식을 취합니다. 내 테스트에서 Procyon과 거의 비슷한 수준이지만 여전히 다른 것이 좋습니다. -skip오류가 발생하지 않도록 명령 줄 플래그 를 사용해야했습니다 . 적극적으로 개발되었고 흥미롭게도 파이썬으로 작성되었습니다.
  • JD-GUI
  • JAD
    • 작동했지만 Java 1.4 이하 만 지원합니다. Eclipse 플러그인 으로도 사용 가능 합니다. 더 이상 개발 중이 아닙니다.

1
점을 유의 IGNORE_EXCEPTIONS것은 이제 명령 줄 플래그로 변경되었습니다 -skip.
안티몬



13

그을음 은 최신 Java 코드를위한 옵션입니다. 적어도 그것은 여전히 ​​최근에 유지되고 있다는 장점이 있습니다 ...

또한 Java Decompiler 는 독립형 GUI와 Eclipse 통합을 모두 갖춘 디 컴파일러입니다.

마지막으로 Jdec 은 언급되지 않았지만 다른 옵션만큼 세련되지는 않았습니다.


Soot로 구체적인 클래스 파일을 디 컴파일하는 방법을 알고 있습니까? 나는 확실히 그것을 ... 가능 아니에요
야누스 Troelsen

12

JD-GUI 는 정말 좋습니다. JAR 파일을 열고 IDE에서 작업하는 것처럼 코드를 탐색 할 수 있습니다. 좋은 물건.


11

2015 년 2 월 기준으로 디 컴파일러 목록은 다음과 같습니다.

프로키온 , 오픈 소스, https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler

CFR , 무료, 소스 코드 없음, http://www.benf.org/other/cfr/

JD , 비상업적 용도로만 무료, http://jd.benow.ca/

Fernflower , 공개 소스, https://github.com/fesh0r/fernflower ,

JAD는 - 단지 역사적 이유가 여기에 주어진. 무료, 소스 코드 없음, http://varaneckas.com/jad/ 오래되고 지원되지 않으며 Java 5 이상을 올바르게 디 컴파일하지 않습니다.

위에서 언급 한 디 컴파일러를 온라인으로 테스트 할 수 있으며 설치가 필요 없으며 원하는 교육을 선택할 수 있습니다.

클라우드의 Java 디 컴파일러 : http://www.javadecompilers.com/


1
프로키온이 가장 잘 작동합니다 !!!!
MarcoZen

10

사용할 수있는 몇 가지 프로그램이 있습니다. 실제 Java 코드를 얻을 수 있지만 때로는 코드가 난독 화되어 메소드가 하나의 문자 또는 숫자 또는 임의의 문자와 숫자의 조합으로 이름이 지정됩니다.

DJ 디 컴파일러 모카


9

Java를위한 대부분의 디 컴파일러는 JAD를 기반으로 합니다. 훌륭한 도구이지만 불행히도 한동안 업데이트되지 않았으며 Java 1.5 + 클래스를 잘 처리하지 못합니다. 1.5 + 클래스를 올바르게 처리하는 도구를 보지 못했습니다.


3
여기 당신이 간다 : 나는 당신의 답변에 대한 답변을 방금 게시했습니다.) JDK1.5 이상이 지원됩니다!
VonC

Procion, Fernflower, JDCore 및 CFR (이 핸들 자바 8!) - "나는 제대로 1.5 클래스 처리 할 수있는 도구를 보지 못했다"
앤드류 Rukin


6

지금까지 나열된 모든 JAD 링크가 끊어진 것 같습니다.이 사이트를 찾았습니다. 훌륭하게 작동합니다 (적어도 Linux의 경우)! 우분투 11.10에서는 어떤 이유로 든 정적 파일을 다운로드해야했습니다.

http://www.varaneckas.com/jad



5

Java 컴파일러가 특정 작업을 수행하는 방법을 보려면 디 컴파일을 원하지 않고 분해하고 싶습니다. 디 컴파일에는 바이트 코드를 Java 소스로 변환하는 것이 포함됩니다. 즉, 많은 저수준 정보가 손실되며 컴파일러 최적화에 대해 궁금한 경우 관심이있는 정보 일 것입니다.

어쨌든 오픈 소스 Java 디스어셈블러를 작성했습니다 . Javap와 달리 이것은 병리학 적 클래스에서도 작동하므로 난독 화 도구가 클래스에서 수행하는 작업을 볼 수 있습니다. 권장하지는 않지만 디 컴파일을 수행 할 수도 있습니다.


4

JAD는 나를 위해 작동하지 않으므로 (Ubuntu 11.10 문제) 앞으로 나아가서 JODO에 뛰어 들었습니다 . 적어도 Open Java 소스 코드가 있고 내 .class를 올바르게 디 컴파일 할 수있었습니다 .

먼저 '분기 / 일반' 분기 를 확인하는 것이 좋습니다 . 트렁크가 안정적이지 않습니다.


1
CFR과 Procyon이 적극적으로 개발되고 JDK 8을 지원하는 동안 JODO는 산발적으로 유지 됩니다.
야누스 Troelsen

4

IntelliJ IDEA 플랫폼에서는 Java Decompiler IntelliJ Plugin을 사용할 수 있습니다 . 디버깅 프로세스 중에 모든 Java 소스가없는 경우에도 모든 Java 소스를 표시 할 수 있습니다. 유명한 도구 JD-GUI를 기반으로합니다 .

여기에 이미지 설명을 입력하십시오


@ NoOP 's 로봇입니까? 아니면 검토 주제에주의를 기울이지 않습니까?
naXa

죄송합니다. 언뜻보기에는 링크 전용 답변 인 것 같습니다. 자세한 내용을 추가해야하며 답변이 질문 내용이 아닌 질문 제목 만 준수해야합니다.
ashiquzzaman33

이것은 질문에 대한 답변을 제공하지 않습니다. 저자에게 비평을하거나 설명을 요청하려면 게시물 아래에 의견을 남겨주십시오.
Kristijan Iliev

@Chris 제안 된 솔루션을 사용해 보셨습니까? 당신 은 질문을 읽었 습니까?
naXa

1
@NoOP는 무례하게되어서 유감입니다 = (주의를 기울이지 않는 리뷰어 수에 압도되어 있습니다.
naXa

1

AndroChef Java Decompiler 를 사용하면 apk, dex, jar 및 java 클래스 파일을 디 컴파일 할 수 있습니다. 간단하고 쉽습니다. AndroChef JD는 FernFlower를 기반으로 합니다 . 10 번의 무료 사용으로 평가할 수 있습니다.

AndroChef는 제네릭, 열거 형 및 주석과 같은 Java 언어 기능을 지원합니다. 일부 연구에 따르면 AndroChef Java Decompiler는 전통적인 Java 컴파일러로 생성 된 Java 응용 프로그램의 98.04 %를 매우 높은 복구 속도로 디 컴파일 할 수 있습니다. Java 및 Dalvik 바이트 코드 (DEX, APK)를 읽을 수있는 Java 소스로 디 컴파일 할 수있는 간단하지만 강력한 도구입니다.


1
@ 디미트리 우스, 검토하는 동안 답변을주의 깊게 읽으십시오. 여기 FernFlower 또는 AndroChef를 포함시키는 것을 어떻게 상상하십니까?
naXa

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.