2013년 5월 7일 화요일

자바 디컴파일 솔루션 소개

오픈소스가 주류를 차지하는 오늘날에도 자바 라이브러리 (jar) 파일에서 자바 소스를 추출해 내야 하는 경우가 종종 생기곤 한다. 이러한 경우 이 글이 도움이 될 수 있을 것이다.

1. Jar 파일 갯수가 적을 경우
JD-GUI
단독으로 동작하는 어플리케이션으로 어노테이션등 자바 5 이후의 소스에 대해서도 디컴파일을 가능하게 해준다. JAR 파일 단위의 디컴파일을 지원하며 디컴파일 된 소스는 패키지 구조 그대로 폴더에 저장된다. 디컴파일 하고자 하는 jar 파일이 적을경우 대단히 훌륭한 솔루션 이지만 jar파일이 수백개에 이른다던지 하는 경우 커맨드라인 인터페이스를 지원하지 않아 일일이 GUI를 통해 디컴파일을 해야만 하는 번거로움이 있다.

JD-Eclipse (Eclipse Plugin)
이클립스의 경우 JD-Eclipse를 추천한다. jadclipse도 같은 기능을 하는 플러그 인이기는 하나 기능적으로 최근까지 꾸준히 업데이트를 해 오고 있는 JD-Eclipse가 보다 나은 선택이 되리라 본다. (jadclipse는 2009년11월 업데이트를 마지막으로 개발이 멈춰있는 상태이다.)

2. Jar 파일 갯수가 대단히 많을경우
이 포스트를 작성하는 2013년 5월 현재. Java Decompiler 프로젝트에서 아직까지 커맨드라인 인터페이스를 제공하지 않는 관계로 수백개에 이르는 Jar파일을 디컴파일 해야 하는 경우에 의지력을 시험받는 경우가 생겨난다. 만약 자신의 인내심의 한계를 넘어가는 객수의 jar 파일들을 디컴파일 해야 하는 경우 다음과 같은 방법을 사용해 일괄적으로 디컴파일이 가능하다.
※단, 이 경우 제약이 있는데, jad 디컴파일러 자체가 워낙에 오래된 디컴파일러 이다 보니 어노테이션 같은 자바 5 이후의 문법에 대해서 제대로된 디컴파일이 되지 않는다는 점 을 주의해야 한다.

준비물
jad
jadretro
cygwin (리눅스나 유닉스의 경우 필요 없음. 위도우 쉘이나 파워 쉘을 사용하고자 하는 경우는 각자의 환경에 맞게 스크립트를 수정하여 사용할 것.)

①디컴파일 하고자 하는 jar파일들을 한자리에 모은다.
②7zip과 같은 압축 관리 툴을 이용해 jar 파일들을 각각의 파일명으로 된 폴더 아래 압축을 풀어낸다.
③java 5 이후의 컴파일러로 컴파일된 class파일들의 경우 jadretro를 이용해 jad가 디컴파일 가능한 형태의 바이너리 파일로 변환시켜 준다.
(for f in `find [class파일 저장 폴더] -name '*.class'`;do jadretro $f;done)
④폴더명을 jad컴파일러로 넘겨주어 디컴파일을 실행
(for f in `ls -1 [class파일 저장 폴더]`;do `jad -o -r -sjava -d[소스파일 저장 폴더]/$f/ tmp/$f/**/*.class` ;done)