본문 바로가기

.NET Framework/BUNDLE

[.NET] 코드 보안(창과 방패) - 03. Dotfuscator 프로그램 비교 #1(Overview & Renaming)

 회차
[.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
03| 코드 보안(창과 방패) - Dotfuscator 프로그램 비교 #1
구독자 여러분 안녕하세요
오늘 포스팅은 Visual Studio와 동고동락한 10년지기 친구?!를 소개(프로그램)을 소개 할까 합니다.
바로 Dotfuscator 프로그램 인데요. Dotfuscator 프로그램은 Visual Studio 2003 버전 부터 일부 기능에 한해 Add-in 버전으로 번들이 제공 되었습니다. 이 프로그램은 Developer Licenses User당  250만원 상당의 상용 프로그램 인데요. 난독화 프로그램에 대해서 잘 모르시는 분들이 계신것 같아 준비 해봤습니다.

자! 이제 Dotfuscator에 대해서 프로그램을 비교 할때가 왔습니다. 앞서  축소된 기능이 제공 되고 있다고 말씀 드렸는데요. 실제로  어떤 버전이 존재를 하는지 살펴보도록 하겠습니다.

Dotfuscator은 3가지 버전으로 나눠지고 있는데요.

* Dotfuscator 프로그램 종류
- Dotfuscator Professional Edition
- Dotfuscator Enhanced Community Edition
- Dotfuscator Community Edition


자세한 정보를 확인해보시려면 아래를 참고 해주십시오.

MSDN에서 명시된 내용의 기준으로 본다면 기능들이 버전별로 지원 여부가 다른것을 확인 할 수 있습니다.
그럼 어떤 기능들이 있는지 살펴볼까요?

* Dotfuscator 난독화 프로그램은 어떤 기능(옵션)을 가지고 있나요?
Dotfuscator 프로그램은 크게 9가지 기능을 가지고 여러 옵션을 지원(Professional Edition 기준)을 하고 있습니다.

1. Renaming
난독화 프로그램에서는 멤버 변수, 함수이름, 클래스등의 시스템 고유 문자형(a,b,c,1,2,3,.....등)로 이름 바꾸기기능이 제공합니다. 이는 혼란하기 쉬운 시퀸스 이름으로 바꾸기 때문에 역어셈블러 해독에 어려움을 줄수 있습니다

2. Control Flow obfuscation
개발 프로그램의 조건, 분기, 반복과 같은 논리적 구조를 스파게티 코드화(어려운 구조로 변경)를 제공합니다. 이 과정에서 성능 저하가 발생 할 수 있지만 코드의 분석은 매우 어려울수 있습니다.
이 기능은 Professional Edition 버전에서만 지원합니다.


3. String Encryption
크래커는 프로그램을 변조하기 위해서 주요 문자열을 검색하여 변조를 하게 됩니다. 역어셈블러를 방지하고자 문자열 또한 암호화여 디컴파일 시도시 해당 문자열을 찾을수 없도록 기능을 제공합니다

4. Enhanced Overload Induction
Professional Edition 버전의 확장 기능으로써 코드 내의 필드와 메소드 반환 유형을 변경함으로 코드를 이해 못하도록 기능이 제공됩니다.

5. Pruning(Removal)

작은 응용프로그램 더욱 빨리 실행하도록 돕는 기능입니다. 작성된 코드중 사용하지 않는 코드를 제거 하므로써 속도를 향상 시킵니다.

6. Assembly Linking
여러 어셈블러 파일을 하나의 파일로 병합하여 작고 간단한 배포 시나리오를 제공합니다.

7. Watermarking
워터마크는 무단 사본을 추적하는데 사용할수 있는 방법으로 저작권 정보 또는 고유 식별과 같은 정보를 런타임 동작에 여향을 주지 않고 삽입할수 있는 기능을 제공 합니다.

8. Incremental Obfuscation
난독 프로그램을 실행하는 동안 이름 매핑 레코드 생성, 분산된 난독 프로그램 통합 기능 제공합니다.

9. Debugging Obfuscated Code
난독화된 프로그램 배포 이후 문제 발생시 해당 스택을 원래 이름으로 대체 하여 제공(Professional Edition)

기능에 대한 자세한 설명은 유저 가이드를 참고 하시길 바라며 포스팅을 통해 전반적인 내용을 다뤄 볼수 없기 때문기에  일부 기능에 한해(Renaming, Control Flow, String Encryption, Pruning) 알아보도록 하겠습니다.

* 그럼 빨리 난독화 도구 사용하는 방법좀 알려주세요!
난독화에 앞서 비교 분석을 하려면 난독화 하고하는 대상 코드가 필요하겠죠?

[코드 1] 변환 대상 예제 코드
namespace ObfuscationEx
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("안녕하세요 방갑습니다.");
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(string.Format("100 + {0}의 합은? {1}", i, 100 + i));
            }
            Console.WriteLine();
            Console.WriteLine(new People().ToString());
        }
    }
    class People
    {
        private string NameKor = "정은성";
        private string NameEng = "Jeong Eun Seong";

        public override string ToString()
        {
            return string.Format("한글 이름은? {0} 영문 이름은? {1}", NameKor, NameEng);
        }
    }
}

