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

Ключик к сердцу

Chingachguk/HI-TECH

Спецвыпуск: Хакер, номер #057, стр. 057-094-1


(chingachguk@newmail.ru)

Все об аппаратных ключах защиты

Существует множество аппаратных ключей защиты. По заявлениям производителей, "c помощью ключей HASP защищено более 2/3 коммерческих программ, разработанных и продаваемых на территории СНГ и стран Балтии". Тем не менее, и этот способ защиты имеет ряд существенных недостатков, которыми можно воспользоваться.

Гонка вооружений

Итак, dongle (ключ) - компонента многих защит, которая используется, как правило, для защиты от незаконного использования программ, но также может (по утверждениям разработчиков) использоваться для авторизации/защиты баз данных и т.п. Втыкается в LPT-порт (это уже в прошлом) или в USB. Для нормальной работы может потребоваться установка дополнительных драйверов, не связанных с комплексом защиты. В общем и целом dongle представляет собой часть алгоритма защиты, вынесенную в аппаратную область, проще говоря - в "железо". Сейчас объясню почему. Разработчики защит уже давно приметили, что уровень исследования исполняемых кодов защищенных программ страшно возрос (его неуклонный рост начался еще во времена написания первых DOS-вирусов и крэков) и невозможно дать гарантий на то, что взломщик не сможет полностью изучить код защиты. Полное исследование проведено, исходный код программы фактически имеется перед глазами – крэка при таких делах не напишет только ангел небесный. Разработчики защит изощрялись и порождали на свет все новые и новые приемы, призванные помешать взломщику: антиотладочные процедуры, расшифровываемый при запуске код и многие другие техники. Но и в далеком прошлом, и сейчас на исследование кода защиты требуется намного меньше времени, чем на написание хорошей защиты.

Почему так? Допустим, обычный программист решает написать, как ему кажется, "защиту" и встраивает в свой код диалоговое окно ввода ключевой информации, а потом проверяет валидность введенной информации. Большинству таких программистов среди сотен килобайт исполняемого кода сложно найти собственную ошибку, даже обладая исходниками, поэтому им опять-таки только кажется, что невозможно найти то самое место, в котором проверяется валидность ключевой информации:

{ "Прячем" настоящий пароль, чтобы его не нашли по F4 в far/total/etc }

Str(123,Key1);

Str(691,Key2);

MyBestPassword:=Key1+Key2+... { И другой подобный код ... }

if MyBestPassword <> UserPassword then ...

Однако время обнаружения такой процедуры ничтожно мало, например десять минут. Реверсер установит после ввода абстрактного ключа активации breakpoint на доступ к нему из любого кода и, разумеется, тут же увидит использование введенной информации и критичный код. Конечно, разработчик защиты может пойти дальше. Допустим, он попытается вырвать основной вид оружия из рук реверсера - отладчик SoftIce, которым тот может выполнить вышеописанные действия:

// Открываем устройство "NTICE", если это удалось, то отладчик SoftIce

// установлен в системе

if ( open("\\\\.\\NTICE"...) >= 0 )

{

printf("\n Unload SoftIce ! Program aborted !");

ExitProcess(...);

}

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

Содержание  Вперед на стр. 057-094-2