Анализ способов защиты приложений… А.А. КРАСНОПЕВЦЕВ Московский инженерно-физический институт (государственный университет) АНАЛИЗ СПОСОБОВ ЗАЩИТЫ ПРИЛОЖЕНИЙ, КОМПИЛИРУЕМЫХ В БАЙТ-КОД ОТ НЕСАНКЦИОНИРОВАННОГО КОПИРОВАНИЯ Целью данной статьи являлся анализ способов защиты от копирования приложений, компилируемых в некоторое промежуточное представление. В статье проведен анализ методов, используемых при защите .NET-приложений, рассмотрены положительные и отрицательные стороны приведенных методов защиты приложений. Защита программного обеспечения до момента появления систем разработки приложений типа технологии .NET, разработанной фирмой Microsoft, или технологии Java, разработанной Sun Microsystems, зачастую сводилась к использованию недостатков существующей и используемой на данный момент архитектуры представления кода и данных для процессора. При появлении технологий типа .NET, т.е. технологий которые компилируют код приложения в некоторое промежуточное представление, для злоумышленника, осуществляющего анализ программы с целью компрометации, все становится гораздо проще и прозрачнее. Представление данных в приложении, созданном с использованием технологии .NET достаточно полно, а иногда даже и избыточно, описывает сборку и содержащийся в ней код и данные. Большинство методов, которые применяются и эффективно используются при защите приложений содержащих машинный код, будут неэффективны при защите .NET-сборок. Это связано с тем, что вследствие хорошего описания внутренней архитектуры приложения было создано большое количество средств для анализа. Среди этих средств имеются даже автоматические декомпиляторы кода приложения. Вследствие этого были разработаны методы, которые применяются и используются для защиты .NET-приложений. Далее приводится анализ этих методов защиты. Защита приложения с помощью «неуправляемых» библиотек[1-3]. Данный метод защиты заключается в том, что .NET-приложение некоторым образом привязывается к библиотеке, компилируемой в машинный код. Т.е., например, часть кода приложения может быть зашифрована, а алгоритм шифрования, ключ и какие-то параметры могут быть сокрыты в «неуправляемой» библиотеке. Роль библиотеки в данном случае может быть различной, она может как периодически подсчитывать контрольные суммы, так и каким-либо способом модифицировать приложение. Рассматриваемый метод, например, используется в таком комплексе автоматической защиты, как .NET Reactor. Кроме того, такая библиотека может содержать какие-либо криптографические преобразования. Как говорилось выше, поиск кода и его анализ в .NET приложениях гораздо более простая задача, нежели в приложениях, компилируемых в машинный код. Таким образом, данный метод защиты сводит задачу защиты .NET-приложения к защите обычной библиотеки. Виртуализация участков кода защищаемого приложения[1]. Основная суть данного метода заключается в том, что злоумышленнику необходимо анализировать не ассемблерный код приложения, а некоторый код, который будет исполняться на интерпретаторе, называемым виртуальной машиной. Такой код называют псевдокодом. При использовании защиты, основанной на виртуальной машине и псевдокоде, сложность для злоумышленника в основном составляет то, что данный псевдокод не документирован, следовательно, при анализе программы, защищенной таким способом, сначала необходимо узнать формат команд данной виртуальной машины, их размеры и установить соответствие команды виртуальной машины и инструкции ассемблера. Зачастую, при создании данного класса защит, для каждой отдельно взятой защищаемой программы генерируется своя виртуальная машина со своим набором команд. Такой подход достаточно эффективен, так как при «взломе» злоумышленником одной из защищенных программ совершенно не следует, что и остальные будут «взломаны» по тому же алгоритму. При компрометации каждой отдельной программы приходится с самого начала проводить анализ виртуальной машины и используемого ею псевдокода. В результате «накрытия» приложения псевдоком опять же увеличивается время, затрачиваемое злоумышленником на анализ приложения. Кроме того, виртуальная машина может быть настолько сложной, что некомпетентный злоумышленник вообще не сможет скомпрометировать приложение. Фактически, при дизассемблировании защищенного приложения злоумышленнику будет предоставлен некоторый программный «мусор», который в ассемблерных командах не несет никакой логической нагрузки. В результате для анализа кода программы и для дальнейшей его модификации злоумышленнику придется разобраться с набором команд данной виртуальной машины и с принципами ее работы. ISBN 978-5-7262-1179-4. НАУЧНАЯ СЕССИЯ МИФИ-2009. Том V 1 Анализ способов защиты приложений… Метод защиты с использованием виртуальных машин также можно использовать как некоторое промежуточное представление при защите приложения: для произведения каких-либо модификаций с кодом приложения, например, для запутывания кода приложения, для упрощения работы обфускатора. В таком случае ассемблерный код приложения преобразуется в некоторое промежуточное представление, которое более детально описывает каждое конкретное состояние и позволяет более просто проводить запутывание как кода приложения, так и графа потока управления. Методы запутывания кода .NET приложений.[4, 5] Данный класс методов защиты основан на запутывании кода приложения, что приводит к усложнению его анализа злоумышленником. Если быть более точным, то усложнение анализа возникает за счет того, что код приложения достаточно сильно запутывается, становится трудно читаемым и достаточно тяжелым к разбору и понимаю его. Таким образом, увеличивается время, которое потребуется для анализа и компрометации приложения. Причем в зависимости от типа запутывания и его сложности время анализа может возрастать в разы. Запутывание кода может быть двух видов: символьная обфускация, запутывание графа потока управления. Символьная обфускация подразумевает замену имен функций, классов, а также пространств имен в приложении на некоторые нечитаемые и схожие названия. В результате злоумышленник будет иметь набор функций с очень схожими названиями, в которых достаточно просто запутаться, что усложнит анализ. Например, если каждую функцию в приложении обозначать некоторым шестизначным числом, то при анализе злоумышленник будет просто путаться в именах процедур, что, в свою очередь, достаточно сильно увеличит время компрометации данного приложения. Кроме простого запутывания злоумышленника может быть применен метод использования некорректных имен для метаданных. Например, в приложении запрещено именование объекта метаданных начиная с цифры или какого-либо символа отличного от буквы латинского алфавита. В рассмотренном примере, если во время защиты методом запутывания кода переименовать функции, классы или другие метаданные в нестандартные имена, то стандартный дизассемблер уже не сможет корректно распознать такие имена, а то и вообще сообщит, что данное приложение не является .NET-сборкой. При запутывании графа потока управления происходит «замусоривание» кода приложения, добавление переходов и функции, которые никогда не получат управления при корректной работе программы. Использование электронных ключей[6]. Электронные ключи достаточно активно принимают участие в защите программного обеспечения. Множество электронных ключей можно классифицировать по различным характеристикам – порт компьютера, к которому подключен данный ключ, поддержка (или ее отсутствие) сетевых технологий, и наличие возможности удаленного обновления содержимого ключа, наличие или отсутствие независимого внутреннего таймера. Таким образом, используя ключи, имеющие таймер, автор приложения может разработать систему ограниченных лицензий, т.е. таких лицензий, которые дают право пользования данным приложением на протяжении некоторого определенного времени. Таким способом можно делать так называемые «Trial» версии приложения, т.е. ознакомительные версии, которые имеют некоторые ограничения по функционалу приложения и по времени его работы, распространяемые бесплатно. Данные версии созданы для ознакомления пользователя с возможностями приложения и, как следствие, являются некоторого рода рекламой. Именно ознакомительные версии и являются основной целью злоумышленника, так как зачастую при введении верного серийного номера для данного приложения все ограничения ознакомительной версии снимаются и пользователь получает полнофункциональное приложение. В случае же если алгоритм проверки серийного номера будет находиться на ключе, то простой «обман» приложения не поможет при его «взломе», так как ключ в случае неверного серийного номера все равно прекратит свое функционирование по истечении срока ознакомительного использования. В основном вся концепция электронных ключей сводится к двум основным направлениям, а именно: «привязка» приложения к аппаратному модулю, вынесение части кода приложения во внешний аппаратный модуль. Обычные электронные ключи относятся к первой концепции, т.е. по сути своей, приложение просто привязывается к электронному ключу и без него не запустится. Электронные ключи с загружаемым кодом поддерживают вторую концепцию, которая заключается в том, что часть кода приложения переносится во внешний аппаратный модуль (т.е. в электронный ключ) и выполняется непосредственно на нем. Таким образом, в случае попытки компрометации в первом случае будет необходимо «убедить» приложение, что электронный ключ есть, а во втором случае восстановить алгоритм, который находится непосредственно на электронном ключе. ISBN 978-5-7262-1179-4. НАУЧНАЯ СЕССИЯ МИФИ-2009. Том V 2 Анализ способов защиты приложений… С точки зрения рассмотрения электронных ключей как «черного ящика», наибольший интерес представляет классификация ключей с точки зрения загрузки на них кода. Соответственно по данной классификации существует три типа ключей, а именно: обычные электронные ключи, ключи с заранее загруженным кодом, ключи с загружаемым кодом. Рассмотрим эти три типа ключей более подробно. Первый и самый простой тип ключей – это обычные электронные ключи. Данные ключи могут применяться просто как семафор, т.е. приложение проверяет наличие ключа в системе и получает от него уникальный идентификатор этого ключа. В случае совпадения идентификатора, полученного от ключа с идентификатором, хранящимся в памяти приложения, программа начинает нормальную работу и становится зарегистрированной. Данный способ защиты достаточно просто обходится злоумышленником. Для обхода этой защиты необходимо перехватить идентификатор ключа и при дальнейших запусках подставлять его в нужное место программы. Ключи с загруженным пользовательским кодом. При написании приложения пользователь обращается к компании – производителю ключей. Эта компания сама загружает часть кода приложения на ключ, т.е. часть кода приложения будет выполняться на ключе. Однако минус такого метода в том, что данная защита не является гибкой, т.е. пользователь с каждой новой версией алгоритма, находящегося на ключе, должен заказывать новый набор ключей для нормального функционирования защищенного приложения. Третий, по мнению автора, наилучший тип электронных ключей защиты – ключи с загружаемым кодом. Отличие от всех остальных ключей у данного типа состоит в том, что пользователь может самостоятельно записать на ключ необходимый ему исполняемый код и совершать обновления данного ключа. Данный метод защиты является наиболее гибким. Из всего вышесказанного можно сделать вывод, что использование способов защиты от копирования для обычных приложений не подходят для .NET-приложений, а используемые для .NETприложений методы защиты, являются достаточно легко компрометируемыми. Также важно отметить, что для защиты .NET-приложений наиболее хорошо подходит защита приложения с использованием методов «черного ящика», это позволяет сокрыть код приложения или важные его части от злоумышленника и, в свою очередь, позволит достаточно сильно усложнить компрометацию такого приложения. СПИСОК ЛИТЕРАТУРЫ Code Veil.- http://www.xheo.com/products/sps/default.aspx .NET Reactor.-http://www.eziriz.com/dotnet_reactor.htm Secure Assembly.- http://www.geocities.com/krishnapg/SecureAssembly.html Анализ запутывающих преобразований программ.-http://www.citforum.ru/security/articles/analysis/ DotFuscator.- http://www.preemptive.com/dotfuscator.html Aladdin Автозащита для .NET .- http://www.aladdin.ru/catalog/hasp/hasp_hl.php ISBN 978-5-7262-1179-4. НАУЧНАЯ СЕССИЯ МИФИ-2009. Том V 3