소스파일을 잃어버렸어요..ㅠㅠ 어떻하죠~~~?
- 요번에 저희 회사에서 출시된 신제품인데, 혹시 핵심 알고리즘의 소스코드가
공개유출되지는 않을까요?
닷넷 소스코드 관련된 이와 같이 문제들이 생겼을 때 도움을 될 수 있는
작지만 강력한 유틸리티 두 가지를 소개해드립니다. ^^
하나는 닷넷 모듈 역컴파일러와 또 하나는 난독화를 도와주는 유틸입니다.
주인공은 [.NET Reflector]와 [Dotfuscator]인데요,
빌드를 시작한지 꽤나 오래된 프로그램들이라 이미 잘 알고 계시는 분들도 많겠지만,
혹시나 아직 써보지 않으셨다면 정말 급할 때(특히나 Reflector)
매우 유용하실 겁니다. ^^
- 이름 : Lutz Roeder의 닷넷 리플렉터~
(http://www.aisto.com/roeder/dotnet/)
- 최신버전 : 5.0.21.0 (2007.06.05일 현재)
- 하는일 : IL로 만들어진 닷넷 어셈블리를 디어셈블해줌(!!)
- 성능 : 매우 막강
- 모양 : 이쁨
- 용량 : 작음
- 사용방법 : 실행 후 사용할 프레임워크 버전을 선택하고 디어셈블할 어셈블리 선택
- 기타 : 유사품도 더 있으나, 가장 간결하고 깔끔함
닷넷 어셈블리란 앞뒤빼고 한마디로 말하면 컴파일 후 생성된 DLL을 말하죠
그녀석을 디어셈블 한다는 얘기는 결국 .DLL 파일에서 다시 .CS 파일로 만든다는 얘기가 됩니다.
바로 Reverse-Engineering. 즉, 역컴파일을 해준다는 말이죠. ^^
이 리플렉터만 있으면, 모~~든 닷넷 DLL파일들만 있으면 .CS파일의 코드내용들을
볼 수 있다는 말이 됩니다.
그렇다고 해서 리플렉터를 해커들이나 쓰는 프로그램으로 오해하시면 안됩니다.;;;
System.Web... System.Data... System.Collections..
System.Drawing.. 등등. ^^ 많이 보시던 네임스페이스들이죠?
이와같은 닷넷 프레임워크의 어셈블리들의 메소드, 멤버변수 목록 확인은 기본~!
매일 습관적으로 선언하고, 또 사용하던 클래스들까지
실제 수행되는 코드들을 자세하고 알아 볼 수 있다는 점이야말로
리플렉터가 닷넷 개발자의 필수 유틸리티로 자리매김할 수 있었던 매력이죠.
객체 파기와 관련해서 쓰이는 .Dispose()와 .Close()....
어쩌면 이름만 틀리고 하는일은 똑같아 보이기도 하는 이녀석들의 차이점을
실제 코드상으로 확인해 볼 수도 있겠고,
또, 언제는 StringBuilder를 사용해야 좋고, 언제는 StringBuilder를 쓰면
메모리의 심각한 낭비가 발생하게 되는지의 이유를
바로 이 리플렉터를 이용하여 소스코드를 보면서 찾아볼 수도 있겟죠 ^^
사실 MS Visual Studio에는 리플렉터와 같은 기능으로
IL(Intermediate Language)코드를 보여주는 ILDASM(IL Disassembler)이란 녀석이 기본적으로 설치되어 있습니다.
[Visual Studio .NET 명령 프롬프트]를 실행 후에 [ildasm] 이라고 입력하면 이 녀석을 볼 수 있는데,
마찬가지로 DLL파일만 선택해주면 전체적인 메소들과 프로퍼티들 또, 코드 내용까지 보여 줍니다.
하지만 결정적으로 그 코드내용이 IL 형태 그대로(정말 그대~로;;) 보여주기 때문에
그걸 가지고 일반 유저들이 실제 소스코드를 복원하기엔 다소 무리가 있습니다.;;;
리플렉터는 바로 이런 단점을 보완하여 C#, VB, Delphi등의 고급언어로
코드를 완벽(거의)하게 또 편리하게 복원해 준다는게 장점입니다. ^^
모~든걸 뚫을 수 있는 창이 있으면 모~든걸 막는 방패도 있듯이
이번엔 소스코드를 어떻게든지 보호할 수 있도록 도와주는 유틸리티를 살펴보겠습니다.
소스 코드(또는 그에 대한 권리)를 판매에 포함하지 않고 S/W를 출시하게 되면
항상 역공학에 대한 걱정이 따라다니게 됩니다.
특히 자바나 닷넷과 같은 (비교적)최신 언어들은 편리해진 만큼
바로 위의 리플렉터와 같은 프로그램이 있을 정도로 소스코드가 쉽게 노출되어 있습니다.
이걸 최대한 어렵게 하자~는 것이 방패진영(^^;)의 방향인데요,
방법이야 조금만 검색엔진을 두드려도 많겠지만, 그걸 자동화시키고 조금이라도 더 강력하게 방어할 수 있는
Obfuscator들이 많이 나와 있습니다.
- 이름 : PreEmptive Solutions의 Dotfuscator
(http://www.preemptive.com/)
- 최신버전 : 1.1 (Add-in 버전)
- 하는일 : 어셈블리 소스를 못알아볼 정도로 최대한 복잡하게 만들어줌(-_-;;)
- 성능 : 매우 막강
- 모양 : 별로 안이쁨
- 용량 : 작음(Visual Studio에 Add-in 되어있음)
- 사용방법 : 난독화할 어셈블리 선택 후 빌드~
- 기타 : 비주얼 스튜디오에 통합될 수 있다는 점에서 유사품과 차별화됨
Visual Studio 2003 버전부터 Dotfuscator가 자체 포함되기 시작했습니다.
원래는 Dotfuscator 4.0버전이 User당 2백만원씩이나 하는 상용S/W인데;;
그럼에도 불구하고 MS에서 막강한 그 유용함을 높이사 일부 기능을 축소시킨채로 Add-in 시킨 것입니다.
사실 어셈블리 파일이 사용자에게 배포되는 상황이라면
역컴파일을 막는다는 건 불가능합니다.;;
(따라서 가능한한 중요 모듈은 서버에서 실행되어야 바람직하겠죠~ ^^)
그럼에도 불구하고 배포를 하게 되는 경우, 역컴파일의 결과가 최대한 부실(;;)하도록
만들어주는 것이 Obfuscator들의 가장 큰 목적이라 할 수 있겠습니다.
주요 기능으로는
식별자 이름 바꾸기(그것도 다양한 방법으로;;), 사용하지 않는 메타데이터 제거, 접두어 이름 변경,
문자열 암호화, (무절제한) 메소드 오버로딩, 제어 흐름 애매하게 하기 등등이 있습니다.
식별자 이름을 바꾼다는게 GetDownload()와 같은 이름을 a().. -_-;; 이런식으로 바꿔준다는건데,
단순해 보이지만, 전체 프로세스 흐름을 모르는 상황에서 모든 메소드, 클래스들이
a...b.. c...x...q...w....(-_-;;) 이렇게만 딸랑 되어 있으면 정말 당황스럽습니다;;
(따라서~~~ 변수명명 규칙 등 코딩 표준안을 준수합시다~~~ >_</)
게다가 저렇게 가독성과 비례하는 긴~ 이름들을 짧게 한다는건
그만큼 실행시간을 최적화시킬 수 있다는 효과도 덤으로 얻을 수가 있는 이점이 있습니다.
이 점 때문에 꼭 난독화가 아니더라도 일부터 Obfuscator를 사용한 후 배포 하는 일도 있습니다.
그 외의 기능등도 모두 코드분석을 어렵게 하기와 관련이 있는 내용들입니다.
여기서 한가지 짚어볼 점이 있다면,
Obfuscator들의 해주는 일들과 정반대가 되도록 평소에 코딩을 한다면 어떻게 될까요? ^^
메소드명(변수, 클래스명 등등 포함)을 명확하게 사용하고,
메소드 오버라이딩도 가능한 적게 쓰고(이거야 뭐, 써야 좋은 경우도 당연히 있겠죠 ㅎㅎ),
모듈별 정규화를 통해 제어 흐름도 논리적으로 보기 편하게 하고...
결국은 누구나 분석하기 편한 깔끔한 코드가 될 것이라는 점입니다.
모듈을 난독화 해주는 Obfuscator에게서 거꾸로 배울 수 있다니...좀 아이러니 하죠 ㅎㅎ
자... 닷넷의 역공학과 난독화의 대표적인 프로그램들을 짚어봤는데,
물론 이와 같은 유틸리티들이 닷넷에만 있는 것은 아닙니다.
Java에도 JAD와 같은 대표적 역컴파일러가 있고, PreEmptive에서도
Dotfuscator의 자바버전인 DashO라는 제품을 빌드하고 있습니다.
개발자로서 코딩을 잘하는 것도 매우 중요한 능력이지만,
직접(또는 먼저) 만들진 못했더라도, 이런 자동화 도구들을 잘 알고
적재적소에 잘 이용할 수 있는 것도 능력중에 하나가 아닌가 싶습니다.
(물론 연구원이나 학생이라면 일부러 노가X 를 하는 경우도 있겠지만...ㅎㅎ)
개발 하시는데 유용한 도움이 되셨기를...^^
[출처] [펌] .Net 소스코드의 해킹과 보안 (관련S/W 소개) |작성자 쿠마