본문 바로가기

.NET Framework/BUNDLE

[.NET] 코드 보안(창과 방패) - 01. 역어셈블러(DisAssembler)

 회차
[.NET] Code Securit(Spear and Shield) : 01. DisAssembler
[.NET] Code Securit(Spear and Shield) : 02. Obfuscation
[.NET] Code Securit(Spear and Shield) : 03. Dotfuscator Program Comparison #1
[.NET] Code Securit(Spear and Shield) : 04. Dotfuscator Program Comparison #2
[.NET] Code Securit(Spear and Shield) : 05. Obfuscation Design Tip And Notabilia
[.NET] Code Securit(Spear and Shield) : 06. Security Tools : Strong Name Tool

01| 코드 보안(창과 방패) - 역어셈블러(DisAssembler)
오랜만에 만나뵙네요. 프로젝트 투입으로 인해 포스팅을 미뤄게 되었습니다. 
아시는 분들은 아시겠지만 오늘 여러분들께 소개해드릴 포스팅은 닷넷 코드 보안에 대해서 이야기를 나눠볼까 합니다.
포스팅에 앞서 이번 테마는 상세한 내용을 다루는것이 아니므로 부분적으로 이해하시길 바랍니다.

추가) 본 회차의 의도는 난독화를 언급하고자 역어셈블러를 소개 하게 되었고^^;; .NET Framework 보안도구 이용 시 프로그램 변조등을 방지 할 수 있으니 오해 없으시길 바랍니다. : )
 
역어셈블러(DisAssembler)란? 기계어 코드를 어셈블리 코드로 변환하는 번역 프로그램을 뜻합니다.

.NET으로 관리되는 코드들은 중간 언어인 MSIL코드로 관리되며 ILDU(Intermediate Language Disassembler Utility)라는 툴에 의해서 MSIL 코드를 확인하실 수 있습니다.

* ILDU 란?
ILDU(Intermediate Language Disassembler Utility)는 MSIL 역어셈블러라고 표현하며 .NET Framework에서만 실행될 수 있는 어셈블러를 역으로 해석해주는 역어셈블러 프로그램입니다.

MSIL 역어셈블러를 활용하려면 다음과 같이 ildasm 프로그램을 실행 해야합니다.

- 프로그램 위치
<driver name>:\Program Files (x86)\Microsoft Visual Studio<version>\SDK\<version>\Bin\ildasm.exe

프로그램을 실행하면 다음과 같습니다.


다음 코드[코드1]를 MSIL 역어셈블러로 통해 PE (portable executable) 파일을 확인 하실수 있습니다. 
class Program
{
    static void Main(string[] args)
    {
         for (int i = 0; i < 100; i++)
         {
                  Console.WriteLine(string.Format("{0}", 100+ i));
          }
    }
}


프로그램을 통해 메소드를 클릭하면 MSIL로 부터 IL 코드를 추출이 가능합니다.
하지만 어셈블러의 IL 코드를 그대로 출력 해서 보여주므로 아무리 간단하더라도 해당 정보가 익숙하지 않고 코드가 어렵다면 더더욱 읽을 수 없습니다. 무언가 새로운 대안이 필요한것 같은데요.

이러한 단점을 보완하여  C#, VB, Delphi등의 고급언어로 개발된 코드 상태로 쉽게 복원을 하는 유용한 툴이 있습니다.
예전에 제 포스팅을 보신분이라면 기억이 나실것 같은데요.

바로 Redgate's .NET Reflector 프로그램입니다.



* Redgate's .NET Reflector
 - 지원 프레임워크 : Fx1.x, 2.0, 3.0, 3.5, 4.0
 - 라이센스 : 무료 / 유료
 - 다운로드 : http://reflector.red-gate.com/download.aspx

소개는 이정도로 하고요 [코드1]를 리플렉션을 통해 한번 확인 해보도록 하겠습니다.



헉...내가 작성했던 프로그램이 다보인다.. [코드1]이 만약에 회사 핵심 코드였다면... 맙소사...

어떻게하지?! x 3...

보시는것처럼 쉽게 노출이 될수 있습니다. 
닷넷 뿐만아니라 JAVA등 중간 언어로 관리하는 언어와 바이너리 프로그래밍도 역어셈블러를 통해 코드를 해치거나 변조가 가능합니다.

추가) 하지만 .NET Framework 보안도구 중 서명 도구(SignTool.exe), 강력한 이름 도구(Sn.exe) 등을 활용시에 코드를 볼수 있다고 해도 변조는 불가능 합니다. 피드백 의견에 따라 보안에 대해 오해 소지가 있는것 같아 강력한 이름 도구(Sn.exe) 사용법에 대해 추가 소개 해드릴 계획 입니다. : )

엄준일 MVP님 피드백 주셔서 감사합니다.


그렇게 놀라지 마세요!! 역어셈블러를 읽기 어렵게 만드는 툴이 존재를 하니깐요.

.NET Reflector툴은 악의 목적으로 이용이 가능하지만 궁극적인 목적이 있다고 생각합니다.
1. LenA : 야근 끝에... 프로그래밍을 완성했어!! 이제 배포를 해야지.. 
   빌 게이츠 : LenA! 배포하기전에 보안상 위험하지 않을까요? 체크해보세요.
   그렇습니다. .NET Reflector를 통해서 코드가 얼마나 노출이 되고 있는지 확인이 가능합니다.

2. 신입1 : 룰루랄라.... 코딩중....... Orz 핵심 코드를 날렸네.. 어떻게 하지?
   해당 어셈블러 파일이 존재를 한다면 .NET Reflector을 통해 거의 복원이 가능합니다.

3. 신입2 : 저는 C# 3개월 배우고 갓 입사한 신삥입니다. 개발을 해보니 일부가 매우 느리네요. 어떻게 하죠?
   해당 그림에서는 볼수 없었지만 객체가 반환이 되거나 메모리가 누수되거나 낭비되는 이유를 파악을 할수 있습니다.

이렇게 MSIL 역어셈블러를 통해 코드가 쉽게 노출이 된걸 확인 하셨으니깐 이제 보안을 해야 되겠죠?
보안에 관련된 포스팅은 다음 포스팅으로 미뤄도록 하겠습니다.

포스팅을 마치며...

이미 많이 알려진 포스팅이다보니 재미가 없었던 분도 계실것 같아요.
그래도 닷넷에 입문하신분들께 유익한 포스팅이 될거라고 믿으며 다음 회차 열심히 작성하도록 하겠습니다.

더 궁금하신점이 있으시면 댓글 혹은
http://blog.tobegin.net/notice/1 프로필정보를 통해 문의 바랍니다.
감사합니다.

정은성 드림