Dotfuscator 이해 및 강좌 (펌)

2019. 2. 19. 19:14IT-분석/보안

반응형



(펌 : Dotfuscator를 이용한 솔루션 암호화(난독처리) 원리 )

오늘날 대부분의 상업용 난독 처리기에서는 의미 없는 식별자를 적용하는 이름 바꾸기 기법을 사용합니다. 보통 이러한 식별자는 한 문자 정도로 길이가 짧습니다. 난독 처리기는 코드를 처리할 때 다음 번에 대체할 의미 없는 식별자를 선택합니다. 이름 바꾸기 방법은 겉으로는 간단해 보이지만 되돌릴 수 없다는 점에서 해싱이나 문자 집합 오프셋보다 유용합니다. 프로그램 논리는 유지되지만 이름은 무의미해집니다. 따라서 프로그램 구조를 이해하기가 아주 어려워집니다. a, t.bb(), ct, 2s(e4)와 같은 식별자의 의미를 invoiceID, address.print(), userName, deposit(amount)과 같은 개념으로 유추해 내기는 아주 어렵습니다. 그래도 프로그램 논리는 리버스 엔지니어링할 수 있습니다.

보다 정교한 형태의 난독 처리에는 PreEmptive Solutions에서 고안하여 특허를 받은 알고리즘인 Overload Induction이 사용됩니다. 보통 이름 바꾸기도 여전히 사용되지만 교묘하게 왜곡되기도 합니다. 메서드 식별자는 철저히 범위를 분석한 후에 최대한 오버로드됩니다. Overload Induction은 이전 이름을 각각 하나의 새 이름으로 바꾸는 대신 최대한 많은 메서드의 이름을 동일한 이름으로 바꿉니다. 놀랍게도 이와 같은 복잡한 상황에서도 논리는 손상되지 않습니다. 다음은 Overload Induction 기법의 강력한 기능을 보여 주는 간단한 예입니다.


난독 처리 전의 원본 소스 코드

private void CalcPayroll(SpecialList employeeGroup) {
   while (employeeGroup.HasMore()) {
        employee = employeeGroup.GetNext(true);
        employee.UpdateSalary();
        DistributeCheck(employee);
    }
}

Dotfuscator의 Overload Induction 기능으로 난독 처리한 후 리버스 엔지니어링된 소스 코드

<pre class="code" style="font-family: Consolas, Courier, monospace; line-height: 17.5499992370605px;">private void a(a b) {
    while (b.a()) {
        a = b.a(true);
        a.a();
        a(a);
    }
}

이 예에서 난독 처리된 코드가 더 간단하다는 것을 알 수 있습니다. 이름 바꾸기를 수행하면 부수적으로 크기 축소 효과를 얻을 수 있습니다. 예를 들어, 길이가 20자인 이름을 a()로 바꾸면 많은 공간(19자)이 절약됩니다. 문자열 힙 항목을 보존하는 방식으로도 공간이 절약됩니다. 모든 이름을 ?Ba뵹?바꾼다는 것은 ?Ba뵲?한 번만 저장되므로 ?Ba뵹?이름을 바꾼 메서드나 필드가 모두 ?Ba뵺?가리킬 수 있음을 의미합니다. Overload Induction을 사용하면 가장 짧은 식별자가 계속해서 다시 사용되므로 이 효과는 더욱 커집니다. 일반적으로 Overload Induction이 사용된 프로젝트는 메서드 중 최대 70%의 이름을 a()로 바꿉니다.

Dotfuscator는 MSIL 파일을 처리할 때 파일에서 디버그 정보와 중요하지 않은 메타데이터를 제거합니다. 이렇게 하면 보호 및 보안 성능이 향상될 뿐 아니라 MSIL 파일의 크기가 축소됩니다.

난독 처리는 소스 코드가 아닌 컴파일된 MSIL 코드에 적용되는 프로세스입니다. 이름을 바꾸어도 개발 환경과 도구는 변경되지 않으며 소스 코드는 어떠한 방법으로도 변경되거나 읽히지 않습니다. 난독 처리된 MSIL 코드는 기능적으로 기존 MSIL 코드와 동일하며 CLR(공용 언어 런타임)에서 실행할 때 동일한 결과를 나타냅니다. 그러나 반대의 경우는 가능하지 않습니다. 강력하게 난독 처리된 MSIL을 디컴파일할 수 있다고 해도 원본 소스 코드와 비교하면 의미에 상당한 차이가 있습니다. 다음 그림은 Dotfuscator의 난독 처리 과정을 보여 줍니다.

PreEmptive Solutions에서는 Java용 DashO 도구를 필두로 하여 1996년부터 중간 컴파일된 소프트웨어를 보호하고 향상시켜 왔습니다. PreEmptive Solutions의 제품은 강력한 성능과 다양한 기능 및 특허 받은 고유 기능으로 시장을 주도해 왔습니다.

Dotfuscator는 지적 재산의 보호 문제를 염려할 필요 없이 강력한 .NET 플랫폼을 활용할 수 있도록 해주는 일련의 도구로 제공됩니다. Dotfuscator에는 세 가지 버전이 있습니다.

 Dotfuscator Community Edition은 무료로 기본적인 난독 처리 기능을 제공하는 버전입니다. 식별자의 이름을 바꿔 리버스 엔지니어링에 대한 차단 수준을 올리는 것이 주 목적입니다. Dotfuscator Community Edition에는 보다 쉽게 보호하는 고급 기술이 사용되었습니다. 또한 의미 없는 임시 식별자로 이름을 바꾸기 때문에 크기가 약간 줄어듭니다.


Dotfuscator Community Edition의 제한 사항은 다음과 같습니다.

<ul type="disc" style="font-family: 'Malgun Gothic', Gulim, 'Segoe UI', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif; color: rgb(0, 0, 0); line-height: 17.5499992370605px; white-space: normal;">
  • Visual Studio와 별개로 작동하지 않습니다. 즉, 상업용 빌드 환경에서는 사용할 수 없습니다.
  • .NET 2.0 제네릭 형식 및 메서드의 이름은 바꾸지 않습니다.
  • Microsoft Office 통합용으로 작성된 관리 코드는 Dotfuscator로 난독 처리하지 않습니다.
  • Microsoft SQL Server 2005에서 실행되는 관리 코드는 Dotfuscator로 난독 처리하지 않습니다.
  • 전역 옵션 이외의 라이브러리 모드를 지원하지 않습니다. 라이브러리 모드는 모든 입력 어셈블리에 대해 설정되거나 해제됩니다.
  • 전역 옵션 이외의 선언적 난독 처리 설정을 지원하지 않습니다. 선언적 난독 처리 설정은 모든 입력 어셈블리에 대해 설정되거나 해제됩니다.
  • CLR을 대상으로 하는 C++ 응용 프로그램을 지원하지 않습니다.
  • </ul> 

    사용장법에 대한 강좌~ 내용이 상세하고 좋아서 남김 - VS2008 기준이니 메뉴나 사용법이 약간 차이는 있을듯~ ^^


    (강좌1)

    https://rkttu.tistory.com/entry/Reflector-%EA%B0%95%EC%A2%8C-1-%EB%91%98%EB%9F%AC%EB%B3%B4%EA%B8%B0


    (강좌2)

    https://rkttu.tistory.com/entry/Reflector-%EA%B0%95%EC%A2%8C-2-Disassembling-Analyzing


    (강좌3)

    https://rkttu.tistory.com/entry/Reflector-%EA%B0%95%EC%A2%8C-3-%EB%A6%AC%EC%86%8C%EC%8A%A4-%EB%B6%84%EC%84%9D-%EB%B0%8F-5x-%EB%B2%84%EC%A0%84%EC%9D%84-%EC%9C%84%ED%95%9C-%EB%8B%A4%EC%96%91%ED%95%9C-%ED%94%8C%EB%9F%AC%EA%B7%B8%EC%9D%B8


    나중에 보고 함써좌야징~



    근데~~ themida에 비해서는 별루인듯~