Это перевод рассказа Джо Сьюэлла, разработчика из команды Dotfuscator на PreEmptiveSolutions.
Давайте говорить честно: выпуск библиотеки, приложения для рабочего стола или мобильного приложения может стать горьким опытом. Как только вы выкладываете вашу программу в открытый доступ для всего мира, вы в определенной степени утрачиваете контроль над тем, как она используется. В частности, разработчики часто имеют дело с угрозой обратной разработки.
На многих платформах и во многих языках известным способом защиты от обратной разработки являются инструменты запутывания кода. Например, если вы — разработчик на платформе Android, вы, возможно, уже пользуетесь ProGuard для сокращения и обфускации кода на Java.
Теперь разработчики Xamarin имеют доступ к защите того же типа по всем основным семействам мобильных устройств, от Android и iOS до Universal Windows (UWP). Инструмент для работы называется Dotfuscator, версия Community Edition которого доступна в Visual Studio.
Сегодня мы рассмотрим, как обфускация может защитить приложение Xamarin. Android от обратной разработки, и как вы сможете применить ту же защиту для ваших собственных приложений Xamarin всего за несколько простых шагов.
Обфускация — это процесс, в ходе которого компилированный код приложения трансформируется в функционально идентичный код, который труднее подвергнуть обратной разработке. Обычно это делается с помощью инструмента автоматической обфускации или обфускатора. Далее приводится простой пример для иллюстрации, как запутывание кода защищает приложения от обратной разработки.
Рассмотрим нижеприведенный метод C# в исходном коде для игры Xamarin.Android:
Когда разработчики этой игры готовы встроить ее в устройство или выгрузить в магазин приложений, они компилируют исходный код в библиотеки и затем упаковывают эти библиотеки в пакет приложений. В данном примере разработчики упаковали библиотеки в файл APK для распространения на устройствах на платформе Android.
Однако, как только приложение выложено в магазин приложений, «плохой человек» может легко получить и вскрыть APK, генерируя декомпилированный код, который почти идентичен исходному коду в оригинале:
Обратите внимание, что тип, метод и идентификаторы элементов здесь те же, что и в исходном коде, даже если элементы кода обычно недоступны за пределами проекта (например, имеют маркировку internal («внутренний»)). Также обратите внимание, что поток общих команд метода, например, порядок операторов if («если»), отчетливо виден.
Если до распространения APK разработчики уже запускали библиотеки через версию Dotfuscator Community Edition, результаты обратной разработки будут иными:
Код защищен обфускацией при переименовании — основной формой обфускации кода. Свойства с простейшими именами, например,
Теперь давайте перейдем к тому, как интегрировать обфускацию при переименовании с помощью Community Edition версии Dotfuscator'а в процесс сборки вашего приложения Xamarin. В качестве примера мы будем использовать приложение Xamarin.Android, упомянутое в предыдущем разделе. Вы можете повторить все с вашим собственным приложением Xamarin, включая версии для iOS и UWP.
Мы будем использовать Dotfuscator PreEmptive Protection — обфускатор и инструмент защиты от .NET, который теперь тоже поддерживает Xamarin.
Примечание: Эти шаги предполагают, что вы разрабатываете ваше приложение в VisualStudio 2017 для Windows.
Прежде всего, вам нужно установить Dotfuscator на вашу машину для разработки. Поскольку мы используем интерфейс командной строки Dotfuscator, вам также нужно будет зарегистрировать вашу копию и записать путь к интерфейсу.
1. Зайдите на страницу Dotfuscator Downloads (Загрузки) на сайте PreEmptive Solutions.
2. Загрузите последнюю версию Dotfuscator Community Edition (CE) для Visual Studio 2017.
3. Откройте файл VSIX, который вы загрузили, и следуйте инструкциям.
4. Откройте Visual Studio 2017 и выберите Tools (инструменты) — PreEmptive Protection (вытесняющая защита)— Dotfuscator, чтобы запустить интерфейс пользователя Dotfuscator Community Edition
5. Вам нужно будет зарегистрировать вашу копию Dotfuscator, прежде чем вы сможете пользоваться интерфейсом командной строки. Dotfuscator выдаст запрос на регистрацию, когда вы откроете его в первый раз; следуйте этим инструкциям.
6. Вам нужно знать путь к интерфейсу командной строки, чтобы позже конфигурировать интеграцию сборки. Чтобы найти этот путь:
Чтобы упростить процесс интеграции, коллектив Dotfuscator создал файл-цель MSBuild targets, на который могут ссылаться ваши проекты Xamarin. Вы можете скачать его здесь.
Сохраните файл PreEmptive.Dotfuscator.Xamarin.targets в каталог с вашим решением, под контролем версий.
Измените Проект под использование интеграции сборки. Далее вам нужно изменить файл проекта для проекта в Visual Studio, который вы хотите подвергнуть обфускации.
Теперь вы можете собрать приложение с защитой Dotfuscator. Чтобы сделать это:
Более подробную информацию о продолжении разработки с установленной обфускацией см. в разделе «Продолжение разработки» в Руководстве Пользователя Dotfuscator.
Есть некоторые случаи, когда приложение предполагает, что имя элемента кода во время компиляции будет таким же, как во время работы приложения. Это, в частности, верно для приложений Xamarin на основе XAML и рефлексии. Обфускация путем переименования может нарушить эту предпосылку и привести к тому, что приложение после обфускации будет вести себя по-другому.
Хотя более новые версии Dotfuscator больше способны работать с такими сценариями автоматически, в некоторых случаях может потребоваться конфигурация вручную. Инструкции и примеры см. на странице «Идентифицировать исключения из переименования» в Руководстве Пользователя Dotfuscator.
Вместо бесплатной версии Dotfuscator Community Edition вы можете также подвергнуть ваши приложения Xamarin обфускации в версии Dotfuscator Professional Edition. Версия Professional Edition лицензирована для использования в коммерческих продуктах, бесплатные пробники есть в наличии по запросу.
Чтобы увидеть разницу между версиями Community и Professional, рассмотрим пример игры, упомянутый выше. Если разработчики пропустили свои каталоги через Dotfuscator Professional Edition вместо Community Edition, результаты обратной разработки будут выглядеть примерно так:
В дополнение к обфускации путем переименования этот код также подвергнут обфускации путем изменения потока управления. Операторы исходного кода перемежаются сложными для восприятия блоками «переключения» в кажущемся произвольным порядке, что сильно затрудняет выполнение команд. Эта и другие продвинутые формы обфускации содержатся исключительно в Dotfuscator Professional Edition.
В этом посте мы увидели, как можно использовать Dotfuscator для защиты каталогов и приложений Xamarin от обратной разработки. Хотя мы использовали в качестве примера приложение на основе Android, те же самые шаги можно выполнить и для проектов на основе iOS и UWP, поэтому вы можете защитить ваше приложение независимо от того, на какой платформе оно работает.
Более подробные сведения о том, как защитить проекты Xamarin с помощью Dotfuscator, см. на странице Xamarin в Руководстве Пользователя Dotfuscator. Там вы также найдете гит-репозиторий, демонстрирующий, как интегрировать Dotfuscator в приложение Xamarin для всех трех платформ.
Давайте говорить честно: выпуск библиотеки, приложения для рабочего стола или мобильного приложения может стать горьким опытом. Как только вы выкладываете вашу программу в открытый доступ для всего мира, вы в определенной степени утрачиваете контроль над тем, как она используется. В частности, разработчики часто имеют дело с угрозой обратной разработки.
На многих платформах и во многих языках известным способом защиты от обратной разработки являются инструменты запутывания кода. Например, если вы — разработчик на платформе Android, вы, возможно, уже пользуетесь ProGuard для сокращения и обфускации кода на Java.
Теперь разработчики Xamarin имеют доступ к защите того же типа по всем основным семействам мобильных устройств, от Android и iOS до Universal Windows (UWP). Инструмент для работы называется Dotfuscator, версия Community Edition которого доступна в Visual Studio.
Сегодня мы рассмотрим, как обфускация может защитить приложение Xamarin. Android от обратной разработки, и как вы сможете применить ту же защиту для ваших собственных приложений Xamarin всего за несколько простых шагов.
Как обфускация защищает приложения
Обфускация — это процесс, в ходе которого компилированный код приложения трансформируется в функционально идентичный код, который труднее подвергнуть обратной разработке. Обычно это делается с помощью инструмента автоматической обфускации или обфускатора. Далее приводится простой пример для иллюстрации, как запутывание кода защищает приложения от обратной разработки.
Рассмотрим нижеприведенный метод C# в исходном коде для игры Xamarin.Android:
Когда разработчики этой игры готовы встроить ее в устройство или выгрузить в магазин приложений, они компилируют исходный код в библиотеки и затем упаковывают эти библиотеки в пакет приложений. В данном примере разработчики упаковали библиотеки в файл APK для распространения на устройствах на платформе Android.
Однако, как только приложение выложено в магазин приложений, «плохой человек» может легко получить и вскрыть APK, генерируя декомпилированный код, который почти идентичен исходному коду в оригинале:
Обратите внимание, что тип, метод и идентификаторы элементов здесь те же, что и в исходном коде, даже если элементы кода обычно недоступны за пределами проекта (например, имеют маркировку internal («внутренний»)). Также обратите внимание, что поток общих команд метода, например, порядок операторов if («если»), отчетливо виден.
Если до распространения APK разработчики уже запускали библиотеки через версию Dotfuscator Community Edition, результаты обратной разработки будут иными:
Код защищен обфускацией при переименовании — основной формой обфускации кода. Свойства с простейшими именами, например,
ArrowsOnHand
, заменены методом присвоения имен, не относящихся к интуитивно понятным, например, b и g. Другие элементы кода также аналогично переименованы. Это сильно затрудняет чтение и формирование декомпилированного кода, поскольку отсутствуют важные контекстуальные ключи, обеспечиваемые именами.Как подвергнуть ваше приложение обфускации
Теперь давайте перейдем к тому, как интегрировать обфускацию при переименовании с помощью Community Edition версии Dotfuscator'а в процесс сборки вашего приложения Xamarin. В качестве примера мы будем использовать приложение Xamarin.Android, упомянутое в предыдущем разделе. Вы можете повторить все с вашим собственным приложением Xamarin, включая версии для iOS и UWP.
Мы будем использовать Dotfuscator PreEmptive Protection — обфускатор и инструмент защиты от .NET, который теперь тоже поддерживает Xamarin.
Примечание: Эти шаги предполагают, что вы разрабатываете ваше приложение в VisualStudio 2017 для Windows.
Установка и настройка Dotfuscator
Прежде всего, вам нужно установить Dotfuscator на вашу машину для разработки. Поскольку мы используем интерфейс командной строки Dotfuscator, вам также нужно будет зарегистрировать вашу копию и записать путь к интерфейсу.
Чтобы установить и настроить Dotfuscator:
1. Зайдите на страницу Dotfuscator Downloads (Загрузки) на сайте PreEmptive Solutions.
2. Загрузите последнюю версию Dotfuscator Community Edition (CE) для Visual Studio 2017.
- Хотя Dotfuscator включен в Visual Studio, PreEmptive Solutions периодически выпускает важные обновления Dotfuscator между выпусками обновлений Visual Studio. Установка Dotfuscator таким способом гарантирует, что вы получаете самую свежую версию.
3. Откройте файл VSIX, который вы загрузили, и следуйте инструкциям.
4. Откройте Visual Studio 2017 и выберите Tools (инструменты) — PreEmptive Protection (вытесняющая защита)— Dotfuscator, чтобы запустить интерфейс пользователя Dotfuscator Community Edition
5. Вам нужно будет зарегистрировать вашу копию Dotfuscator, прежде чем вы сможете пользоваться интерфейсом командной строки. Dotfuscator выдаст запрос на регистрацию, когда вы откроете его в первый раз; следуйте этим инструкциям.
- Чтобы зарегистрироваться позже (register later) или проверить свой статус регистрации, найдите текст Registration status (статус регистрации) в правом верхнем углу стартовой страницы Dotfuscator Community Edition.
6. Вам нужно знать путь к интерфейсу командной строки, чтобы позже конфигурировать интеграцию сборки. Чтобы найти этот путь:
- Перейдите в установочный каталог для вашей установки Visual Studio 2017. Например, установочный каталог по умолчанию для Visual Studio 2017 Professional — это C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional.
- В этом каталоге находятся файлы расширения Dotfuscator Community Edition в *\Common7\IDE\Extensions\PreEmptiveSolutions\DotfuscatorCE.
- Файл dotfuscatorCLI.exe — это интерфейс командной строки Dotfuscator Community Edition.
- Запишите полный путь к EXE-файлу для использования в будущем.
Загрузите файл интеграции сборки
Чтобы упростить процесс интеграции, коллектив Dotfuscator создал файл-цель MSBuild targets, на который могут ссылаться ваши проекты Xamarin. Вы можете скачать его здесь.
Сохраните файл PreEmptive.Dotfuscator.Xamarin.targets в каталог с вашим решением, под контролем версий.
Измените Проект под использование интеграции сборки. Далее вам нужно изменить файл проекта для проекта в Visual Studio, который вы хотите подвергнуть обфускации.
Чтобы изменить ваш файл проекта:
- Определите, какие конфигурации сборки проекта вы хотите защитить. Обычно это все конфигурации, кроме конфигураций Debug (отладка). Более детальные инструкции см. в разделе полной документации «Выберите, что защищать».
- Откройте файл проекта в текстовом редакторе. Примером файла проекта для C# будет `YourProjectName.csproj`.
- Определите относительный путь от этого файла до файла интеграции сборки, который вы скачали.
- Импортируйте файл интеграции сборки, добавив следующую строку к файлу непосредственно перед фрагментом /Project:
- Import Project="..\..\PreEmptive.Dotfuscator.Xamarin.targets» /, заменяя относительный путь, определенный в Шаге 3.
- Под фрагментом PropertyGroup без атрибута Condition добавьте следующие фрагменты:
- DotfuscatorXamarinCliPathC:\pathto\dotfuscatorCLI.exe/DotfuscatorXamarinCliPath, заменяя полный путь к интерфейсу командной строки Dotfuscator Community Edition, который вы записали ранее.
- DotfuscatorXamarinConfigFileNameDotfuscatorConfig.xml/DotfuscatorXamarinConfigFileName
- DotfuscatorXamarinGenerateNewConfigFiletrue/DotfuscatorXamarinGenerateNewConfigFile
- Для каждой конфигурации интеграции сборки, выбранной в Шаге 1, найдите соответствующий PropertyGroup и добавьте следующий фрагмент:
- DotfuscatorXamarinEnabledtrue/DotfuscatorXamarinEnabled
- После последнего фрагмента ItemGroup добавьте следующее:
- ItemGroupNone Include=«DotfuscatorConfig.xml» //ItemGroup
- Сохраните и закройте файл.
Соберите приложение
Теперь вы можете собрать приложение с защитой Dotfuscator. Чтобы сделать это:
- Откройте или снова загрузите ваш проект в Visual Studio
- Выберите конфигурацию сборки решения, которая проверяет конфигурацию сборки проекта, которую вы хотите защитить
- Соберите проект
- После этой первой сборки определите, содержит ли результат сборки следующие строки, касающиеся Dotfuscator:
- добавление файла DotfuscatorConfig.xml в ваш проект. Это файл конфигурации Dotfuscator, который сообщает Dotfuscator'у, как проводить обфускацию вашего кода. Рекомендуется проверить его в системе контроля версий.
- В структуре каталогов и файлов найдите новый каталог DotfuscatorReports в каталоге вашего проекта. Этот каталог содержит информацию о том, как прошла обфускация проекта, включая сведения о том, как развернуть процесс переименования обратно. Вам следует обработать этот каталог аналогично результату сборки и убедиться, что система контроля версий игнорирует его.
- Протестируйте ваше приложение. Если вы видите ошибки, вам может понадобиться дальнейшая конфигурация Dotfuscator'а, чтобы добиться корректного поведения см. следующий раздел для справки.
- Продолжайте разрабатывать ваше приложение, собирая его как обычно. Когда Dotfuscator используется во время сборки, результат сборки будет содержать следующие строки:
Более подробную информацию о продолжении разработки с установленной обфускацией см. в разделе «Продолжение разработки» в Руководстве Пользователя Dotfuscator.
Конфигурация переименования
Есть некоторые случаи, когда приложение предполагает, что имя элемента кода во время компиляции будет таким же, как во время работы приложения. Это, в частности, верно для приложений Xamarin на основе XAML и рефлексии. Обфускация путем переименования может нарушить эту предпосылку и привести к тому, что приложение после обфускации будет вести себя по-другому.
Хотя более новые версии Dotfuscator больше способны работать с такими сценариями автоматически, в некоторых случаях может потребоваться конфигурация вручную. Инструкции и примеры см. на странице «Идентифицировать исключения из переименования» в Руководстве Пользователя Dotfuscator.
Продвинутая обфускация
Вместо бесплатной версии Dotfuscator Community Edition вы можете также подвергнуть ваши приложения Xamarin обфускации в версии Dotfuscator Professional Edition. Версия Professional Edition лицензирована для использования в коммерческих продуктах, бесплатные пробники есть в наличии по запросу.
Чтобы увидеть разницу между версиями Community и Professional, рассмотрим пример игры, упомянутый выше. Если разработчики пропустили свои каталоги через Dotfuscator Professional Edition вместо Community Edition, результаты обратной разработки будут выглядеть примерно так:
В дополнение к обфускации путем переименования этот код также подвергнут обфускации путем изменения потока управления. Операторы исходного кода перемежаются сложными для восприятия блоками «переключения» в кажущемся произвольным порядке, что сильно затрудняет выполнение команд. Эта и другие продвинутые формы обфускации содержатся исключительно в Dotfuscator Professional Edition.
Выводы
В этом посте мы увидели, как можно использовать Dotfuscator для защиты каталогов и приложений Xamarin от обратной разработки. Хотя мы использовали в качестве примера приложение на основе Android, те же самые шаги можно выполнить и для проектов на основе iOS и UWP, поэтому вы можете защитить ваше приложение независимо от того, на какой платформе оно работает.
Более подробные сведения о том, как защитить проекты Xamarin с помощью Dotfuscator, см. на странице Xamarin в Руководстве Пользователя Dotfuscator. Там вы также найдете гит-репозиторий, демонстрирующий, как интегрировать Dotfuscator в приложение Xamarin для всех трех платформ.
Комментарии (4)
LightSUN
14.02.2018 21:58Из бесплатного ещё есть форк ConfuserEx. Не сильно конкурент платным решениям, но довольно неплохой.
rtnmmm
15.02.2018 08:52А что будет, после обфускации, с информативностью crush dump, выгружаемых в такие сервисы как, например, appcenter.ms?
Solexid
Все конечно хорошо, но если пользуешься рефлексией, то дотфускатор всё ломает просто в ноль.
Dimmov21
В случае рефлексии можно добавить исключения в нужные места:
[System.Reflection.Obfuscation(Exclude = true)]