Для начала краткое введение. Утилита автозащиты Guardant — это инструмент, который позволит, не имея ровным счетом никаких знаний и навыков, быстро, в течение нескольких минут, «привязать» некоторую программу к электронному ключу Guardant, защищая ее тем самым от компьютерного пиратства. Думаю, для введения этого достаточно.
Обо всех возможностях автозащиты Guardant можно достаточно подробно узнать из нашей документации и от людей, непосредственно занимающихся распространением продукта. Мне, как разработчику, рассказывать об этом не интересно, поэтому делать этого я не буду. В данном цикле статей я расскажу о качествах, связанных, прежде всего, с защищенностью программы, «накрытой» нашей автозащитой. Итак, сначала разберемся, как устроены подобного рода утилиты.
Большинство из них использует технологию «конверт», которая заключается в том, что код и данные защищаемого приложения шифруются при помощи электронного ключа. В тело приложения внедряется startup-код, который мы называем «маленькой вакциной». «Маленькая вакцина» — это позиционно-независимый код, который выполняет ряд функций, в числе которых общение с внешним модулем grdvkc32.dll — «большой вакциной». Роль «большой вакцины» — обращение к электронному ключу + еще несколько секретных вещей.
Тут возникает вопрос: а почему бы не внедрить все в exe-файл защищаемого приложения? Зачем вообще нужен какой-то внешний модуль? Ага, наверное ленивые программисты Guardant-а просто не в состоянии это сделать! Уверяю вас, уважаемые читатели, что это не так. И сделано так, как сделано, было совершенно не случайно, а с целью упрощения и удешевления поддержки защищенного продукта.
Представим такую ситуацию: некий клиент компании «Актив» защитил свои приложения с помощью автозащиты и распространил их среди своих пользователей. Вдруг, при выпуске новой ОС от всеми нами горячо любимой компании Microsoft, защищенные приложения отказываются работать. Такое действительно может случиться, т. к. для повышения защищенности необходимо применять некоторые плохо документированные возможности ОС. Так вот, что же делать нашему клиенту?
Если бы все было встроено в защищаемый модуль, то у него возникла бы необходимость защитить свое приложение заново и распространить его всем жаждущим и негодующим пользователям, заплатившим деньги за первую версию. В нашем же случае конечным пользователям достаточно будет скачать у нас большую вакцину и с очень большой вероятностью им будет счастье. Клиент от этого не страдает! Защищенность не падает!
Технология большинства автозащит подразумевает шифрование исполняемого файла с внедрением программного кода, выполняющего его расшифрование и загрузку, и не более того. Как только файл расшифрован и загружен, он становится доступен для различных хакерских инструментов. Например, образ файла можно скопировать из памяти в файл или «сдампить», говоря на профессиональном жаргоне. Причем автоматических утилит, позволяющих это делать, великое множество. Большинство из них бесплатны и легкодоступны. Казалось бы, все просто. Но не стоит спешить с выводами: для противодействия этому безобразию мы приняли ряд мер. Об одной из них я сейчас вкратце расскажу.
Практически любая Windows-программа, которая делает что-то полезное, не может обходиться только теми функциями, которые написал программист. Как правило, используются уже готовые функции различных внешних API. Получается, что программа должна импортировать функции из внешних динамических библиотек (как системных dll, так и любых других) в достаточно большом количестве.
Итак, если посмотреть у нас в документации, можно найти опцию автозащиты под названием /IMPORT_HOOK. Как видно из названия, она что-то делает с функциями, которые нормальное приложение импортирует. Если применить эту опцию, то все функции из таблицы импортов (есть такая в исполняемых файлах Windows) будут указывать на некоторую программную «заглушку». Эта заглушка необходима для корректной работы механизма опроса электронного ключа. Таким образом, сняв дамп, аналитик получает неработоспособное приложение, в котором необходимо восстановить эту самую таблицу импортов.
Можно попытаться восстановить таблицу импортов при помощи автоматических средств, но нам пока не известно о наличии утилит, которые могли бы это делать корректно для нашей автозащиты в автоматическом режиме. Одна из самых мощных и популярных утилит автоматической распаковки (не пишу ее название, чтобы не делать ей рекламу, кому надо — знают), позволяющая снять около 200 конвертов от различных производителей, этого делать не умеет. Это означает, что с большой вероятностью аналитику придется делать это вручную, что увеличит время и стоимость взлома, а, следовательно, сделает этот самый взлом неэффективным.