일반적으로 자바 디컴파일러에 JAD 를 많이 사용하나, JAD 는 1.5 버젼부터는 잘 지원안된다.
그래서 보통 JD 를 많이 사용하는데, JD core 를 이용한 JD-Gui 를 이용하여 주로 사용한다.
허나, 이 또한 일부 디컴파일된 파일이 불안전할 수 가 있는데, 그 대안으로 cfr 을 추천한다.
cfr 또한 불안전한 파일이 나올 수 있으므로 본인은 JD-Gui 로 선행 작업 후, 컴파일 오류가 나는 것들에 대해서 cfr 로 디컴파일한 파일들을 사용한다.
CFR
cfr 은 java 로 개발된 디컴파일로써, java8 의 람다와 java 7 의 switch 등을 지원한다.
http://www.benf.org/other/cfr/ 에서 최신 버젼을 내려 받은 후 다음과 같이 실행하면 된다. (문서 작성 당시에 cfr 버젼은 0.8.1 이었다.)
> java -jar cfr_0_81.jar <디컴파일할 jar 파일 경로> --outputdir <디컴파일된 소스 파일이 등록될 경로>
다음은 샘플이다.
D:\App\cfr>java -jar cfr_0_81.jar lnk.jar --outputdir d:/app/cfr/result
물론 이렇게 단순한 방법 말고도, 디컴파일시 소스 번호가 나오게 한다던지 등등 다양한 옵션이 존잰한다.
자세한 방법은 --help 를 쳐보면 된다
D:\App\cfr>java -jar cfr_0_81.jar --help CFR 0_81 --showops (int >= 0) default: 0 --decodeenumswitch (boolean) default: true if class file from version 49.0 (Java 5) or greater --sugarenums (boolean) default: true if class file from version 49.0 (Java 5) or greater --decodestringswitch (boolean) default: true if class file from version 51.0 (Java 7) or greater --arrayiter (boolean) default: true if class file from version 49.0 (Java 5) or greater --collectioniter (boolean) default: true if class file from version 49.0 (Java 5) or greater --innerclasses (boolean) default: true --removeboilerplate (boolean) default: true --removeinnerclasssynthetics (boolean) default: true --decodelambdas (boolean) default: true if class file from version 52.0 (Java 8) or greater --hidebridgemethods (boolean) default: true --liftconstructorinit (boolean) default: true --removedeadmethods (boolean) default: true --removebadgenerics (boolean) default: true --sugarasserts (boolean) default: true --sugarboxing (boolean) default: true --showversion (boolean) default: true --decodefinally (boolean) default: true --tidymonitors (boolean) default: true --lenient (boolean) default: false --dumpclasspath (boolean) default: false --comments (boolean) default: true --forcetopsort (boolean) --forceexceptionprune (boolean) --outputdir (string) --stringbuffer (boolean) default: false if class file from version 49.0 (Java 5) or greater --stringbuilder (boolean) default: true if class file from version 49.0 (Java 5) or greater --silent (boolean) default: false --recover (boolean) default: true --eclipse (boolean) default: true --override (boolean) default: true if class file from version 50.0 (Java 6) or greater --aexagg (boolean) --forcecondpropagate (boolean) --hideutf (boolean) default: true --hidelongstrings (boolean) default: false --commentmonitors (boolean) default: false --allowcorrecting (boolean) default: true --labelledblocks (boolean) default: true --j14classobj (boolean) default: false if class file from version 49.0 (Java 5) or greater --hidelangimports (boolean) default: true --recovertypeclash (boolean) --forcereturningifs (boolean) --help (string)
참조 : 다른 디컴파일러들에 대한 정보는 다음 링크에 잘 나와있다.
https://community.jboss.org/people/ozizka/blog/2014/05/06/java-decompilers-a-sad-situation-of