8(495)909-90-01
8(964)644-46-00
pro@sio.su
Главная
Системы видеонаблюдения
Охранная сигнализация
Пожарная сигнализация
Система пожаротушения
Система контроля удаленного доступа
Оповещение и эвакуация
Контроль периметра
Система домофонии
Парковочные системы
Проектирование слаботочных сетей
Аварийный
контроль
Раздел: Документация

0 ... 74 75 76 77 78 79 80 ... 169

Hooking

Относительно свежий способ. Основан на функции SetWindowsHookEx. Насколько я понимаю, на нем основаны «невидимые» закладки под клавиатуру, мышь и все то, на что сажается hook.

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

(Если кто-нибудь знает почему, то объясните мне, пожалуйста.) Но библиотека, откуда вызывается функция обработки ловушки, грузится во ВСЕ существующие и вновь создаваемые процессы. Поэтому запустите свой процесс и, если в нем появилась библиотека, которую вы не предусмотрели, то самое время перегрузить машину.

Переключение контекста потока

В данном случае резидентный код исполняется в контексте какого-либо уже запущенного потока. Между прочим, сама система широко использует потоки пользователей для собственных нужд. Как пишет Хелен Кастер в книге «Основы Windows NT и NTFS», система «похищает» поток и использует его для обработки прерываний, вызова DPC и системных АРС функций. То есть немалая часть операционной системы представляет собой программы-невидимки.

В Интернете я не встречал упоминания о данном способе и собираюсь остановиться на нем поподробнее.

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

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

233


Вкратце, алгоритм предлагаемого Метода состоит в следующем.

Необходимо найти подходящий процесс, то есть процесс, имеющий постоянно работающие потоки с приоритетом нормальный или выше (>8). Во избежание трудностей с правами имеет смысл использовать пользовательский процесс. Для нахождения такого процесса естественно использовать все ту же функцию NtQuerySystem Information.

Послекак нужный процесс найден и определены иденти-

фикаторы его потоков, загрузим вданного процесса сам

исполняемый резидентный код. Чтобы не возиться с ассемблером, я это делаю в виде библиотеки, но это вопрос предпочтений. Процедура загрузки библиотеки в заданный процесс подробно описана у Джеффри Рихтера.

Приостанавливаем один из потоков процесса, сохраняем его стек и текущий контекст, создаем новый стек, изменяем контекст потока так, чтобы указатель на текущую команду (регистр Eip) указывал на

наш резидентный код, переходим на новый стек, «пробуждаем» поток.

Теперь, если мы нигде не просчитались (хе-хе), то при получении потоком процессорного времени будет выполняться наш резидентный код. Естественно, это не все, так как в нашу задачу не входит нарушение нормального исполнения процесса (что мы, хакеры что

После того, как резидентный код отработал, необходимо перейти на старый стек и восстановить старый контекст. Теперь поток (по-моему) должен работать в нормальном режиме.

Вот, собственно, и все. Очень просто, не правда ли? Разумеется, некоторые непринципиальные детали были опущены. По сути, во многом то же самое выполняет сама ОС при исполнении DPC и АРС процедур (по книге Хелен Кастер).

Чтобы не оставаться голословным, я написал маленькую программку (baby.exe) с небольшой библиотечкой (zzz.dll). В данном примере резидентный код просто пишется в файл. Использовать его очень просто.

Скопируйте библиотеку в системную директорию system32 и запустите baby.exe. Если все прошло успешно, то в корневой директории диска С: появится файл 2 .2 с цифрами (если у вас уже есть такой

файл, то цифры будут дописываться в его конец).

По прошествии времени (в зависимости от загруженности вашего компьютера) файл (по идее) будет медленно расти (если долго не

будет, то удалите его, и он опять, наверное, появится).

234


В Task Manager никаких новых процессов или потоков не появится.

(Библиотек тоже, но в Task Manager вы этого не увидите.) Да! Чуть не забыл, чтобы «убить резидента», перезапустите Explorer.exe.

Наконец, последнее. Программа не создана ни для каких практических целей. Это всего лишь демонстрация работы алгоритма и проба сил. В ней могут быть различного рода ошибки. Она может работать плохо или вообще не работать. В заключение автор хотел бы выразить благодарность всем, кто помогал и поддерживал его. Я особенно благодарен книге А.В. Коберниченко «Недокументированные возможности Windows NT*.

Дополнение

На мой взгляд, необходимы некоторые пояснения... Что предлагаемый мною способ НЕ ДЕЛАЕТ:

—не скрывает процесс;

—не скрывает поток;

—не запускает драйвер;

—процесс не создается, поэтому скрывать его отсутствие не нужно;

—поток создается, но, быстро отработав, нормально завершает

работу, поэтому скрывать его тоже не нужно. (Кстати, может, кто-нибудь действительно умеет скрывать поток без драйвера? Было бы очень интересно!);

—драйвер мне вообще не нужен;

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

Проблема только в запуске драйвера.

Еще один вопрос ко всем. Как все-таки обнаружить подобного

резидента? Или как детектировать вызов АРС и DPC процедур операционной системой?

Все хотят видеть исходники, но почему? Основную идею я описал, а техническое исполнение программы оставляет желать лучшего

(не все рождаются программистами).

Но раз очень хочется, то пожалуйста (но я предупреждал!). По-моему, все, чтобы написать аналогичную прогу, описано. Исходник ехе помещаю полностью, но только в нем нет ничего интересного, да и на-

235



0 ... 74 75 76 77 78 79 80 ... 169