적절한 코드가 완성이 되었습니다. 그럼 이제 변환을 해볼까요? 두근두근♥

1. Renaming
기능 명에서도 알수 있듯이 무언가를 바꾸려는 시도를 하고 있는데요. 실제로 이 기능은 멤버 변수, 메소드, 클래스 등의 식별자 이름을 바꾸는 기능을 제공을 하고 있는데요. 변경 만으로도 역으로 해석을 할 때 리딩이 어려워 집니다.

간단한 예제를 통해 변경 전후를 살펴보도록 하며 이어서 사용법에 대해 알아보도록 하겠습니다.
- 메소드 경우 : void HelloWorld() -> void a();
- 필드 경우 : bool blWindowsHidden; -> bool a;

[그림 1-1] Dotfuscator 프로그램 Renaming 기능 화면 - Exclude 영역

① 텝 메뉴 : Rename 기능의 텝메뉴는 크게 2가지로 구분이 되어집니다.
      - Exclude : Rename시 배제될 적용 대상 설정
      - Options : Rename 적용시 옵션으로써 오버헤드, NameSpace 변경 방지, Rename 스키마설정,  Map설정

② 트리 영역 :
트리영역은 해당 어셈블러의 구조를 제공하며 난독화 Rename 제외 대상을 지정시 선택 영역은
                        변환이 되지 않습니다.

③ 적용 규칙 영역
 : 해당 영역은 배제 가능한 규칙을 정의을 하게 되면 정규식에 의해 해당 영역이 변환이 되지 않습니다.
정규표현 배제 범위
.* 전체 매칭
MyLibrar. MyLibrary, MyLibrari, 그외 매칭
My[\.]Test[\.]I.* My.Test.Int1,My.Test.Internal, 그외 매칭
Get.* GetInt, GetValue, 그외 매칭
Get* Ge,Get,Gett,Gettt, 그외 매칭

[그림 1-2] Dotfuscator 프로그램 Renaming 기능 화면 - Options 영역

- Keep Namespace Renaming Option
 : 난독화시 네임스페이스 이름을 보존 할 수 있으며 유지하지 않을경우 다음과 같습니다.
기존 이름 난독화 된 이름
Net.Tobegin.Util.DateUtil Net.Tobegin.Util.a
Net.Tobegin.Provider.XmlProvider Net.Tobegin.Provider.b
Net.Tobegin.Enum.XMLProviderEnum Net.Tobegin.Enum.c
Net.Tobegin.Util.VectorList Net.Tobegin.Util.d

- Keephierarchy Renaming Option
 : 네임스페이스와 클래스 네임  또한 Rename이 가능합니다.
기존 이름 난독화 된 이름
Net.Tobegin.Application.Main a.a.a.a
Net.Tobegin.Application.Program a.a.a.b
Net.Tobegin.Enum.XMLProviderEnum a.a.a.c
Net.Tobegin.Util.VectorList a.a.a.d

