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

Крутой протектор – не беда

Ms-Rem (Ms-Rem@yandex.ru)

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


Так как же работают аппаратные ключи? В простейшем случае к программе подключается модуль, который проверяет наличие ключа и сообщает программе результат. Кроме проверки наличия, могут также проверяться значения чисел, хранимых в нем, либо они будут использоваться для расшифровки кода программы. Как же бороться с этим? Если применяется простая проверка наличия ключа, эта борьба будет не напряженнее, чем с проверкой серийника: нужно просто найти код, вызывающий проверку, и отключить его.

В более сложных случаях можно заменить код библиотеки, которая используется для работы с ключом, на свой, в котором позже проэмулируешь ответы ключа. Перед этим нужно перехватить исполнение этого кода, получить все значения запрос/ответ, которыми обмениваются ключ и программа, занести их в таблицу, по которой потом будет идти эмуляция. Этот метод называется методом табличной эмуляции. Программы с плохо навешенным хаспом очень хорошо поддаются ему. Но, к сожалению, в реале встречаются далеко не такие простые случаи. Иногда защиту делают программисты, которые в этом деле действительно понимают (это можно увидеть на примере защиты 1C). Копать саму программу, защищенную такими профи, действительно трудно, и проще всего подойти к делу с другой стороны - эмулировать ключ на низком уровне. С ключом обычно идет драйвер, который обрабатывает запросы программы и возвращает ответы ключа. Этот драйвер тоже неплохо защищен, поэтому нужно работать ниже - непосредственно с самим оборудованием. Если попался USB-ключ, то можно считать, что тебе очень повезло, так как защита с USB работает не напрямую, а доверяет это дело системным драйверам. А незащищенные системные драйверы - это хорошее место для внедрения нашего эмулятора. Проще всего будет заменить точки входа в обработчики IRP-драйвера USB так, чтобы направляемые ему запросы попадали нам, после чего можно фильтровать их и эмулировать ответы ключа. Для этого тебе придется изучить работу ядра системы и научиться программировать драйверы - от этого никуда не денешься.

Более сложный случай – LPT-ключ. Драйверы защиты работают с ним напрямую через порты, что сильно затрудняет эмуляцию. Я пока знаю только два рабочих способа эмуляции такого ключа: это изменение кода защитного драйвера и перехват обращений к портам с помощью SMM. Первый способ проще, но требует хорошего знания методов реверсинга, а второй позволяет сделать универсальный эмулятор, но здесь есть неприятность: он будет сильно зависеть от используемого железа. Самое трудное, что может попасться - это последнее поколение аппаратных ключей, которые хранят в себе часть кода защищенной программы, и достать его оттуда программным способом не представляется возможным. Единственное, что делает взлом таких ключей возможным - это низкая скорость работы такого кода. Это означает, что в ключ будут помещать код не критичной для работы программы, а выполняющий какие-либо вспомогательные действия. Такие куски кода можно просто написать самостоятельно.

Назад на стр. 057-056-7  Содержание  Вперед на стр. 057-056-9