Изучение и понимание результатов запутывания
Шаг 1. Использование дизассемблера
В набор разработчика .NET Framework SDK входит средство для дизассемблирования, называемое ildasm, которое позволяет декомпилировать сборки .NET в выражения языка IL Assembly Language. Чтобы запустить ildasm, убедитесь, что установлен набор разработчика .NET Framework SDK и его каталог присутствует в переменной окружения path, после чего введите ildasm в командной строке.
Примечание: если запуск не удался и на компьютере установлена среда Visual Studio, вероятно, каталог ildasm отсутствует в переменной пути path. Чтобы открыть командную строку Visual Studio, последовательно выберите в меню «Пуск» пункты «Visual Studio [версия]» | «Visual Studio Tools» | «Visual Studio [версия] Command Prompt». Введите команду 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 Assembly Language. Можно пойти дальше и повторно сгенерировать фактический исходный код приложения с помощью какого-либо декомпилятора, например Reflector или Anakrino. Указанные инструменты могут выполнять декомпиляцию сборок .NET обратно в язык высокого уровня, например C#, VB .NET или C++.
В данном разделе будут рассмотрены два свободно распространяемых декомпилятора:
- Reflector для .NET, http://www.aisto.com/roeder/dotnet/
- Anakrino (версия с графическим интерфейсом пользователя) / Exemplar (версия для командной строки), http://www.saurik.com/net/exemplar/
Попытка декомпиляции запутанного файла GettingStarted.exe с помощью средства Anakrino/Exemplar вызовет следующую ошибку:
Exemplar.exe has encountered a problem and needs to close. We are sorry for the inconvenience.
При декомпиляции запутанного файла GettingStarted.exe с помощью средства .NET Reflector попытка анализа такого метода, как a(), вызовет следующее исключение:
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 успешно справилась с защитой приложения от декомпиляции с помощью двух самых распространенных декомпиляторов.
© 2002-2007 PreEmptive Solutions. Все права защищены.