Java 디컴파일러 JD-GUI 사용하기

2018년 11월 16일

java_de_compile

Java의 특성인 프로세스 독립적인 언어는 역 컴파일이 가능한 구조를 가지게 됩니다. Java는 컴파일러를 통해서 .java 파일을 바이트 코드로 컴파일 된 .class 파일로 만들지만 역 컴파일을 진행하면 .class 파일을 .java 파일로 되돌릴 수 있습니다.

이런 작업은 C#에서도 가능한데, C#의 역 컴파일 도구는 너무 잘 만들어서 자기가 만든 코드를 다시 역 컴파일 하는 경우 더 깔끔해진 코드가 반환되기도 했습니다.

소스가 공개될 수 있다는 이유로 예전에는 난독화 프로그램을 사용하여 역 컴파일 된 소스를 이해하기 어렵게 만들었습니다. 최근에는 오픈 소스로 진행하는 경우도 많아지고 비즈니스가 더 복잡해지고 빨라지면서 난독화에 대한 요구는 점점 줄어드는 추세입니다.

와탭랩스의 경우도 코드보다는 코드를 작성한 개발자의 중요도를 높게 보고 있으며 코드가 공개되는 것에는 큰 의미를 두고 있지 않아서 난독화에 신경을 쓰지 않습니다. 사실 와탭랩스는 성능 분석 에이전트 코드에 대해 공개할 계획도 가지고 있습니다.

그럼 이제 Java decompile에 대해 알아보겠습니다.

JD-GUI를 사용한 역 컴파일

역 컴파일은 남의 코드를 보고 싶을 때 사용합니다. 자기 코드를 역 컴파일 할 필요는 없겠죠.

예를 들어, 위와 같은 코드에서 문득 Print라는 class 가 어떻게 동작하는지 궁금해질 수 있습니다. Eclipse의 경우 F3을 눌러 코드를 확인하거나, IntelliJ의 경우 command+b ( ctrl + b window의 경우)로 확인을 해볼 수 있습니다. 본인이 작성한 class(.java 파일) 라면 바로 함수의 선언 부분으로 연결되겠지만, 그렇지 않을 경우 다음과 같은 화면이 나옵니다.

Eclipse에서 F3을 눌러 코드를 확인한 경우
source_not_found

“source not found” 소스를 찾을 수 없다는 글과 함께 해당 class의 Byte code 가 보입니다.

Byte code에 대한 이해도가 높지 않은 이상, 무슨 내용인지 이해하시기 힘듭니다. (저 코드를 이해하려는 것은 정신건강에 해로울 수도 있습니다.)

이러한 경우 .class 파일을 JD-GUI로 역 컴파일하면 .java 코드를 볼 수 있습니다.

java_compile_1

Print class의 print 함수는 “Helloworld” 와 함께 현재 시간을 출력하도록 작성되어 있다는 것을 확인할 수 있습니다.

여기서 System.out.println이 궁금하다면? 더 들어가면서 역 컴파일을 해보면 알 수 있습니다.

JD-GUI 소개

JD-GUI는 가장 많이 쓰이는 Java 역 컴파일 도구입니다. 특히 GUI 도구를 제공해서 인기가 많습니다. JD-GUI는 Windows, Linux, OSX에서 모두 사용이 가능합니다.

JD-GUI 소개 페이지 바로가기

    주요 특징
  • JD-Core 및 JD-GUI는 Java와 Groovy로 개발되었습니다.
  • JD-Core는 아래 버전을 포함한 대부분의 최신 컴파일러에서 동작합니다.
  • jdk1.1.8, jdk1.3.1, jdk1.4.2, jdk1.5.0, jdk1.6.0, jdk1.7.0
  • jrockit90_150_06
  • jikes-1.22
  • harmony-jdk-r533500
  • Eclipse Java Compiler v_677_R32x, 3.2.1
  • 몇 가지 제약 사항이 있습니다.
  • Java 8 람다 식을 지원하지 않습니다.

자세한 내용은 홈페이지를 통해 확인하면 됩니다.


그럼 JAR 파일을 열어보도록 하겠습니다.

tomacat-util.jar를 열었습니다.
tomcat_util

OSX에서 실행한 모습입니다. jar에 들어있는 class 들이 패키지별로 역 컴파일 되어 보이는 것을 확인할 수 있습니다. 밑줄이 쳐진 class의 경우 클릭을 하게 되면 해당 class의 역 컴파일 된 java 소스로 이동하게 됩니다. (jar 안에 있는 역 컴파일 된 class 사이에서만 가능합니다.)

JD-GUI는 역 컴파일 된 java 코드에서 필터링 된 검색을 지원하고 있습니다.

java_compile_3

난독된 소스 역 컴파일하기

iocc_2015

난독화를 진행한 jar 파일을 역 컴파일 하면 어떻게 될까요?

역 컴파일은 가능하지만 난독화 과정을 거쳤기 때문에, 코드를 읽기가 어렵습니다.

java_compile_2

난독화된 소스들은 모든 변수와 클래스가 의미 없는 문자열로 치환되기 때문에 a, b, c, d… 같은 알파벳 class 파일들이 나열됩니다. 함수 명 또한 a, b, c, d…로 나옵니다. (필자는 몇 번 난독화된 코드를 이해하기 위해 도전해 보았지만 이 또한 정신건강에 해롭습니다.)

위 코드는 2018년도 국제 난독화 대회(IOCCC) 출품작입니다. 컴파일 가능한 실제로 동작하는 코드입니다. 홈페이지에 들어가면 매년 출품된 코드들을 볼 수 있습니다.

IOCCC 바로가기

역 컴파일한 Java 소스 컴파일하기

역 컴파일한 소스를 컴파일 하는 경우 라이브러리 참조를 잘 살펴보아야 합니다. 해당 class를 java로 100% 복원하였더라도 컴파일 시에 참조한 라이브러리들과 같이 컴파일을 해야 에러가 안 납니다.

마치며

blog_13_finish

JD-GUI는 GUI를 지원하여 stand alone 프로그램으로 편하게 사용할 수 있다는 장점을 가지고 있습니다. 하지만 개발 과정에서 역 컴파일이 필요한 경우라면 플러그인을 사용하는 것이 더 좋습니다. 마지막으로 역 컴파일 도구를 통해서 프로그램의 동작 원리와 구조를 파악하고 이를 통해 더 멋진 코드를 만들 수 있지만 역 컴파일 도구를 사용하여 다른 개발자의 코드를 남용해서는 안 됩니다.

Java 애플리케이션 성능을 최대로 사용하고 싶다면?

와탭 무료로 시작하기
이전 글

다음 글

최신글