- Full Class Renaming Option(Default)
 : 기본적으로 적용되는 Rename 방법으로써 매우 간단한 이름으로 변경이 가능합니다. 
기존 이름 난독화 된 이름
Net.Tobegin.Application.Main a
Net.Tobegin.Application.Program b
Net.Tobegin.Enum.XMLProviderEnum c
Net.Tobegin.Util.VectorList d

- Renaming Prefixes
 : 옵션은 Rename시 수식을 지정하여 변환이 가능합니다.
기존 이름 수식어 Rename 옵션 난독화 된 이름
Net.Tobegin.Main helloWorld Keep Namespace Net.Tobegin.helloWorlda

- Overload-Induction Method Renaming
 : 기존 구조를 더 난해한 구조로 변경하여 옵션을 제공합니다.

[코드 2] OverLoad-Induction 옵션 비교
// 기존 코드
private void CalcPayroll(SpecialList employeeGroup) {
      while (employeeGroup.HasMore()) {
            employee = employeeGroup.GetNext(true);
            employee.UpdateSalary();
            DistributeCheck(employee);
      }
}

// 변경 코드
private void a(a b) {
      while (b.a()) {
            a = b.a(true);
            a.a();
            a(a);
       }
}

- Map Output File
 : 난독화 빌드시 식별자 변경에 따른 변경된 식별자와 고유 식별자 정보를 MAP 형태로 XML로 제공이 됩니다.
   매핑된 MAP xml 파일이 필요성에 대해서는 Code Securit(Spear and Shield) : 04. Obfuscation
   Design Tip And Notabilia
회차에서 다뤄볼 예정이니 잠시만 기다려주세요 : ) 

아직 나열 하지 않은 옵션들이 제법 많은데요 나머지 사항들은 유저 가이드를 통해 숙지 하시길 바랍니다.
이렇게 옵션을 활성화여 난하게 코드를 제 빌드가 가능한데요 실제 빌드를 통해서 어떻게 변겨잉 되었는지 확인 해보도록 하겠습니다.

[그림 1-3] Rename 적용된 어셈블러


위 그림을 보시면 네임스페이스와 일부 멤버변수(NameEng, NameKor)는 보존하였고 그외 Rename 한 흔적을 볼수 있습니다. [코드1]과 같이 간단한 코드이지만 만약 복잡한 코드라면 모든 부분이 a,b,c,d,e,f,g.....z 형태로 변경이 될수가 있는데요. 생각만해도 당혹스러울것 같습니다. 어떻게 본다면 네이밍 룰을 지키지 않고 코딩한것과 비슷한데요. a,b,c,d,e,f,g.....z 로 식별자가 변환된 코드를 본 여러분 라면 어떤 기분이 들까요?

Renaming 기능은 단순히 필드명에 대한 가독성을 떨어트리는 기능 뿐만아니라 심플한 식별자로 대체하기 때문에 실행 시간 또한 좀더 최적화 하며 1석 2조의 효과를 얻을수 있습니다. 
 다시 말씀 드리자면 프로그램 크기가 축소되고 실행속도가 빨라질 수 있습니다.

지금까지 Renaming 기능에 대해서 살펴보았는데요. 내용이 많아 짐에 따라 포스팅을 분리하게 되었습니다.
양해 말씀 드리며 다음 회차를 통해 Control Flow, String Encryption, Pruning 에 대해서 좋은 내용 전달 해도록 노력 하겠습니다.

참고 문헌

- Dotfuscator 4.0 : : http://msdn.microsoft.com/ko-kr/library/ms227240.aspx
 
포스팅을 마치며...

자세한 내용을 전달 하려고하는 욕심으로 포스팅 내용이 제법 길어졌는데요. 회차를 나눠서 제공하려고 하오니 양해해 부탁 드리며 유익한 정보를 제공하고자 노력 하겠습니다. 

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

정은성 드림