🎤 WhaTap x 토크아이티 무료 웨비나 | 2월 24일 오후 2시
Top
도입문의
테크
2018-11-16

Java 디컴파일이 가능한 이유와 JD-GUI 사용하기

Java 디컴파일이 가능한 이유와 JD-GUI 사용하기

Java는 프로세스 독립적인 언어라는 특성상 역컴파일이 가능한 구조를 가집니다.

Java는 컴파일러를 통해 .java 파일을 바이트코드로 컴파일된 .class 파일로 변환하지만, 역컴파일을 수행하면 이 .class 파일을 다시 .java 파일 형태로 확인할 수 있습니다.

이러한 작업은 C#에서도 가능하며, C#의 역컴파일 도구는 매우 완성도가 높아, 자신이 작성한 코드를 다시 역컴파일했을 때 오히려 더 정리된 코드가 반환되는 경우도 있습니다.

소스 코드가 외부에 공개될 수 있다는 이유로, 과거에는 난독화 프로그램을 사용해 역컴파일된 소스의 이해를 어렵게 만드는 경우가 많았습니다. 그러나 최근에는 오픈소스 프로젝트가 증가하고, 비즈니스 환경이 복잡해지고 빠르게 변화하면서 난독화에 대한 요구는 점차 감소하는 추세입니다.

와탭랩스의 경우도 코드 자체보다 코드를 작성한 개발자의 역량과 가치를 더 중요하게 보고 있으며, 코드 공개 자체에 큰 의미를 두지 않기 때문에 난독화에 크게 신경 쓰지 않습니다. 실제로 와탭랩스는 성능 분석 에이전트 코드 공개도 검토 중에 있습니다.

이제 본격적으로 Java 디컴파일과 JD-GUI 사용 방법에 대해 알아보겠습니다.

JD-GUI를 사용한 Java 역컴파일

역컴파일은 주로 다른 코드의 동작 방식을 이해하고 싶을 때 사용합니다. 자신이 작성한 코드를 굳이 역컴파일할 필요는 없겠죠.

예를 들어, 특정 코드에서 Print라는 클래스가 어떻게 동작하는지 궁금해질 수 있습니다. Eclipse에서는 F3, IntelliJ에서는 command + b(Windows의 경우 ctrl + b)를 눌러 코드를 확인할 수 있습니다.

본인이 작성한 .java 파일이라면 바로 함수 선언부로 이동하지만, 그렇지 않은 경우에는 다음과 같은 화면이 표시됩니다.

key

소스를 찾을 수 없다는 메시지와 함께 해당 클래스의 바이트코드(Byte Code)가 출력됩니다. 바이트코드에 익숙하지 않다면 내용을 이해하기 어렵고, 이를 해석하려는 시도는 정신 건강에 해로울 수도 있습니다.

이런 경우 .class 파일을 JD-GUI로 역컴파일하면 .java 형태의 코드를 확인할 수 있습니다. 예를 들어 Print 클래스의 print 함수가 "HelloWorld"와 함께 현재 시간을 출력하도록 작성되었음을 확인할 수 있습니다.

key

System.out.println의 내부 동작이 궁금하다면, 더 깊이 들어가며 연쇄적으로 역컴파일해보는 것도 가능합니다.

JD-GUI 소개  

JD-GUI는 가장 널리 사용되는 Java 디컴파일러 중 하나로, GUI 기반 도구를 제공해 접근성과 사용성이 뛰어납니다. JD-GUI는 Windows, Linux, macOS(OSX) 환경에서 모두 사용할 수 있습니다.

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

주요 특징

  • JD-Core와 JD-GUI는 Java와 Groovy로 개발됨
  • 다음을 포함한 대부분의 Java 컴파일러 버전 지원
    • jdk1.1.8 ~ jdk1.7.0
    • jrockit90_150_06
    • jikes-1.22
    • harmony-jdk-r533500
    • Eclipse Java Compiler v_677_R32x, 3.2.1

제약 사항

  • Java 8 람다 표현식은 지원하지 않음
  • 최신 지원 여부는 공식 홈페이지에서 확인 필요

JAR 파일 역컴파일하기

key

예제로 tomcat-util.jar 파일을 열어보겠습니다. macOS 환경에서 실행한 모습이며, JAR 내부의 클래스들이 패키지 단위로 역컴파일되어 표시되는 것을 확인할 수 있습니다.

밑줄이 표시된 클래스는 클릭 시 해당 클래스의 역컴파일된 Java 소스 코드로 이동합니다. (단, JAR 내부 클래스 간 이동만 가능합니다.)

또한 JD-GUI는 역컴파일된 Java 코드에 대해 필터링 검색 기능을 제공합니다.

key

난독화된 Java 소스 역컴파일

key

난독화된 JAR 파일도 역컴파일 자체는 가능합니다. 다만 난독화 과정을 거쳤기 때문에 코드 가독성은 매우 떨어집니다.

key

변수명과 클래스명이 모두 a, b, c와 같은 의미 없는 문자열로 치환되며,함수 이름 역시 동일한 패턴으로 표시됩니다. (난독화된 코드를 이해하려는 시도 역시 정신 건강에 좋지 않습니다.)

key

http://www.ioccc.org/2018/endoh1/prog.c

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

IOCCC 바로가기

역컴파일한 Java 소스 컴파일 시 주의점

역컴파일한 소스를 다시 컴파일할 경우, 컴파일 당시 참조되었던 라이브러리 의존성을 반드시 함께 확인해야 합니다. 클래스 코드를 100% 복원하더라도, 필요한 라이브러리가 누락되면 컴파일 오류가 발생할 수 있습니다.

마치며

key

JD-GUI는 GUI 기반의 standalone Java 디컴파일 도구로 간편하게 사용할 수 있다는 장점이 있습니다. 다만 개발 과정에서 빈번하게 역컴파일이 필요하다면 IDE 플러그인을 사용하는 편이 더 효율적일 수 있습니다.

역컴파일 도구는 프로그램의 구조와 동작 원리를 이해하는 데 매우 유용하지만, 이를 통해 다른 개발자의 코드를 무분별하게 활용하는 것은 지양해야 합니다.

Java 애플리케이션 성능을 최대로 사용하고 싶다면?  👉 와탭 도입 문의하기

와탭 모니터링을 무료로 체험해보세요!