본문 바로가기

조금은 전문적인 이야기/IT

C# 리버스 엔지니어링 - Reflector(리플렉터)

C#으로 코드를 만들 경우 첫 번째로 우려를 하는 것은 바로 '보안'이다.




조금만 찾아봐도 알 수 있을 정도로 .net decompile(닷넷 디컴파일러)는 넘치고 넘쳐난다. 그중에서 제일 유명한 것이 이 리플렉터라는 녀석인데, 지금은 7버전이 있고, 7버전은 유료다...구글링을 통해 6버전을 찾아 남겨 놓는 용도겸, 혹여나 필요한 분들이 계실까 포스트를 해본다.




이 프로그램은 말그대로 C#으로 만든 프로그램을 디컴파일을 해주는 프로그램으로, 최초 작성된 코드와는 약간 다를지 몰라도 어떻게 동작하는지 이해 할수 있는 수준으로 뽑아 준다. 게다가 프로젝트 형식으로 저장을 하게 되면, 같은 프로그램의 소스를 뽑아낼 수 있고 수정 및 코드를 훔치는 것이 가능하다.


도덕적으로 볼때...이건 옳지 않은 방법이며, 학생들의 이해나 코드의 이해를 위해서만 이용 되길 바라는데, 조금이라도 머리가 있는 개발자라면 이미 난독화를 했거나 DLL등의 연동으로 중요한 코드는 이미 볼 수가 없다. 이것에 대한 대비도 안한 것이라면, 코드를 뺏기더라도  할말은 없을 거다.


그림을 보면 알 수 있겠지만, 디컴파일 이후 '보안 장치'를 아무것도 하지 않을 경우 코드를 가져오는 데는 아무런 제약이 없다. 가끔 상용 프로그램의 .Net 프로그램들을 살펴보는데, 정말 의외로 보안에 아주 허술하다.


디컴파일은 리버스에 있어서는 아주 기본이 되는 기술이며 이후 다른 프로그램과의 연계를 통해 좀더 많은 일을 할 수 있게 해준다. 게다가 C#이나 Java 디컴파일의 경우는 아주아주 기본중의 기본(그 만큼 쉽고 툴도 많다)이기 때문에 해당 언어를 통해 코딩을 하는 경우는 생각을 많이 해야 한다.


C++의 경우에도 해독이 쉽지는 않지만 디어셈블리를 해주는 풀이 있다. 그 유명한(유명한가?) 올리디버거와 IDA(이게 맞는지 모르겠다...거의 올리디버거를 쓰다보니 초반에 연습할 때를 제외하고는 쓴적이 없다.)가 있는데, 이 경우 어셈블리 코드로 나와버리기 때문에 해당 지식이 없는 경우 리버스를 하기 쉽지 않다. 나중에 기회가 된다면 이 부분에 대해서도 다뤄 보려고 한다.

reflector.zip