копаемся в броне КРИС КАСПЕРСКИ АКА МЫЩЪХ Спецвыпуск: Хакер, номер #066, стр. 066-062-4 Хакеры поступают проще. «Отламывают» защитный код или модифицируют открытый ключ, хранящийся в теле программы, заменяют его своим собственным открытым ключом, для которого существует известный секретный ключ. Крэки для Bat’а работают как раз так. Даже самая навороченная криптографическая система в отсутствии механизмов контроля целостности программы бесполезна, а контроль целостности легко найти и отломать. Исключение составляет тот случай, когда криптография используется для расшифровки критических фрагментов программы, без которых она неработоспособна. Неработоспособная программа никому не нужна, поэтому для trial-защиты такая методика не подходит. И если у взломщика имеется хотя бы один-единственный рабочий экземпляр программы с валидным ключом, нейтрализация защиты — дело техники. Несимметричную криптографию можно и нужно использовать только с тщательно проработанным механизмом проверки собственной целостности, со множеством проверок в разных местах. константы, говорящие сами за себя Какой криптографический алгоритм лучше использовать: «стандартный» или «самопальный»? Большинство разработчиков склоняются в пользу первого и этим заставляют крэкеров бурно ликовать. Обычно защитный механизм контролирует свою целостность с помощью надежного и хорошо апробированного CRC32. Как найти процедуру проверки среди десятков мегабайт постороннего кода? Очень просто — по стандартному полиному. Там, где есть CRC32, всегда присутствует и константа EDB88320h. За считанные секунды контекстный поиск обнаруживает стандартный полином, а дальше по перекрестным ссылкам нетрудно найти саму процедуру проверки и код, вызывающий ее. Существует множество готовых программ, распознающих стандартные криптографические алгоритмы. Вот только одна из них: www.hexblog.com/2006/01/findcrypt.html — плагин для IDA Pro, который распространяется в исходных текстах и на бесплатной основе. Если используются стандартные алгоритмы, необходимо тщательно скрыть все легко узнаваемые полиномы и предвычисленные таблицы, по которым они могут быть легко локализованы в теле программы. избыточная сложность, легко обнаруживаемая визуально Процедура проверки серийного номера/ключа ни в коем случае не должна быть запутанной или чрезмерно сложной, иначе она будет существенно отличаться от всех остальных (обычных) процедур и опытный крэкер распознает ее банальным «визуальным» просмотром дизассемблерного листинга программы. Просто ищем код, внешне отличающийся от всего остального. Лучше всего, если этот код долго и нудно вычислял что-то. В нормальной программе практически не встречается линейных фрагментов такого кода, но при создании защит все «перестраховываются» и пишут «очень сложные» свертки. Вот по такой «навороченности» ты легко находишь их… глазами. Разумеется, может не сработать для очень экзотического компилятора, и тогда придется поискать, где просят ввести код/регистрацию или предупреждают о взломанном. |