logo

자바 디컴파일러

Java 디컴파일러는 클래스 파일을 입력으로 사용하고 Java 소스 코드를 출력으로 생성하는 특별한 유형의 디컴파일러입니다. 디컴파일은 정확히 컴파일의 역과정입니다. 따라서 디컴파일러는 소스 코드의 복제본을 생성하지 않습니다. 이는 프로그램을 컴파일하는 동안 소스 코드에서 약간의 정보가 손실되었기 때문입니다.

그러나 예를 들어 Java 코드는 구조화되어 있고 바이트 코드는 구조화되지 않은 등 많은 복잡성이 있습니다. 더욱이 변환은 일대일이 아닙니다. 두 개의 서로 다른 Java 프로그램이 동일한 바이트 코드를 생성할 수 있습니다.

다음과 같은 Java 디컴파일러를 사용할 수 있습니다.

  • DJ 자바 디컴파일러
  • JReversePro
  • 유대인
  • JD-CORE/ JD-GUI/ JD 이클립스

JAD 디컴파일러

JAD는 명령줄 애플리케이션입니다. C++로 작성되었습니다. 주요 기능은 .class 파일을 분해하는 것입니다. JAD는 콘솔에서 배포할 수 있으며 Java 클래스를 소스 코드로 디컴파일합니다. 이런 방식으로 개발자는 Java 런타임 라이브러리의 코드를 자세히 살펴보고 라인을 아름답게 만들어 재컴파일을 준비할 수도 있습니다. 특히 '-o'(확인 없이 출력 파일 덮어쓰기) 매개변수를 사용하는 경우 소스 코드 파일을 덮어쓸 위험이 있습니다.

두 개의 숫자를 더하는 간단한 Java 프로그램을 만들어 보겠습니다.

 import java.util.*; class DecompilerDemo { public static void main(String args[]) { int a,b,c; Scanner sc=new Scanner(System.in); System.out.print('Enter the value of a: '); a=sc.nextInt(); System.out.print('Enter the value of b: '); b=sc.nextInt(); c=a+b; System.out.println('sum of a and b is: '+c); } } 

.class를 읽을 수 있는 Java 소스 코드로 변환하는 단계를 따르세요. 여기서는 JAD 디컴파일러를 사용하고 있습니다.

1 단계: 다음에서 JAD 도구를 다운로드하세요. https://bit.ly/2XuRzT5

2 단계: zip 파일의 압축을 풀고 jad.exe를 받으세요.

자바 디컴파일러

3단계: zip 파일을 추출한 동일한 폴더에 .java 파일(DecompilerDemo.java)을 생성합니다.

4단계: .java 파일을 컴파일하고 실행합니다. 해당 폴더에 .class 파일이 생성됩니다.

자바 디컴파일러2

5단계: 이제 .class 파일과 jad 애플리케이션을 다른 폴더로 이동합니다.

자바 디컴파일러3

6단계: 다음 명령을 입력하십시오. jad 디컴파일러데모

자바 디컴파일러4

위 명령은 해당 폴더에 .jad 파일을 생성합니다.

자바 디컴파일러5

7단계: 다음 명령을 입력하십시오. jad?s java DecompilerDemo

자바 디컴파일러6

동일한 폴더에 .java 파일을 생성합니다.

자바 디컴파일러7

DecompilerDemo.java를 열면 다음 코드가 표시됩니다.

 // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. // Jad home page: http://www.kpdus.com/jad.html // Decompiler options: packimports(3) // Source File Name: DecompilerDemo.java import java.io.PrintStream; import java.util.Scanner; class DecompilerDemo { DecompilerDemo() { } public static void main(String args[]) { Scanner scanner = new Scanner(System.in); System.out.print('Enter the value of a: '); int i = scanner.nextInt(); System.out.print('Enter the value of b: '); int j = scanner.nextInt(); int k = i + j; System.out.println((new StringBuilder()).append('sum of a and b is: ').append(k).toString()); } } 

작성된 .java 파일은 생성된 .java 파일과 다르지만 동일한 출력을 제공하는 것을 볼 수 있습니다.

Java 클래스 파일 디스어셈블러

javap 명령

그만큼 자바 JDK와 함께 제공되는 Java 명령줄 도구입니다. 이는 클래스 파일을 분해하고 해당 클래스의 사람이 읽을 수 있는 버전을 인쇄하는 데 사용됩니다. 출력은 사용된 옵션에 따라 다릅니다. 옵션을 사용하지 않고 javap는 전달된 클래스의 패키지, 보호 및 공용 필드와 메소드를 인쇄합니다. ㅏ 자바 클래스를 생성하는 데 사용된 소스 코드가 없는 경우 클래스에 사용할 수 있는 메서드를 찾는 데도 사용됩니다. javap 명령의 일반적인 형식은 다음과 같습니다.

 javap [options] filename 

옵션

javap 명령을 사용하면 다양한 옵션을 사용할 수 있습니다. 그 중 일부는 다음과 같습니다:

    -씨:디스어셈블된 코드를 인쇄합니다.-피:모든 클래스와 멤버를 보여줍니다.-에스:내부 유형 서명을 인쇄합니다.-상수:정적 최종 상수를 보여줍니다.

javap 명령을 사용하여 클래스 파일을 디스어셈블합니다.

 class DisassembleDemo { public static void main(String args[]) { System.out.println('Java'); } } 

위 프로그램의 클래스 파일을 생성하고 다음 명령을 사용하여 클래스 파일을 분해합니다.

 javap -c -p DisassembleDemo 

산출

경찰 부국장

다음 출력은 클래스 파일 내부 내용을 보여줍니다.

자바 디컴파일러8

하지만 javap 명령을 사용해도 Java 소스 코드를 얻을 수는 없습니다. 따라서 .class 파일을 .java 파일로 변환하는 데 사용할 수 있는 디컴파일러가 많이 있습니다.