Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:
реклама

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

"Вирусы", "Черви", "Драконы" и резиденты на службе прогресса.

Назад | Далее

гл.15    В КОТОРОЙ ВЫ УЗНАЕТЕ О ПРОКЛЯТИИ MSDOS --  БУТОВЫХ ВИРУСАХ
                        (совершенно новая тема)
============================================================================

     СРАЗУ ЖЕ ПРЕДУПРЕДИМ ВАС, что работа в данной области сопряжена  с повы-
шенной опасностью. => Вы  должны,  если решитесь что-либо предпринять, прояв-
лять крайнюю осторожность.
     Вот какие минимальные  правила техники безопасности мы бы Вам рекомендо-
вали: при помощи программы diskeditor  из  нортоновских  утилит перепишите на
специальную дискету (в  виде файлов) такие  объекты ЖЕСТКОГО ДИСКА  как  Boot
Record и Partition Table (они придставлены в меню diskeditor-а). Если Вы слу-
чайно повредите эти объекты во время своего эксперимента, при помощи  того же
diskeditor-а (предварительно загрузившись  с  системной дискеты) Вы можете их
восстановить (записать соответствующие  файлы в область Boot Record или MBR).
Более того, когда Вы вольно работаете с прерыванием 13h, иногда полезно быва-
ет сохранять подобным образом даже FAT.

     Расскажем, не вдаваясь в излишние  подробности  о  логической  структуре
жесткого диска (HDD).  HDD разбит на разделы, называемые логическими дисками.
На каждом из  разделов в принципе  может обитать своя  операционная  система.
Каждый такой раздел имеет  специальный  загрузочный сектор, который, в случае
если раздел имеет свою систему, хранит программу ее  загрузки. Кроме разделов
HDD имеет специальный трэк (дорожку),  не доступный  для пользователя MS-DOS;
т.н. скрытый трэк.
     А как PC узнает, на каком из разделов находится система и как он ее заг-
рузит? Дело  в том, что на скрытом трэке, в самом его начале (цилиндр 0, сто-
рона 0, сектор 1) находится специальная крохотная программа-загрузчик (Master
Boot-Record (MBR)), которая анализирует, -  какой  из  разделов имеет систему
(является  активным)   и   передает   управление   загрузчику  этой  системы.
     Теперь по-подробнее, -- как происходит процесс загрузки PC.
     1) Вы включили электропитание;
     2) Специальные подпрограммы BIOS-а, сидящие в ПЗУ, тестируют память
        и прочее железо;
     3) Специальная подпрограмма BIOS-а считала с HDD самый первый сектор
        скрытого трэка (MBR) и передела ей управление. (MBR была считана
        по адресу 0000:7C00h);
     4) MBR хранит в себе специальную таблицу (Partition Table), в которой
        говорится, на каком из разделов HDD сидит система;
        MBR анализирует эту таблицу, определяет активный раздел, после чего
     5) MBR считывает в память (по адресу 0000:7C00h) загрузчик системы,
        (он находится на диске в начале соответствующего раздела) и передает
        ему управление;
     6) Загрузчик системы (Boot Record (BR)) загружает в память системные
        файлы и передает им управление;
     7) далее  инициализируются  драйверы  из  config.sys;  запускается
        COMMAND.COM и стартует autoexec.bat;

     Достаточно долгий и нудный процесс. Но бутовые вирусы себя особо  не ут-
руждают. Когда бутовый вирус заражает  компьютер,  он  переписывает либо MBR,
либо -- BR в какое-либо другое место (как правило -- в пределах скрытого трэ-
ка), а сам -- садится на их место. Когда в  следующий  раз включат зараженный
PC, при  выполнении  пункта  3 (или 5) вместо MBR (или BR) в память по адресу
0000:7C00h будет считан и получит управление вирус. Он  по специальному меха-
низму посадит  резидент и после этого загрузит по  адресу 0000:7C00h MBR (или
BR) и передаст ей управление. Вирус как бы вклинился в процесс загрузки; стал
в нем посредником.
     Чаще вирусы нападают на  BR, нежели на MBR. Это связано с  рядом причин.
Во-первых в процессе загрузки системы к MBR обращаются  не единожды (читаются
данные из Partition Table); т.о. вирус, либо должен оставить в неприкосновен-
ности  Partition  Table,  либо  --  включить  в  свою  резидентную  процедуру
СТЭЛС-блок, каждый  раз, когда идет  запрос на чтение сектора 001, подсовыва-
ющий сохраненную где-то  истинную MBR. Во-вторых даже при визуальном контроле
(если вы  загрузитесь с  системной дискеты и посмотрите на  сектор 001) в MBR
легче обнаружить присутствие  вируса, т.к. "здоровая" MBR занимает лишь около
1/3 сектора, остальное -- пустота.
     Встает вопрос: каким образом бутовые вирусы заражают PC? Есть 2 способа.
Во-первых вирус может быть не чисто бутовым, а бутово-файловым; т.е. заражать
как MBR (BR), так и EXE- и COM-файлы. С компьютера на компьютер он переносит-
ся в  файле. Во-первых вирус может внедряться в  Boot Record-ы гибких дисков.
Пользователь нередко забывает извлечь дискету из  дисковода перед перезагруз-
кой PC. Если это  случится, PC пробует загрузить систему с дискеты.  Тут-то и
вылезает вирус.
     Теперь опишем механизм посадки резидента (он отличается от всех рассмот-
ренных нами ранее).
     Мы уже пользовались областью данных BIOS. В ячейке  с адресом 0040:0134h
