Призраки ядра или модули-невидимки

Маскируемся в адресном пространстве


Вот теперь мы замаскировались — так замаскировались! Только хвост все равно из норы торчит, и наш резидентный код может быть найден тривиальным сигнатурным поиском путем сканирования памяти ядра (естественно, при условии, что он известен антивирусам, а все популярные rootkit'ы — им известны). Чтобы остаться необнаруженным необходимо использовать либо продвинутые полиморфные методики или… есть тут один способ, о котором не грех рассказать.

Сбрасываем страницы, принадлежащие нашему резидентному коду, в no_access, вешаем обработчик исключений, отлавливающий ошибки доступа к памяти, и терпеливо ждем. Как только возникнет исключение — смотрим: если на вершине стека находится адрес возврата в системный вызов (для этого перехват должен осуществляться командой CALL, а не jump), то возвращаем все атрибуты на место и даем зеленый свет на выполнение резидентного кода, а в момент передачи управления оригинальному системному вызову — отбираем атрибуты обратно. Если же резидентный код пытается читать кто-то еще (что за посторонние тут шляются, спать мешают!) — подсовываем другую страницу (например, путем манипуляций с каталогом страниц). Более сложные реализации не восстанавливают атрибуты, а используют пошаговую трассировку резидентного кода или даже эмулируют его выполнение, но это уже передоз, то есть перебор.

Просто? Как два пальца! Эффективно? А вот на счет эффективности мыщъха терзают смутные сомнения. Но ведь не он же этот трюк придумал! Так что может и покритиковать. Первое и самое главное. Читать резидентный код в памяти ядра могут не только антивирусы, но и само ядро при вытеснении его на диск или переходе в "спящий" режим. Как следствие — возникает конфликт и rootkit работает нестабильно. Второе — код обработчика остается незащищенным (а защитить его никак нельзя, поскольку кто-то же должен обрабатывать исключения!), следовательно, он элементарно палиться по сигнатурному поиску. Как говориться, за что боролись — на то и напоролись.

Короче — без полиморфизма никуда. Это вам мыщъх говорит! Чтобы мой хвост никогда не вставал, если это не так!



Содержание раздела