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

Windows на страже порядка

Deeoni$

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


(arustamovv2000@mail.ru; ICQ 982-622)

Защита от посягательства на наши приложения, или почему она никого не пугает

Главным компонентом "обороны" ОС Windows являются четыре кольца защиты. В ring 3 работают все приложения, запущенные пользователями (в том числе и администраторами). Отсюда мы имеем доступ лишь к стандартным функциям, разрешенным для использования напрямую в программах.

Кольца ring 1 и ring 2 в Windows NT не используются. Ring 0 – это самое мощное кольцо. В нем работает ядро системы и драйверы. Привилегированные команды и ввод-ввод для третьего кольца запрещены, для взаимодействия с аппаратной частью компьютера вызываются системные сервисы ядра ОС, которые оформлены как шлюзы. При вызове такого шлюза процесс переходит в нулевое кольцо, и там ядро ОС и драйверы обрабатывают запрос и возвращают результаты приложению. После перехода в нулевое кольцо приложение не может как-либо контролировать свое исполнение, пока управление не будет возвращено коду третьего кольца. Это необходимое условие защиты, оно обеспечивает безопасность всей системы.

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

Кольца защиты существовали и в "девятках", но Windows часто падала из-за всяческих глюков в приложениях. Эта проблема была решена после создания виртуального адресного пространства, которое у каждого процесса свое. Благодаря такому решению устойчивость системы к сбоям значительно повысилась. Вместе с ней поднялся и уровень защиты от всяческих вредоносных программ. Рассмотрим подробнее это чудо-изобретение.

Каждый вновь созданный процесс получает в свое распоряжение 4 Гб памяти. Там располагается сам код программы, отображаются подгруженные библиотеки, в том числе системные. Никакой другой процесс не может получить доступ к данным и процедурам, находящимся в чужом адресном пространстве. В результате приложение не может перезаписать жизненно важные структуры других программ, выполняющихся одновременно с ним.

Все это сильно ограничивает нас в возможностях и, с другой стороны, защищает. Но стопроцентной защиты не бывает. Сейчас я продемонстрирую, как можно вторгнуться в чужое адресное пространство и использовать законного владельца этого пространства в своих целях. Более того, при проявлении некоторой смекалки можно будет догадаться, как можно получить доступ к некоторым функциям ядра. Итак, начнем с того, как внедрить свой код в посторонний процесс.

Внедрение dll с использованием реестра

Наверное, каждый, даже непродвинутый пользователь из числа наших братьев меньших :) знает, что такое реестр, для чего он нужен и что в нем можно трогать, а что нельзя. Но не каждый догадывается о том, что с помощью этой хитрой штуки можно заставить практически любое приложение выполнять твой код, – воспользуемся параметром реестра:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows_NT\CurrentVersion\Windows\AppImt_DLLs

Значением параметра AppInit_DLLs может быть как имя одной DLL (с указанием пути доступа), так и имена нескольких DLL, разделенных пробелами или запятыми. Так как пробел используется здесь в качестве разделителя, в именах файлов не должно быть пробелов. Система считывает путь только первой DLL в списке: пути остальных DLL игнорируются, поэтому лучше разметать свои DLL в системном каталоге Windows, чтобы не указывать пути. На рис. 2 показано, что мы хотим внедрить код SuperDLL.dll.

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