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

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

Chingachguk/HI-TECH

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


Разработчики защиты прекрасно осведомлены о свойствах канала DeviceIoControl, но продолжают использовать его по ряду причин: техника перехвата API все еще никак не переедет из учебника хакера за второй класс в букварь, и нормально построенное шифрование на основе данных ключа некритично к прослушиванию (советую почитать про криптографические протоколы, стойкие к "атаке посередине"). Такой обмен может на некоторое время отвлечь реверсера от неких дополнительных скрытых каналов обмена. Какие же дополнительные каналы обмена может открыть защита для общения со своим драйвером?

Рассмотрим один из самых распространенных аппаратных ключей – HASP (Hardware Against Software Piracy). Защитный комплекс (его обычно называют "конверт") включает в себя, помимо защищенного prog.exe и нескольких драйверов защиты driver1,2..sys и ключа HASP, еще и дополнительный канал обмена через исключение UD #6 - Undefined Operation. Это означает, что в коде prog.exe защита размещает особым образом оформленные команды, которые вызывают в процессоре исключение недопустимой операции (процессор, работающий в защищенном режиме, способен реализовывать так называемые уровни защиты и при выполнении некорректных инструкций в менее привилегированном коде (User-level) немедленно передавать управление в более привилегированный (ядро OS). Таким образом, в определенный момент управление в prog.exe будет сознательно передано на такие команды, процессор передаст управление в ядро системы, но не просто системному менеджеру (в этом случае не произойдет ничего интересного - программа просто будет принудительно завершена системой с сообщением "Программа выполнила..."), а специально подстроившемуся под это драйверу защиты: в момент своей инсталляции он заранее документированными или не очень способами подготовит систему так, что он будет первым, то есть до менеджера системы, обрабатывать такое исключение. Он (драйвер защиты) может позволить себе это, поскольку в NT-системах драйверы имеют все привилегии, в том числе и такую вот возможность обрабатывать все проблемные ситуации в системе. Фактически драйвер защиты равен в правах с ядром системы и может использовать в своих целях всю функциональность процессора. Нужно заметить, что инструкция UD использовалась таким вот "нехорошим" способом не только этой защитой, но и ... собственно разработчикми из MS. Такой канал используется для прямого вызова ядра в NT, а в 98-ой он приведет к обычному сообщению "Программа выполнила...".

На таком канале строится что-то вроде собственного API-ключа. Это достигается тем, что команда UD специальным образом оформляется для того, чтобы обработчик исключения внутри драйвера мог отличить "свой" код от обычных сбоев, возможно, в чужих программах. Это может быть сделано, например, следующим способом (почти оригинальная цитата):

mov eax,40000007h ; Номер функции API заносится в регистр eax

mov edi,offset DATA_FOR_KEY ; Адрес данных для передачи в драйвер

...

UD ; Инструкция, вызывающая исключение - см. документацию opcodes Intel

Назад на стр. 057-094-4  Содержание  Вперед на стр. 057-094-6