Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #66, МАЙ 2006 г.

копаемся в броне

КРИС КАСПЕРСКИ АКА МЫЩЪХ

Спецвыпуск: Хакер, номер #066, стр. 066-062-4


Хакеры поступают проще. «Отламывают» защитный код или модифицируют открытый ключ, хранящийся в теле программы, заменяют его своим собственным открытым ключом, для которого существует известный секретный ключ. Крэки для Bat’а работают как раз так. Даже самая навороченная криптографическая система в отсутствии механизмов контроля целостности программы бесполезна, а контроль целостности легко найти и отломать.

Исключение составляет тот случай, когда криптография используется для расшифровки критических фрагментов программы, без которых она неработоспособна. Неработоспособная программа никому не нужна, поэтому для trial-защиты такая методика не подходит. И если у взломщика имеется хотя бы один-единственный рабочий экземпляр программы с валидным ключом, нейтрализация защиты — дело техники.

Несимметричную криптографию можно и нужно использовать только с тщательно проработанным механизмом проверки собственной целостности, со множеством проверок в разных местах.

константы, говорящие сами за себя

Какой криптографический алгоритм лучше использовать: «стандартный» или «самопальный»? Большинство разработчиков склоняются в пользу первого и этим заставляют крэкеров бурно ликовать.

Обычно защитный механизм контролирует свою целостность с помощью надежного и хорошо апробированного CRC32. Как найти процедуру проверки среди десятков мегабайт постороннего кода? Очень просто — по стандартному полиному. Там, где есть CRC32, всегда присутствует и константа EDB88320h. За считанные секунды контекстный поиск обнаруживает стандартный полином, а дальше по перекрестным ссылкам нетрудно найти саму процедуру проверки и код, вызывающий ее.

Существует множество готовых программ, распознающих стандартные криптографические алгоритмы. Вот только одна из них: www.hexblog.com/2006/01/findcrypt.html — плагин для IDA Pro, который распространяется в исходных текстах и на бесплатной основе.

Если используются стандартные алгоритмы, необходимо тщательно скрыть все легко узнаваемые полиномы и предвычисленные таблицы, по которым они могут быть легко локализованы в теле программы.

избыточная сложность, легко обнаруживаемая визуально

Процедура проверки серийного номера/ключа ни в коем случае не должна быть запутанной или чрезмерно сложной, иначе она будет существенно отличаться от всех остальных (обычных) процедур и опытный крэкер распознает ее банальным «визуальным» просмотром дизассемблерного листинга программы.

Просто ищем код, внешне отличающийся от всего остального. Лучше всего, если этот код долго и нудно вычислял что-то. В нормальной программе практически не встречается линейных фрагментов такого кода, но при создании защит все «перестраховываются» и пишут «очень сложные» свертки. Вот по такой «навороченности» ты легко находишь их… глазами. Разумеется, может не сработать для очень экзотического компилятора, и тогда придется поискать, где просят ввести код/регистрацию или предупреждают о взломанном.

Назад на стр. 066-062-3  Содержание  Вперед на стр. 066-062-5