Это перевод рассказа Джо Сьюэлла, разработчика из команды 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, результаты обратной разработки будут иными:
Код защищен обфускацией при переименовании — основной формой обфускации кода. Свойства с простейшими именами, например, ArrowsOnHand, заменены методом присвоения имен, не относящихся к интуитивно понятным, например, b и g. Другие элементы кода также аналогично переименованы. Это сильно затрудняет чтение и формирование декомпилированного кода, поскольку отсутствуют важные контекстуальные ключи, обеспечиваемые именами.
Теперь давайте перейдем к тому, как интегрировать обфускацию при переименовании с помощью Community Edition версии Dotfuscator'а в процесс сборки вашего приложения Xamarin. В качестве примера мы будем использовать приложение Xamarin.Android, упомянутое в предыдущем разделе. Вы можете повторить все с вашим собственным приложением Xamarin, включая версии для iOS и UWP.
Мы будем использовать Dotfuscator PreEmptive Protection — обфускатор и инструмент защиты от .NET, который теперь тоже поддерживает Xamarin.
Примечание: Эти шаги предполагают, что вы разрабатываете ваше приложение в VisualStudio 2017 для Windows.
Прежде всего, вам нужно установить Dotfuscator на вашу машину для разработки. Поскольку мы используем интерфейс командной строки Dotfuscator, вам также нужно будет зарегистрировать вашу копию и записать путь к интерфейсу.
Чтобы установить и настроить Dotfuscator:
Чтобы упростить процесс интеграции, коллектив Dotfuscator создал файл-цель MSBuild targets, на который могут ссылаться ваши проекты Xamarin. Вы можете скачать его здесь.
Сохраните файл PreEmptive.Dotfuscator.Xamarin.targets в каталог с вашим решением, под контролем версий.
Измените Проект под использование интеграции сборки
Далее вам нужно изменить файл проекта для проекта в Visual Studio, который вы хотите подвергнуть обфускации. Чтобы изменить ваш файл проекта:
DotfuscatorXamarinConfigFileNameDotfuscatorConfig.xml/DotfuscatorXamarinConfigFileName
DotfuscatorXamarinGenerateNewConfigFiletrue/DotfuscatorXamarinGenerateNewConfigFile
DotfuscatorXamarinEnabledtrue/DotfuscatorXamarinEnabled
ItemGroupNone Include=«DotfuscatorConfig.xml» //ItemGroup
Теперь вы можете собрать приложение с защитой 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 для всех трех платформ.