일반적으로 자바 디컴파일러에 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

+ Recent posts