пятница, 22 февраля 2019 г.

Усовершенствованный метод внедрения DLL

Внедрению DLL так или иначе (обычно в связи с перехватом API) посвящено достаточно большое количество статей. Но ни в одной из тех, которые я читал, не говорится, как внедрить эту DLL в чужой процесс незаметно, т.е. не храня на диске файл самой DLL, а оперируя им непосредственно в памяти.
В настоящее время широчайшую распространенность получили операционные системы семейства Windows NT/2000/XP. Они широко используются не только как домашние системы, но и в качестве серверов. Эта линейка ОС отличается неплохой защищенностью от вредоносных программ, а также для нее существует большое количество дополнительных систем безопасности (различные антивирусы, фаерволлы). Основной язык для приводимых фрагментов кода – C++, но материал актуален и для любого другого языка (Delphi, Ассемблер и т.д.). Единственное условие — язык должен быть 100% компилируемым, а также поддерживать работу с указателями и ассемблерные вставки. Так что любителям VB скорее всего придется обломиться. Для полного понимания материала статьи нужно хотя бы немножко знать ассемблер и С++. Как известно, OC Windows NT целиком построена на системе DLL (динамически загружаемых библиотек). Система предоставляет приложениям сервисные API функции, с помощью которых оно может взаимодействовать с системой. Предполагается, что читатель знаком с программированием в Visual C++, работой загрузчика Windows (загрузка и вызов функций DLL), а также имеет некоторые представления о программировании на ассемблере.
Данная статья актуальна только для систем Windows NT/2000/XP.

среда, 20 февраля 2019 г.

Драйверы антивирусов — источник зла: уязвимости в драйверах проактивных защит

Многим известно, что большое количество программ используют драйверы режима
ядра в Windows как "окно" для доступа в более привилегированный режим — Ring 0.
В первую очередь это касается защитного ПО, к которому можно отнести антивирусы,
межсетевые экраны, HIPS’ы (Host Intrusion Prevention System) и программы класса
internet security.

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

Сага про IoCtl

Сейчас мы максимально широко рассмотрим тему уязвимостей в драйверах
защитного ПО, их эксплуатации и поиска. И начнем с диспетчера ввода-вывода.

Существует достаточно много как документированных, так и не очень системных
механизмов, которые могут быть использованы для организации взаимодействия кода
пользовательского режима с драйверами режима ядра. Самыми функциональными и
наиболее часто используемыми являются те, которые предоставляются диспетчером
ввода-вывода (I/O manager). В конце концов, именно они и создавались
разработчиками операционной системы для подобных задач. Давай рассмотрим, как
обычно организуется работа с диспетчером ввода-вывода со стороны драйвера и
приложения.

Кошмар на улице Windows: Типсы и триксы для системщиков


Необычный взгляд на обычные вещи

Сколько раз в популярной IT-литературе описывался механизм перехода из ring3 в ring0 ОС Windows? Не счесть! При этом авторы, копипастя друг у друга фактически один и тот же текст, подробно или не очень описывали, что произойдет, если пользователь вызовет простую функцию CreateFile().

Сегодня мы попробуем взглянуть на эту проблему с несколько неожиданной стороны. По утверждениям знающих людей, существует один «proof of concept»’ный способ, позволяющий выполнять свой код на привилегированном уровне и пользоваться сервисами ядра напрямую, то есть в обход существующих ограничений, которые на тебя накладывает пользовательский (ring3) уровень. Да-да, ты не ошибся, — посмотрим, можно ли ядро системы «подергать за вымя» напрямую. Все, что тебе для этого понадобится, это хорошие знания ядра, подсистемы ввода/вывода и изворотливость (или даже извращенность :)) ума.