Сегодня мы закончим долгий разговор о защите программных продуктов от несанкционированного использования рассказом об обфускаторах для разных платформ и языков, которые присутствуют на рынках, а также обсудим некоторые актуальные тенденции и подводим итоги всего сказанного ранее.
Обфускатор, напомню, - это программа, которая намеренно запутывает программный код, чтобы затруднить его анализ для взломщика. Под обфускаторами обычно имеют в виду программы, которые работают с кодом для виртуальных машин (Java, .NET и так далее) или интерпретаторов скриптовых языков. В прошлый раз мы обсуждали основные приёмы обфускации и пришли к выводу, что применять их вручную неэффективно, гораздо лучше переложить всю "грязную" работу на компьютер. Современные обфускаторы, кстати говоря, достаточно часто не только делают работу по "запутыванию" кода, но и предлагают варианты "навесной" защиты, включающей и проверку серийных номеров, и управление лицензиями, и многое-многое другое. Впрочем, давайте обо всём по порядку.
.NET
Пожалуй, именно платформу .NET, благодаря её популярности в программистском окружении, можно считать лидером по числу написанных для неё обфускаторов. Дело даже не столько в уязвимости .NET-приложений для reverse engineering'а, хотя и это, пожалуй, есть, сколько в том, что .NET достаточно часто используется для создания "коробочных" продуктов, которые особенно сильно нуждаются в предлагаемой обфускаторами защите. Спрос, как известно, рождает предложение, в итоге .NET-разработчикам есть из чего выбирать.
Наиболее известной программой в своей области является dotfuscator (preemptive.com/products/dotfuscator/overview). Известность, конечно, в данном вопросе преимущество более чем спорное, потому что чем известнее протектор, тем больше вероятность взлома защищенной с его помощью программы, но, судя по отзывам в интернете, никто от этого особо не страдает. Да и взламывать, в принципе, особо нечего: бесплатная community-редакция продукта поддерживает только переименование всего и вся. Коммерческая версия обфускатора умеет и шифровать строки, и работать с Silverlight'ом, и с WPF. Но она уже и стоит более тысячи "вечнозелёных".
Еще один пользующийся уважением в .NET-сообществе обфускатор - это .NET Reactor (www.eziriz.com/dotnet_reactor.htm), который предоставляет возможности не только защиты кода с помощью обфускации, но и встраивания в приложение механизмов проверки лицензий и регистрационных ключей. С его помощью можно ограничить время или количество запусков пробной версии, добавить для продукта бесконечные или конечные по времени лицензии и многое другое. Стоит это всё от 180 у.е. и больше.
Нельзя не упомянуть также dotNet Protector (dotnetprotector.pvlog.com). Он стоит от 300 евро и предлагает поддержку ASP.NET-приложений, генерацию пробных версий приложения, собственную систему активации. Но при этом, по отзывам тех, кто им пользовался, dotNet Protector добавляет к приложению очень большой объём своего кода, что, мягко говоря, не очень удобно для тех продуктов, которые распространяются в основном через Всемирную паутину.
Java
Достаточно много обфускаторов и для извечного и главнейшего конкурента Microsoft .NET - Java. Правда, здесь специфика самой платформы и вообще всей экосистемы такова, что в основном на рынке представлены свободные продукты с открытым программным кодом, что выглядит достаточно забавно, если вспомнить, для каких целей обфускаторы обычно применяются.
Самым известным обфускатором для Java является yGuard (www.yworks.com/en/products_yguard_about.htm), хотя, конечно, можете со мной поспорить, но лично мне кажется, что именно он наиболее популярен в русскоязычном Java-сообществе. yGuard "заточен" не столько под защиту коммерческих программных продуктов, сколько под оптимизацию кода по размеру. Ведь Java - до сих пор язык номер один для мобильных платформ, а там это очень важно. yGuard может запускаться как ANT-задача, проводить обфускацию имён практически всех элементов программного кода, причем благодаря гибким возможностям конфигурирования обфускатора с помощью XML этот процесс всегда хорошо контролируем разработчиком. Также продукт может удалять неиспользуемые классы и методы, значительно сокращая объемы байткода, что тоже положительно влияет на размере приложения.
Ещё один, почти такой же известный и популярный - это ProGuard (proguard.sourceforge.net). В принципе, и по функционалу, и, если можно так сказать, по идеологии он достаточно близок к yGuard'у, поэтому особенно подробно на нём останавливаться я не буду.
Если говорить о действительно мощных и комплексных коммерческих обфускаторах, то среди таких для Java на первом месте, на мой взгляд, должен стоять Zelix KlassMaster (www.zelix.com/klassmaster/index.html). Помимо изменения имён элементов кода, с которым прекрасно справляются и бесплатные обфускаторы, Zelix KlassMaster предлагает обфускацию потока выполнения, шифрование строк и прочие сугубо защитные технологии. Впрочем, он также умеет "выкидывать" ненужный код и выполнять другие задачи по оптимизации байт-кода приложения. Стоит он, кстати, по меркам .NET-обфускаторов тоже не так уж и дорого: 200 долларов за "Small Developer"-лицензию и 400 - за стандартную.
JavaScript
Не обойтись без обфускатора и создателям коммерческих скриптов для браузеров. К счастью, таких обфускаторов тоже существует немалое количество. Они также используются не только для защиты, но и для уменьшения размеров скриптов.
Здесь, кстати, есть и Web-приложения - например, www.javascriptobfuscator.com. Прямо в браузере вы вводите в форму на Web-странице свой JavaScript, нажимаете "Obfuscate" и получаете обфусцированный код. Сервис совершенно бесплатен. Есть, впрочем, и "классические" скачиваемые продукты для обфускации JavaScript'а: ObfuscateJS (tools.2vi.nl/index.html), Digua (digua.sourceforge.net, не только для JS, но и для HTML'а с CSS'ом), JSO (www.usefulsnippets.com/open-source-javascript-obfuscator.html). В общем, подобных программ достаточно много, все они более-менее похожи друг на друга, поэтому особо долго и тщательно выбирать вряд ли есть смысл.
Другие языки и платформы
Конечно, для других скриптовых языков тоже имеются свои обфускаторы, которые нужны, в основном, чтобы уменьшить размер кода и иногда оптимизировать скорость его выполнения. По вполне понятным причинам их все в одну статью уместить никак не удастся, даже если просто составлять список. Поэтому просто приведу несколько примеров обфускаторов для разных языков:
- PHP: PHP Defender, PHP Processor, PHP UnReader;
- Perl: Perl Code Obfuscator, Stunnix Perl-Obfus, rjsPerlObfuscator;
- Python: pyobfuscate, BitBoost Obfuscator for Python Source Code;
- Ruby: ZenObfuscate, RubyEncoder;
- VBScript: Stunnix ASP and VBScript Obfuscator and Encoder, VBScript Source Code Obfuscator.
Немного итогов и тенденций
В общем, наверное, достаточно сложно подводить какие-то итоги, потому что главным итогом должна быть информация, которую вы, уважаемые читатели, вынесли из изучения этой серии статей. Вывод же таков: защита программных продуктов от несанкционированного использования - задача достаточно трудоёмкая, поэтому не стоит вкладывать в неё больше сил и времени (и денег, соответственно, тоже), чем она в действительности заслуживает. Главный принцип любой системы защиты должен звучать так: купить должно быть проще и выгоднее, чем украсть.
А теперь о тенденциях. Они, в принципе, тоже лежат на поверхности. Главная из них состоит в том, что защита усложняется. Как сообщество разработчиков коммерческих программных продуктов, так и сообщество взломщиков накопили достаточно знаний и приёмов борьбы с теми, кто находится "по другую сторону баррикад". Поэтому те приёмы, которые были эффективными 10 лет назад, сегодня кажутся смешными и нелепыми. С другой стороны, меняются и способы монетизации ПО: если на заре эпохи персональных компьютеров зарабатывать на рекламе с помощью бесплатных программных продуктов было нонсенсом, то сегодня становится всё менее актуальной как раз "классическая" схема продажи программных продуктов через демо-версии и рекламные материалы, без пробной версии.
Так что в защите очень важен творческий подход и нетривиальные решения. Как, впрочем, и вообще в бизнесе по разработке программных продуктов во всех их ипостасях. Мантра о том, что ИТ-индустрия очень быстро развивается, и поэтому повсеместно необходимы инновационные решения - совсем не пустые слова. Впрочем, и аутсорсингом защиты пренебрегать не стоит: на ранних этапах развития продукта, когда ещё количество взломанных копий не будет сильно влиять на продажи, лучше купить чужую защиту и перестать этим "заморачиваться", сосредоточившись на критическом для успеха функционале программы.
Ну и, конечно, не помешает помнить, что техническая часть - ещё не всё, что нужно сделать, чтобы взломанные копии не мешали вам жить и радоваться продажам вашего софта. Впрочем, борьба с пиратами не на уровне защиты приложения - это уже совсем-совсем другая история...
Вадим СТАНКЕВИЧ,
dreamdrusch@tut.by
Горячие темы