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.