Обфускаторы на любой вкус
Проблема современных скриптовых (или использующих промежуточный код для виртуальной машины) языков программирования заключается в том, что любой другой человек может получить доступ к этому коду. Что во многих случаях может быть, мягко говоря, нежелательно. Именно для того, чтобы анализ легкодоступного кода был максимально затруднен, человечество и придумало такие средства, как обфускаторы.
Зачем нужны обфускаторы?
О том, что такое обфускаторы и зачем они могут понадобиться обычному человеку, я уже рассказывал читателям "Компьютерных вестей" в рубрике FAQ, в заметке "Что такое обфускатор и обфускация?". Но с тех пор и вправду прошло немало времени, и, думаю, краткий повтор экскурса в проблему совсем не помешает.
Обфускатор делает программный код трудно читабельным для человека, но при этом он остается синтаксически верным и не вызывает никаких проблем у интерпретатора. Делается это, естественно, для того, чтобы скрыть алгоритмы, которые используются в программе или, скажем, скрыть нарушения лицензии (например, если в коммерческую программу вставлен код, распространяющийся под одной из свободных лицензий, не позволяющих включать его в коммерческие приложения).
Как это работает?
Сам процесс подобного запутывания кода называется обфускацией (собственно говоря, именно отсюда и идет название самих средств её проведения - обфускаторов). Для разных типов программного кода он выглядит, конечно, по-разному. Для кода, написанного на одном из интерпретируемых языков, обфускацию представить сравнительно просто: весь код (если есть такая возможность) записывается в одну строчку, имена переменных меняются на что-то вроде "mdsiw2n23inz", добавляются комментарии, также затрудняющие нормальный анализ кода... Иногда применяется и шифрование, то есть код упаковывается в зашифрованном виде и добавляется специальная функция, которая его расшифровывает и после этого уже отдает "на съедение" виртуальной машине.
В жизни, конечно, все намного сложнее, и описанные выше сравнительно простые методы - просто детский лепет по сравнению с тем, что умеют современные обфускаторы. Кстати, именно о них мы с вами сейчас и будем вести речь - знакомиться, так сказать, лично, с известными обфускаторами, затрудняющими вашим врагам работу по анализу написанного программного кода.
Минусы обфускации
У обфускации есть несколько достаточно существенных минусов, с точки зрения самого разработчика обфусцируемой программы. Самый главный из них состоит в том, что если вдруг исходный код обфусцированного приложения (например, скрипта) каким-то образом вдруг неожиданно потеряется, то восстановить его будет практически невозможно - фактически, такое приложение придется переписывать заново. Впрочем, это ещё не самая большая проблема, потому что при правильной организации работы потерять исходные коды не так уж и просто. Гораздо серьезнее ошибки в самих обфускаторах, которые могут привести к появлению некоторых трудноуловимых ошибок и в самих обфусцированных программах, что на самом деле, мягко говоря, совсем нежелательно. Помимо этого, некоторые методы обфускации могут сказаться (естественно, отрицательным образом) и на производительности приложений, подвергнутых обфускации. Конечно, с учетом мощности сегодняшних компьютеров это не такая уж и большая проблема, но она существует, и когда речь идет об обфускации, её нельзя не принимать в расчет. Так что в ряде случаев от обфускации приходится отказываться либо же довольствоваться сравнительно "безболезненными", но малоэффективными способами защиты.
PHP Defender
www.phpdefender.com
Поскольку PHP - едва ли не самый распространенный из скриптовых языков (что совсем не удивительно, учитывая масштабы его использования в web-приложениях), то и начать стоит именно с обфускатора для этого языка программирования. Конечно, в силу большой популярности PHP обфускаторов для него много, но рассказать обо всех в рамках данной статьи вряд ли представится возможным.
Итак, что же именно умеет делать PHP Defender? Собственно говоря, принцип работы программы описан выше. Как сказано на сайте, PHP Defender "приведет все переменные, функции и классы к нечитаемому виду, удалит все комментарии, лишние пробелы и переносы строк". Что приятно, после такой обработки скрипты будут работать даже на тех хостингах, где не поддерживается или не установлен Zend Optimizer, и вообще для таких скриптов не потребуется никаких дополнительных надстроек на сервере. Кстати говоря, PHP Defender приятен в работе также ещё и тем, что обрабатывает все дерево каталогов за один проход.
Пожалуй, единственными серьёзными минусами этого обфускатора можно считать то, что последнее его обновление относится ещё к 2007 году (хотя, в общем-то, сложно придумать, что еще можно в нем усовершенствовать при обновлении версий - разве что исправлять ошибки), ну, и, кроме того, программа не бесплатная - за неё просят 50 "вечнозеленых".
ProGuard
proguard.sourceforge.net
PHP - это, как вы сами наверняка понимаете, далеко не единственный язык программирования, который требует обфускации. Java, конечно, в отличие от него, не предполагает распространения приложения в виде исходных текстов, однако благодаря некоторым особенностям этого языка реверсный анализ двоичного кода для Java-машины является делом не слишком технически сложным. Как вы, наверное, уже догадались, ProGuard - как раз обфускатор для JVM-кода. Кстати говоря, в отличие от PHP Defender'а, ProGuard совершенно бесплатен (что, в общем-то, можно понять даже из адреса его сайта).
ProGuard - не просто обфускатор, то есть в списке возможностей данного программного продукта есть много функций, которые не относятся непосредственно к защите кода для виртуальной машины от посторонних глаз (хотя, конечно, и без этого, сами понимаете, никак). ProGuard позволяет получать более компактный код (что, например, очень полезно, когда речь идет о Java-апплетах, которые пользователи будут загружать через Интернет), делает код более быстрым (в том числе более быстрой становится его загрузка) и менее требовательным к памяти. Для разработчика ProGuard может быть полезным и с другой стороны: ко всем прочим своим плюсам, программа умеет выявлять "мертвый" программный код, который можно совершенно безболезненно исключить из "исходников". Таким образом, помимо обфускации байт-кода, программа параллельно проводит и его оптимизацию, что, на мой взгляд, можно только приветствовать - в конце концов, мало найдется программ, которым помешает немного дополнительной производительности.
ProGuard может использоваться как из командной строки, так и через "альтернативный" графический пользовательский интерфейс. Есть также плагины для запуска из ANT'и для JME Wireless Toolkit. Ну и, в отличие от первой программы, развитие ProGuard пока не остановилось и в ближайшее время, судя по всему, и не думает останавливаться, что также является серьёзным плюсом для данного программного продукта.
Dotfuscator
www.preemptive.com/products/dotfuscator/overview
Хотя Java - очень популярная среди разработчиков программная платформа, она также не заканчивает список тех платформ, для которых обфускаторы будут нужны и полезны. Для Microsoft .NET эти средства защиты от анализа кода также весьма и весьма актуальны, и один из самых популярных .NET-обфускаторов - Dotfuscator. Он предлагается в разных версиях, и Community Edition этого инструмента наверняка знакома большинству пользователей такой широкой известной среды разработки, как Microsoft Visual Studio. Но, конечно, коммерческие версии продукта предлагают более богатый функционал. Опять-таки, это далеко не единственный обфускатор для платформы .NET, но в силу вполне понятных причин он, пожалуй, распространен даже больше, чем почти все остальные вместе взятые.
Как и ProGuard, Dotfuscator - это достаточно комплексный и многофункциональный инструмент. В коммерческих версиях программы есть такие вещи, как инкрементальная обфускация, усовершенствованная перезагрузка, шифрование строк, переименование префиксов. При этом спектр поддерживаемых типов приложений тоже весьма широк: и офисные приложения, и Silverlight XAP, и satellite-сборки... При этом, как и в случае с ProGuard, есть весьма неплохая интеграция со вспомогательными инструментами, такими, как MSBuild и Visual Studio (хотя тут ещё вопрос, что считать вспомогательным инструментом). Есть также и интерфейс командной строки, чтобы использовать программу совместно с другими средствами автоматизации. При этом также поддерживается "урезание" лишнего и неиспользуемого кода и его оптимизация совместно с обфускацией.
Что ж, наверное, на этом можно завершить рассказ об обфускаторах - хотя, конечно, даже если говорить только о самых широко известных и популярных в широких кругах программных продуктах подобного класса, однако их, на самом деле, существует достаточно большое количество, и говорить можно долго и со вкусом. Что мы и сделаем в одном из следующих номеров "Компьютерных вестей", поскольку вопрос защиты интерпретируемых приложений и приложений, работающих под управлением виртуальной машины, является весьма актуальным в наше время.
Вадим СТАНКЕВИЧ,
dreamdrusch@tut.by