мы хранили флажок наличия резидентной копии вируса в памяти. Но помимо пустых
ячеек, которые  мы можем использовать в своих целях,  область данных BIOS со-
держит ячейки, хранящие очень важную информацию. В наших изысканиях нас будет
интересовать ячейка с  адресом  0000:0413h. Здесь хранится величина свободной
памяти PC (одно слово). Выражается эта величина в килобайтах. В момент, когда
файлы MS-DOS загружаются в память, загрузка эта выполняется с учетом величины
свободной памяти.  Если перед началом  загрузки DOS уменьшить слово по адресу
0000:0413h, то после загрузки память будет  распределена  так,  что  появится
свободная область, потерянная для DOS.  Ее  размер = величине, на которую  мы
уменьшили слово по адресу 0000:0413h (в килобайтах). В эту область мы и можем
посадить наш резидент. Весь фрагмент посадки резидента будет выглядеть так:


      XOR   AX,AX                         ;¬
      MOV   DS,AX                         ;¦DS=0
      MOV   AX,word ptr DS:[0413h]        ;¦уменьшаем количество свободной
      DEC   AX                            ;¦памяти на 1  Kб
      MOV   word ptr DS:[0413h],AX        ;-
      ;
      MOV   CL,06                         ;¬вычисляем сегментный адрес
      SHL   AX,CL                         ;+свободного участка памяти
      MOV   ES,AX                         ;-
      ;
      MOV   AX,rezident_segment           ;¬
      MOV   DS,AX                         ;¦пересылаем в захваченную
      MOV   SI,rezident_offset            ;¦нами область код резидента
      XOR   DI,DI                         ;¦ (здесь это - 1 Кб)
      MOV   CX,0100h                      ;¦
      CLD                                 ;¦
      REPNE MOVSW                         ;-


     Ниже мы приводим программу, которая является,  по-сути, фильтром предох-
раняющим компьютер от  бутовых вирусов. Этот фильтр, подобно бутовому вирусу,
записывается (но  только  не  сам по себе, а -- программистом) в сектор 0 0 1
(MBR при этом заблаговременно перемещается нами в  сектор 0  0  7). В  момент
загрузки фильтр  сажает резидент на  прерывание 13h. Как только бутовый вирус
попытается  заразить  PC  (будет дано прерывание 13h -- запись в сектор 0 0 1
или 0  1  1) -- фильтр приостановит работу PC  и выдаст предупреждение. После
этого   PC    будет    автоматически    перезагружен   при   помощи   команды
JMP__far_0FFFF0000h (по этому адресу находится подпрограмма BIOS, осуществля-
ющая перезагрузку). Фильтр реализует стэлс-механизм сектора 0 0 1 (при попыт-
ке считать оттуда информацию мы получаем истинную MBR).
     Вот блок/схема программы:

      --инициализационная часть-¬         _/блок обработки прерывания 13h\_
-------------------------------------¬  -------------------------------------¬
¦ установка стека: SS=0, SP=7C00h    ¦  ¦ читаеся сектор 0 0 1 HDD? если да -¦
¦(сам код начинается по 0000:7C00h)  ¦  ¦подсовываем вместо него сектор 0 0 7¦
L-----------------T-------------------  ¦(истинную MBR,загодя там сохраненную)
                  ¦                     L-----------------T-------------------
------------------+------------------¬                    ¦
¦ уменьшаем слово по адресу 0:413h   ¦  ------------------+------------------¬
L-----------------T-------------------  ¦кто-то пытается что-то записать в   ¦
                  ¦                     ¦сектор 0 0 1? да -- идем на объявле-¦
------------------+------------------¬  ¦ние тревоги >>-----------------------¬
¦ пересылаем резидент в освободив-   ¦  L-----------------T-------------------¦
¦ шуюся область                      ¦                    ¦                   ¦
L-----------------T-------------------  ------------------+------------------¬¦
                  ¦                     ¦кто-то пытается что-то записать в   ¦¦
------------------+------------------¬  ¦сектор 0 1 1? нет - идем на IRET >>--¦¬
¦ делаем JMP far на продолжение кода ¦  L-----------------T-------------------¦¦
¦ уже в резиденте                    ¦                    ¦>--------------------¬
------------------+-----------------¬   L-----------------T-------------------¦
¦ пересылаем резидент в освободив-  ¦                     ¦                   ¦
¦ шуюся область                     ¦   ------------------+------------------¬¦
L-----------------T------------------   ¦включен ли мотор дисковода? да, --  ¦¦
                  ¦                     ¦уходим на IRET >>-------------------->
------------------+-----------------¬   L-----------------T-------------------¦
¦ делаем JMP far на продолжение кода¦                     ¦                   ¦
¦ уже в резиденте                   ¦   ------------------+------------------¬¦
L-----------------T------------------   ¦записываем код вируса в сектор 0 0 1¦¦
                  ¦                     ¦дискеты                             ¦¦
------------------+-----------------¬   L-----------------T-------------------¦
¦ считываем по адресу 0000:7C00h    ¦                  ---+--¬                ¦
¦ истинную MBR (она была записана   ¦                  ¦ IRET¦>--------------------¬
L-----------------T------------------ ¦
                  ¦                   ¦
------------------+-----------------¬ ¦
¦переписываем MBR в сектор 0 0 7    ¦ ¦
+-----------------------------------+ ¦
¦записываем код вируса в сектор 001 ¦ ¦
L-----------------T------------------ ¦
                  ¦                   ¦
------------------+-----------------¬

Назад | Далее

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог