Overload-Induction 메서드 이름 바꾸기

Dotfuscator는 Overload-Induction™이라는 특허 받은 메서드 이름 바꾸기 기술을 구현합니다. 대부분의 이름 바꾸기 시스템은 이전 이름에 새 이름을 하나씩 할당(예: ?CODE>getX()뵶??CODE>a()뵹? ?CODE>getY()뵶??CODE>b()뵹?바뀜)하지만 Overload-Induction은 메서드 오버로드를 최대한 유도합니다. 해당 알고리즘의 기본 개념은 최대한 많은 메서드를 똑같은 이름으로 바꾸는 것입니다. 많은 고객들은 전체 메서드의 33%가 "a()"로 이름이 바뀐다고 보고합니다. 이러한 경우에는 이름을 바꿀 수 있는 메서드가 50%에 달합니다. 본래 이름을 바꿀 수 없는 메서드가 많기 때문에 이름을 바꿀 수 있다고 표현하는 것입니다. 이름을 바꿀 수 없는 메서드에는 생성자, 벯Х】?생성자?및 런타임에 호출되는 메서드가 포함됩니다.

놀랍게도 이와 같은 복잡한 상황에서도 논리는 손상되지 않습니다. 다음은 Overload Induction 기법의 강력한 기능을 보여 주는 간단한 예입니다.

난독 처리 전의 원본 소스 코드
private void CalcPayroll(SpecialList employeeGroup) {
   while (employeeGroup.HasMore()) {
        employee = employeeGroup.GetNext(true);
        employee.UpdateSalary();
        DistributeCheck(employee);
    }
}
Dotfuscator의 Overload Induction 기능으로 난독 처리한 후 리버스 엔지니어링된 소스 코드
private void a(a b) {
    while (b.a()) {
        a = b.a(true);
        a.a();
        a(a);
    }
}

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

이 방법에는 다음과 같은 몇 가지 확실한 장점이 있습니다.

  1. 이름 바꾸기는 디컴파일된 출력을 이해하기 어렵게 만드는 방법으로 오랫동안 사용되어 왔지만 인쇄 불가능한 문자 또는 대상 소스 언어에 맞지 않는 이름으로 이름을 바꾸는 것은 그러한 식별자를 바꾸는 디컴파일러를 쉽게 설치할 수 있으므로 무의미한 일입니다. Overload-Induction이 세 메서드 이름 중 하나를 밶()뵹?바꿀 경우 디컴파일된 출력을 이해하기는 더욱 어려워집니다.
  2. 모든 이름 바꾸기 시스템에 없는 제한은 Overload-Induction에도 없습니다. 이러한 제한에 대해서는 나중에 다시 설명합니다.
  3. Overload-Induction이 동일한 문자를 자주 사용하기 때문에 긴 이름(예: aa, aaa 등)은 더 느리게 연결됩니다. 이러한 방법으로도 공간이 절약됩니다.

Overload-Induction의 특허 받은 알고리즘은 가능한 모든 이름 바꾸기 충돌을 파악하여 안전하다고 생각될 때만 메서드 오버로드를 유도합니다. 프로시저는 되돌리지 못할 수도 있습니다. 즉, Overload-Induction을 다시 실행해도 원래 메서드 이름 관계를 재구성하는 것이 불가능합니다.

© 2002-2007 PreEmptive Solutions. All rights reserved.