어떤 라이브러리 내 프로그램 ( .class 로 끝나는 파일 ) 내부를 보고 싶거나 Lombok ( 이하 롬복 ) 같은 라이브러리를 사용해 코드를 자동 생성했을 때 자동 생성된 코드 ( 역시나 .class 로 끝나는 파일 ) 내부를 보고 싶을 때가 있음

그럴 때는 디컴파일러로 .class 로 끝나는 파일의 내부를 볼 수 있음

 

InteliJ의 경우에는 디컴파일러가 내장되어있는 듯 하지만 Eclipse의 경우에는 디컴파일러가 내장되어있지 않아 별도로 설치해줘야함

 

이클립스에 디컴파일러를 설치하는 방법을 알아보자


이클립스 내 [ Help ] (1) -> [ Eclipse Marketplace ] (2) 로 이동

 

decompiler 검색 (1) -> Enhanced Class Decompilter XXX (2) 설치

 

이클립스에 설치되는 프로그램을 확인 후 [ Confirm ] (1) 클릭

 

라이선스 (1) 동의 (2) 후 [ Finish ] (3) 버튼을 클릭해 설치 진행

 

종종 진짜 이 프로그램을 이클립스에 설치하는게 맞냐는  확인창이 나오는데 [ 맞다 ] (1) 로 체크 후 [ Trust Selected ] (2) 버튼 클릭

 

해당 프로그램이 이클립스에 설치되면 이클립스를 재시작 하라는 안내창이 뜸

[ Restart Now ] (1) 버튼 클릭해 이클립스를 재시작하자

 

여기까지 이클립스에 디컴파일러 설치 완료 !


이클립스에서 우리가 설치한 디컴파일러를 사용해 .class 파일을 열도록 설정하자

 

이클립스 내 [ Window ] (1) -> [ Preferences ] (2)

 

[ Java ] (1) -> [ Decompiler ] (2) 에서 디컴파일러 관련된 설정을 할 수 있음

 

디컴파일러 관련된 설정을 한다면 주로 [ Default Class Decompiler ] 인 어떤 디컴파일러를 사용할 것인지 지정할 것

 

이게 무슨 말이냐 ~ ! 궁금하다면 접힌 글을 참고 ~ !

더보기

원래 디컴파일러를 사용하려면 디컴파일러 프로그램을 다운 받아 cmd 명령을 사용해 디컴파일러 프로그램으로 .class 파일을 디컴파일 해 봐야함

이 디컴파일러 프로그램의 종류는 여러 개가 있지만 가장 많이 사용하는 디컴파일러는 [ Default Class Decompiler ] 에 있는 CFR, FernFlower, JD-Core, Procyon, Quiltflower 임


디컴파일은 소프트웨어 리버스 엔지니어링에 속함

소프트웨어 리버스 엔지니어링은 다양하게 좋은 쪽으로 활용되기도 하지만 우리가 쉽게 생각할 수 있는 소프트웨어 리버스 엔지니어링의 활용은 해킹이나 소프트웨어 복제임

 

A 회사에서 카카오톡을 똑같이 복제한 초콜렛톡을 만들고 싶다고 해보자

합법적인 방법은 카카오톡의 기능들을 하나씩 사용해보면서 그 기능을 분석해 카카오톡과 똑같은 기능을 갖고 있는 초콜렛톡을 만들 수 있을 것

그러나 기능을 따라한 것이지 소스 코드를 따라한것은 아니기 때문에 카카오톡의 소스코드와 초콜렛톡의 소스코드는 다를 것

 

A 회사가 카카오톡과 소스 코드까지 똑같은 초콜렛톡을 만들고 싶다면 카카오 회사에 몰래 잠입해 카카오톡의 모든 소스 코드를 빼오는 방법이 있을 것

그러나 이는 발각 되기 쉬우므로 A 회사가 선택할 수 있는 또 다른 불법적인 방법은 소프트웨어 리버스 엔지니어링임


실행 프로그램 ( 자바로 예를 들면 .class로 끝나는 파일 / 윈도우에서 실행되는 파일들은 .exe 로 끝나는 파일 ) 은 바이트 코드 내지는 기계어로 이뤄져있기 때문에 일반적인 사람들이나 개발자들이 실행 프로그램을 열어 보더라도 이 프로그램이 어떤 코드로 이뤄졌는지 알 수는 없음

 

그러나 A 회사가 바이트 코드 내지는 기계어에 능통한 전문가를 채용한다면 말이 달라짐

바이트 코드 내지는 기계어로 구성된 실행 프로그램을 이 전문가가 분석한다면 바이트 코드 내지는 기계어를 통해 역(Reversing)으로 소스 코드를 알아낼 수 있음


그러나 이 전문가가 역으로 알아낸 소스 코드는 실제 카카오톡의 소스 코드와 완전히 100% 일치하지는 않음

소스코드를 직접 보고 배낀게 아니라 바이트 코드 내지는 기계어에서 소스코드를 유추한 것이기 때문임

마치 맛집 레시피를 훔치면 당연히 그 맛집 레시피와 동일한 레시피를 손에 넣겠지만 맛집에서 음식을 먹고 "이 음식은 이런 이런 재료가 들어갔을꺼야" 라고 추측 하는 것과 같음

 

전문가가 바이트 코드 내지는 기계어에 얼마나 능통하느냐에 따라 유추한 소스 코드의 질이 달라질 것


우리가 이클립스에 설치한 [ Enhanced Class Decompilter ] 는 디컴파일러 관련된 설정을 도와주는 프로그램이고 실제 디컴파일을 수행하는 주체는 Default Class Decompiler 로 선택한 디컴파일러 프로그램임

디컴파일러 프로그램이 제대로 만들어졌다면 디컴파일한 소스 코드의 질이 좋을 것이고 디컴파일러 프로그램이 제대로 만들어지지 않았다면 디컴파일한 소스 코드의 질이 낮을 것


[ Enhanced Class Decompilter ] 을 설치했을 때 기본 디컴파일러로 선택된 FernFlower 디컴파일러도 충분히 좋은 디컴파일러이지만 다른 디컴파일러도 좋은 디컴파일러임

각 디컴파일러에 대해서 자세히 설명하진 않겠음

각 디컴파일러에 대해서 자세히 알고 싶다면 https://woonizzooni.tistory.com/entry/Java-Decompiler-%EC%A2%85%EB%A5%98 이 글을 참고하거나 검색엔진에 각 디컴파일러 명으로 검색해보자


 

디컴파일러 설정은 그대로 두고 이제 .class 로 끝나는 파일을 디컴파일러가 해석해 소스 코드로 보여주도록 설정해야함

[ General ] (1) -> [ Editors ] (2) -> [ File Associations ] (3) 로 이동하자

 

모든 .class 로 끝나는 파일 (1) 을 열 때 사용할 기본 뷰어로 디컴파일러 (2) 를 선택 (3) 하자


소스 코드가 없는 .class 로 끝나는 파일 (1) 을 열 때 사용할 기본 뷰어로 디컴파일러 (2) 를 선택 (3) 하자


이제 보고 싶었던 .class 로 끝나는 파일을 열어 보면 ( 더블클릭 해보면 ) 보일 것

728x90
LIST