Работа вируса в Ring0 подробно описана в трудах Z0MBiE, с которыми можно ознакомится на его сайте - http://z0mbie.host.sk

Всё ниженаписанное является лишь обобщением и не притендует на новизну! :)

Итак, подведём итоги работы вируса в нулевом кольце под Win9x...

Для перехода в ноль есть несколько методов, вот основные:

  • Через IDT (Interrupt Descriptor Table, таблица дескрипторов прерываний)
  • Через GDT (Global Descriptor Table, таблица глобальных дескрипторов)
  • Через LDT (Local Descriptor Table, таблица локальных дескрипторов)
  • Через модификацию контекста с использованием Win API
  • Через SEH (Точнее модификация контекста с использованием SEHа)

Нужно оговориться, что первые два метода являются самыми неэффективными, т.к. их можно обломать, например, если на компе стоит Dr.Web'овский спайдер, то попасть в ноль через IDT и GDT не получиться.

Самым эффективным, на наш взгляд, является 3-ий метод (через LDT).

К данной статье прилагается примеры на все способы перехода в ноль. Работают они одинаково - после запуска блокируют полностью систему пока не нажмут клавишу ESC.

Мы попали ногой(и даже всем телом) в ноль. А что дальше?
Теперь мы имеем доступ к системе в полном объёме, т.е. к памяти, диску, портам и т.д... надо обустраиваться! :)

Как известно, в нуле нельзя просто вызывать обычные апишные функции, зато можно делать VXDCallы.

Что такое VXDCall? Это нижеуказанная последовательность кода:

 int    20h
 dw     Service
 dw     VxD

где Service-это функция (например InstallFileSystemApiHook, Ring0_FileIO), а VxD-это драйвер (например IFSMGR, VMM)

Нужно заметить, что после вызова прерывания, обработчик заменит этот код на Call adress, поэтому следует ПРЕДварительно скопировать код в к-нить буфер, для сохранения его первозданности.

С помощью этих колов можно делать всё то, что нам нужно - работать с файлами, памятью и всеми устройствами.

Например, если нам надо выделить немного памяти, мы сделаем следущее...

 xor    EAX, EAX
 push   PAGEFIXED + PAGEZEROINIT; Атрибуты
 push   EAX                      
 push   EAX                      
 push   EAX                      
 push   EAX                      
 push   EAX			 
 push   PG_SYS	; Распределить системную память
 push   nPages	; Количество 4к-байтных страниц
 int    20h
 dw     PageAllocate
 dw     VMM
 add    ESP, 32	; Очистим стек

И ещё один момент. Параметры передаются через стек, но стек за собой эти функции не освобождают....

К статье прилагается .inc файл со всеми необходимыми константами и функциями.

Теперь мы можем написать обычный вирус, который рыщет по дискам в поисках жертв. Но зачем тогда нам ноль?:) Наша цель - Резидентность!

Самый просиой способ - это перехватить обработчик файловой системы (IFS), точнее написать свой и заменить им стандартный. Что нам это даст? Таким образом, каждый раз, когда идёт обращение к файловой системе, ядро вызывает нас, а уже мы вызовем, что требуется...

 push   offset OurIFS
 int    20h
 dw     InstallFileSystemApiHook
 dw     IFSMGR
 add    ESP, 4

К статье прилагается соответствующий пример.

...Наверно этого будет достаточно :)

Все вопросы в форум http://sbvc.net/forum/

10.07.02