Нужно сказать, что защита большинства программ взламывается всего за 10—15 минут. Для этого нужно лишь несколько инструментов: дизассемблер, отладчик, еще несколько утилит и хотя бы базовое знание ассемблера (впрочем, без последнего часто можно обойтись).
Вариантов того, как крякер "подбирается" к защите и ломает ее, может быть много. Рассмотрим основные из них.
Чаще всего крякер стремится подобрать к программе регистрационный код, чтобы зарегистрировать на ее себя и опубликовать пароль в Интернете. Тогда сбудется "голубая мечта" крякера - мировая известность: любители "халявы" станут использовать этот пароль при разблокировании своих копий программы, и в диалоговых окнах О программе (About) в графе Registered by будет стоять имя крякера.
Обычно процесс регистрации программы организован так. Пользователь попадает в диалоговое окно Регистрация, нажав соответствующую кнопку в nag-screen или вызвав соответствующий пункт меню. Он вводит в текстовое поле ключ и нажимает кнопку ОК, после чего программа проверяет соответствие введенного ключа некоторым условиям. Эта верификация может быть очень сложной и запутанной, но в конце концов она приходит к закономерному результату, а именно операции сравнения введенного ключа с некоторым образцом или записи в регистр памяти результата верификации.
Дело в том, что все операции, программируемые при помощи языков высокого уровня (C++, Delphi, Basic), используют вызовы функций API Windows или обращения к runtime-библиотекам. Все эти функции легко отслеживаются отладчиком. Если же программа использует динамические ключи, то перед сравнением введенного регистрационного номера она по также введенному имени пользователя генерирует "правильный" ключ, который замечательно виден при помощи отладчика. Однажды я почувствовал всю эффективность этого метода на себе. Когда я впервые написал подобную защиту к одной из своих программ, то отослал эту программу знакомому программисту, который иногда, ради развлечения, взламывал различные shareware-продукты. Он перезвонил через десять минут и сообщил правильный регистрационный код, а заодно рассказал, что код ему в отладчик "выложила" сама моя программа.
Если же автор программы хорошо потрудился над защитой и пароль подобрать невозможно, то крякер с помощью дизассемблера и отладчика находит в программе место, где определяется, зарегистрирована ли программа или нет, модифицирует значение, возвращаемое проверочной функцией (например, безусловный переход меняется на условный). После этого пишется маленькая программа, которая делает то же самое, но не в памяти, а в самом ЕХЕ-файле (это и есть патч).
Кроме того, можно сделать и так: "вырезать" из ЕХЕ-файла программы код, который отвечает за генерацию ключей, и вставить его в маленькую программку, которая будет создавать правильные ключи для всех желающих, т. е. будет кодогенератором.
Если в программе применяется ограничение по времени, то это открывает крякерам дополнительную лазейку в защите. Заключается она в том, что время первого запуска (или количество запусков) хранится во внешнем файле (INI или системном реестре). С помощью бесплатных программ File Monitor и Registry Monitor, которые можно скачать с сайта www.sysinternals.com, легко выяснить, к каким ключам в реестре и каким файлам обращается программа, какие данные туда пишет и какие читает. А дальше не составит никакого труда найти соответствующие вызовы в программе при помощи отладчика и дизассемблера.
Естественно, такая ситуация авторов shareware-программ не устраивает. Они стремятся усилить защиту, но, увы, некоторые из них выбирают не совсем правильный путь.
Кому-то кажется хорошим вариантом привязка к компьютеру. Из программы очень легко получить какие-то данные о системе (например, серийный номер жесткого диска), и поэтому в воображении программиста быстро вырисовывается такая схема: пользователь высылает автору эти данные, который, после подтверждения оплаты, вычисляет на их основе регистрационный код и высылает его пользователю. В программе закодирован тот же самый алгоритм, происходит сверка и — готово. Если же код попадет в чужие руки, то на других компьютерах он работать не будет.
Тем не менее этот способ обычно доставляет больше неудобств зарегистрированным пользователям, чем крякерам, т. к. сломать такую защиту очень легко: здесь работает тот же фокус с патчами, "препарирующими" проверочные функции. А вот честному пользователю придется изрядно помучиться, если он поменяет компьютер...
Та же ситуация возникает с аппаратными ключами, подключаемыми к параллельному порту компьютера (типа HASP). Ведь проверка все равно осуществляется в программе, а следовательно, и эта защита может быть легко взломана. Так и есть - "патчи" существуют ко многим системам защиты при помощи аппаратных ключей. При этом эти ключи доставляют много хлопот как разработчикам (высокая стоимость — нужно обеспечить доставку ключей заказчикам), так и пользователям. Например, при подключении к параллельному порту аппаратного ключа экономического Project Expert 7.0 подключаемый к этому же порту имеющийся в нашем офисе сканер Hewlett-Packard перестает нормально работать.
Существует достаточно много программных продуктов, которые позволяют авторам реализовать защиту для своих программ. Это - IntelliSecure R2, TimeLock, ShareLock, CrypKey, StopCopy, Unlocker, RSAgent32, Software Licensing System, ZipLock, BuyOnet, UnBox, Vbox. Но, к сожалению, все они давно уже вскрыты (см. http://www.fravia.org), и воспользоваться ими — все равно, что приложить к программе подробную инструкцию по ее взлому.