다음을 통해 공유


난독 처리된 출력 확인 및 이해

1단계 – 디스어셈블러 사용

.NET Framework SDK는 ildasm이라는 디스어셈블러 유틸리티와 함께 제공됩니다. 이 유틸리티를 사용하면 .NET 어셈블리를 IL 어셈블리 언어 문으로 디컴파일할 수 있습니다. ildasm을 시작하려면 .NET Framework SDK가 설치되어 있고 ildasm이 현재 경로에 있는지 확인하고 명령줄에 ildasm을 입력합니다.

참고: Visual Studio가 설치되어 있는데 이 방법으로 시작할 수 없으면 ildasm이 현재 경로에 없는 것일 수 있습니다. Visual Studio 명령 프롬프트를 열려면 시작 메뉴에서 Visual Studio [버전] | Visual Studio 도구 | Visual Studio [버전] 명령 프롬프트를 선택하고 ildasm을 입력합니다.

  • 파일 | 열기 메뉴를 선택하고 다음을 찾습니다.
C:\Program Files\PreEmptive Solutions\Dotfuscator Professional Edition 4.0\samples\GettingStarted\bin\Debug 
  • 그런 다음 GettingStarted.exe를 선택하고 열기를 클릭합니다. 디스어셈블된 어셈블리 보기가 다음과 같이 나타납니다.

  • 현재 표시된 내용, 즉 난독 처리되지 않은 HelloWorld 응용 프로그램을 난독 처리된 버전과 비교하려면 다른 ildasm을 시작합니다. 여기서는 다음을 찾습니다.
C:\Program Files\PreEmptive Solutions\Dotfuscator Professional Edition 4.0\samples\GettingStarted\Dotfuscated 
  • 그런 다음 GettingStarted.exe를 선택하고 열기를 클릭합니다.

각 ildasm 창을 나란히 배열합니다. 두 그림을 비교 및 대조합니다.

난독 처리되지 않은 디스어셈블리에 포함된 메서드의 이름은 매우 이해하기 쉬울 것입니다. 예를 들어, ConverseButton_Click: void (object, class [mscorlib]System.EventArgs) 메서드는 Converse 단추를 클릭할 때 호출된다고 짐작할 수 있습니다. 이제 난독 처리된 버전을 보겠습니다. Converse 단추를 클릭하면 어떤 메서드가 호출되겠습니까? 쉽게 알 수 없습니다. 또한 SaySomething 메서드를 찾을 수 없습니다. 이 메서드는 코드에서 사용되지 않기 때문에 제거되었습니다.

원래 어셈블리에서 SayHello:string() 메서드를 두 번 클릭하고 난독 처리된 어셈블리에서 a:string()을 두 번 클릭합니다. 이 두 메서드는 사실 같은 것입니다. 그러나 디스어셈블된 IL 코드를 자세히 검사하면 난독 처리된 버전에서 문자열이 암호화되어 있어 코드가 더 읽기 어렵다는 것을 알 수 있습니다. 예를 들어, 난독 처리되지 않은 버전에서 다음 줄을 찾습니다.

IL_0000:  ldstr      "Hello, my name is "

이제 난독 처리된 버전을 보고 위 문자열을 찾아 보십시오. 찾을 수 없다면 암호화되어 다음과 같이 표시되기 때문입니다.

IL_0000: ldstr bytearray (09 42 26 44 29 46 2B 48 26 4A 67 4C 6D 4E 22 50   
                          28 52 73 54 3B 56 36 58 34 5A 3E 5C 7D 5E 36 60   
                          12 62 43 64 )

이와 같은 작업으로 코드를 리버스 엔지니어링하려는 사람이 얼마나 혼동스러울지는 능히 짐작할 수 있을 것입니다. 특히 더 복잡한 응용 프로그램에서는 더 그럴 것입니다.

2단계 – 디컴파일

실제로 IL 어셈블리 언어에 대해 알고 있는 소수의 기술 전문가만 소스 코드에 액세스할 것이라고 생각하고 있다면 오산입니다. 심지어 Reflector나 Anakrino 같은 디컴파일러를 사용하여 응용 프로그램으로부터 소스 코드를 다시 만들 수도 있습니다. 이러한 유틸리티를 사용하면 .NET 어셈블리를 C#, VB .NET 또는 C++ 같은 높은 수준의 언어로 직접 다시 디컴파일할 수 있습니다.

이 절에서는 무료로 사용할 수 있는 디컴파일러 두 개를 사용합니다.

  1. .NET용 Reflector - http://www.aisto.com/roeder/dotnet/
  2. Anakrino(GUI 버전)/Exemplar(명령줄 버전) - http://www.saurik.com/net/exemplar/

Dotfuscator로 난독 처리된 GettingStarted.exe 파일에 대해 Anakrino/Exemplar를 실행하면 다음 오류가 발생합니다.

Exemplar.exe has encountered a problem and needs to close.  We are sorry for the inconvenience.

Dotfuscator로 난독 처리된 GettingStarted.exe 파일에 대해 .NET Reflector를 실행하고 a() 같은 메서드를 검사할 경우 다음 예외가 throw됩니다.

This item appears to be obfuscated and can not be translated.

System.NotSupportedException: Cannot resolve local variable 'Label_0047'.
   at Reflector.CodeModel.Memory.GotoStatement.Resolve()
   at _12.VisitBlockStatement(IBlockStatement statement)
   at _111.VisitStatement(IStatement value)
   at _119.VisitMethodDeclaration(IMethodDeclaration value)
   at _125.VisitMethodDeclaration(IMethodDeclaration value)
   at _126.VisitMethodDeclaration(IMethodDeclaration value)
   at _123.VisitMethodDeclaration(IMethodDeclaration value)
   at _146._1(Boolean )

따라서 Dotfuscator Professional에서 두 개의 주 디컴파일러가 Dotfuscator로 난독 처리된 코드를 리버스 엔지니어링하지 못하도록 방해했습니다.

© 2002-2007 PreEmptive Solutions. All rights reserved.