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

Ваш аккаунт

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

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

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

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

Назад | Далее

     Ответы:
     ------
     Инициализирующая часть не остается в памяти резидентно, т.к. она не вхо-
дит в п/п-му обработки прерывания 05,  она нужна лишь для посадки резидента в
память и перенаправления вектора прерывания на него. Здесь уместна аналогия с
запуском орбитального спутника: ракета-носитель , вы-
водит на орбиту спутник-шпион . При этом сама ракета-носи-
тель разрушается и на орбиту не попадает.
     О порядке следования. Если бы сначала шла инициализирующая  часть, а по-
том - резидентная, то мы были бы вынуждены сделать резидентным  и инициализи-
рующий кусок, ибо резидентным становится все,  начиная от PSP и до того адре-
са, который мы поместим в DX  перед генерацией INT 27h. Оставление в резиден-
туре инициализационной части приведет к  расходованию  лишней  памяти  (очень
ценного ресурса).
     ЗАМЕЧАНИЕ: вот  в  случае  создания резидентного вируса инициализирующая
часть обязана быть резидентной, так как ВИРУСУ ДОЛЖЕН БЫТЬ ДОСТУПЕН ВЕСЬ СОБ-
СТВЕННЫЙ КОД. Лишь при этом условии вирус сможет себя куда-нибудь запихнуть.
     Вот зачем появились операторы CLI и STI: в момент, когда мы вручную (при
помощи команд пересылки) заменяем  адрес  в таблице векторов, может произойти
вызов того самого прерывания, которое мы перехватываем. Если одно слово заме-
нено, а другое -  еще  нет  --  будет  маленький  Чернобыль  (семь бед - один
RESET). На время замены вектора надо  временно  запретить  вызовы  прерываний
(команда CLI),  после окончания замены  -- разрешить вновь (команда STI). Ко-
манда CLI запрещает все прерывания, кроме немаскируемого NMI.
     Зачем в начале нашей п/п-мы обработки  прерывания 05 торчит PUSH AX, а в
конце -- POP AX? Слушайте СУПЕРПРАВИЛО:
-СУПЕРПРАВИЛО---------------------------------------------------------------¬
¦     Если п/п-ма обработки прерыв-я в процессе работы портит какой-либо ре-¦
¦гистр, то перед  окончанием  своей  работы она обязана вернуть ему  прежнее¦
¦значение. Чаще  всего это делается так:  перед началом работы  этот регистр¦
¦роняется в стек, а перед окончанием достается обратно. (Есть и  другие спо-¦
¦собы).                                                                     ¦
L----------------------------------------------------------------------------

     В заключение главы сварганим еще  один  резидент,  который будет гудеть,
стОит лишь  нам запустить какую-либо программу. Сажать его  мы будем на обра-
ботку прерывания 21h - "Прерывания DOS" (функция 4Bh) :

     коментарии  см. ниже
      -----------------------------------------------------------¬
      ¦                         пример 6                         ¦:
      L-----------------------------------------------------------

TITLE   Это - COM. программа N6 для демонстрации посадки резидента
ASSUME        CS:CodeSegment
;-----------------------------------------------------------------
CodeSegment   SEGMENT PARA
              ORG(100h)
Start:
MainProcedure PROC NEAR
              ;
              ;
              JMP  initial                    ; перепрыгнем через данные
              ;                               ; и наш обработчик прер-я 21
              ;                               ; на инициализирующую часть
              ;
              ;
saved_int21:  DD   0                          ; данные (хранилище для
              ;                               ; адреса стандартного обра-
              ;                               ; ботчика прерывания 21 --
              ;                               ; -- 2 слова)
              ;
              ;-----------наша п/п-а обработки прерывания 21------------------¬
              ;¦         (она останется резидентной в памяти)                 ¦
              ;¦                              ;здесь мы можем приколоться как ¦
int21_treater:;¦                              ;  хотим..                      ¦
              PUSH AX                         ;                               ¦
              CMP  AH,4Bh                     ;вызвана ф-я 4Bh  прерыв-я 21h  ¦
              JNE  not_beep                   ; (запуск программы)    -- если ¦
              MOV  AX,0E07h                   ; нет - гудеть не будем         ¦
              INT  10h                        ;давать гудок (печать - символа ¦
not_beep:     POP  AX                         ; с кодом 07)                   ¦
              ;                               ;PUSH и POP ОЧЕНЬ важны сами    ¦
              ;                               ;  знаете теперь почему         ¦
              ;                               ;                               ¦
              JMP  dword ptr CS:[saved_int21] ; длин. JMP   по адресу, котор. ¦
rezident_end: ;¦                              ; находится теперь в хранилище  ¦
              ;¦                              ; saved_int21 (возвращаем управ-¦
              ;¦                              ; ление стандартному обработчику¦
              ;¦                              ; прерывания 21)                ¦
              ;L---------------------------------------------------------------
              ;                               ;
              ;-----------инициализирующая часть------------------------------¬
              ;¦ (здесь мы сажаем резидент, переопределяя адреса)             ¦
              ;¦                                  ;                           ¦
initial:      XOR  DX,DX                          ; ---¬                      ¦
              MOV  DS,DX                          ; ---+--> DS = 0            ¦
              ;                                   ;                           ¦
              MOV  AX,DS:[21h*4]                  ; сохраняем в хранилище saved_
              MOV  word ptr CS:[saved_int21  ],AX ; int21 адрес стандартного  ¦
              MOV  AX,DS:[21h*4+2]                ; обработчика прерывания 21 ¦
              MOV  word ptr CS:[saved_int21+2],AX ; ( OFFSET и SEGMENT )      ¦
              ;                                   ;                           ¦
              ;                                   ;                           ¦
              CLI                                 ;запрещаем прерывания       ¦
              MOV  AX,OFFSET int21_treater        ;                           ¦
              MOV  word ptr DS:[21h*4],AX         ;кладем в таблицу векторов  ¦
              PUSH CS                             ; адрес нашего обработчика  ¦
              POP  AX                             ; прерывания 21             ¦
              MOV  word ptr DS:[21h*4+2],AX       ;                           ¦
              STI                                 ;разрешаем прерывания       ¦
              ;                                   ;                           ¦
              ;                                   ;                           ¦
              MOV  DX,OFFSET rezident_end         ;DX. А в стеке, сразу после загрузки СОМ-программы на
выполнение, лежит 0. Таким образом после команды RET управление передается по
адресу CS:00, т.е. на начало PSP, т.е. на команду INT 20h.
     Обо всех прочих объектах Вы подробнее узнаете позднее.



гл.6 ПЕРВАЯ ПАКОСТЬ (создание ублюдочного резидентного вируса, грохающего за-
                            ражаемую программу)
=============================================================================

     КОМЕНТАРИЙ К ЗАГЛАВИЮ:  этот бездарный вирус показан здесь как анти-при-
мер для  подражания и лишь для  повышения Вашей образованности  на достаточно
простом и наглядном материале.  Вообще  -- вирусы, необратимо грохающие прог-
раммы, создаются, как правило, либо - человеконенавистниками, либо - програм-
мистами, пока что еще слабо владеющими мастерством, либо - в погоне за рекор-
дом (например - рекордно короткая длина), либо - чтобы реализовать конкретный
алгоритм в условиях сильных  внешних  ограничений (например вирус должен быть
не длиннее одного сектора - 512 байт). Наш случай (смеем надеяться) не подхо-
дит ни под одну из этих категорий.
     Что касается  нашего первого вируса, то он будет  вот каким: Вирус будет
резидентным. Резидент  будет обрабатывать по-своему операции чтения/записи на
HDD. Как  только резидент обнаружит, что с HDD  читается годный для заражения
файл, он тут же запишет в  него свою копию. Причем запишет таким образом, что
при запуске пораженного файла тот создаст  новую  резидентную  копию  вируса.
Цикл функционирования вируса замкнется.
     Чтобы выполнить задуманное, нам необходимо еще кое-что узнать. Кое-что о
жестком диске PC (HDD, он же - "винчестер") и о гибких дисках (FDD).
     Информацию можно читать/писать  на  HDD только фиксированными порциями -
секторами. Как правило, для HDD  длина  сектора составляет 512 байт. За  один
раз на HDD можно записать/прочитать несколько секторов. Т.о.  за каждое обра-
щение к HDD на него можно записать/прочитать количество  байт, СТРОГО КРАТНОЕ
512. Нельзя, например, записать/прочитать 1,65,513,1033  байт,  но  можно  --
512,1024,1536,...
     Как PC находит нужные ему сектора? Чтение и запись на HDD осуществляется
не совсем  так, как на магнитофон. В магнитофоне  чтобы найти и считать/запи-
сать информацию  нужно задать ее координату от начала  ленты -- система ОДНО-
МЕРНА. При этом  Вы должны пролистать ВСЮ предшествующую информацию. Скорость
такого процесса весьма мала. Такую фигню  называют устройством последователь-
ного доступа. В HDD реализован другой  принцип. HDD - это - трехмерное инфор-
мационное пространство и информацию в него писать/читать можно как в ТРЕХМЕР-
НЫЙ массив. Это же круто! Скорость офигительная, износ - минимальный.
     Итак, можно представить  HDD  как трехмерный массив, элементами которого
являются сектора. Индексы-измерения этого массива будут называться вот как, и
иметь вот какие диапазоны изменения:

               индекс-измерение             ¦ диапазон изменения
               -----------------------------+-------------------
               сторона (side)               ¦   0,...,N--¬
                                            ¦            +--для разных
               цилиндр (cylinder)           ¦   0,...,M--+  HDD - разные
                                            ¦            ¦  значения
               сектор  (sector)             ¦   1,...,L---

     Измерение "сектор" пока  что не смешивайте с элементарной неделимой еде-
ницей читаемой/пишущейся информации, так же именуемой "сектор".
     Вот как понял бы приведенное выше описание HDD PASCAL-ист:


              Type
                Sector = array [1..512] of byte;

              Var
                HDD : array [0..N, 0..M, 1..L] of Sector;
                             LT--  LT--  LT--
                              +-----+-----+--------- для разных HDD
                           side  cylinder sector     разный верх. предел

     Когда операционная система MS-DOS работает с файлами, она  на самом деле
имеет дело с отдельными секторами и группами секторов,  в которых размещается
содержимое файла.
     Если Вы  желаете подробнее познакомиться  со структурой HDD, - то прочи-
тайте нижеследующий кусок текста, - нет -- джампуйте через него  - информации
у Вас для понимания дальнейшего материала в принципе достаточно.
     Если не хотите о HDD подробнее -- следуйте за стрелкой: ==>==============>==¬
                                                                                 V
¦¬ структура дискаг¦                                                             ¦
¦L==(подробнее)===-¦  На физическом уровне HDD состоит из нескольких  плоских    ¦
L==================-  (наверное - жестких) дисков,  намертво закрепленных  на    ¦
общей оси (своего рода - этажерка). Первое измерение этого трехмерного квази-    ¦
массива называется "сторона"(side). Верхняя сторона верхнего диска "этажерки"-   V
                                                                                 ¦
      -----------------------------------------------------------¬               ¦
      ¦                           рис.5                          ¦:              ¦
      L-----------------------------------------------------------               ¦
                                                                                 ¦
      ось-¬                  -----> side 0     Измерение "сторона"               ¦
          L---->¦¦           ¦                                                   V
================х================              пределы изменений: 0..N,          ¦
 диски-T-       ¦¦           L----> side 1     где N -- для разных HDD           ¦
      ¦L¬       ¦¦           -----> side 2     -- различно                       ¦
======¦=========х================                                                ¦
      ¦         ¦¦           L----> side 3                                       ¦
      ¦         ¦¦  ...                                                          ¦
      L-¬       ¦¦           -----> side N-1                                     ¦
================х================                                                V
                ¦¦           L----> side N                                       ¦
                                                                                 ¦
-- это side 0, а нижняя - side 1; верхняя сторона следующего диска -- side 2,    ¦
а нижняя - side 3. И т.д. - см. рис. 5.                                          ¦
     Следующее измерение называется "цилиндр" (cylinder) . Надеемся искренне,    ¦
что,  гдядя  на  рис. 5, Вы все же сможете ухватить нашу мысль (поясним лишь,    ¦
что здесь средствами уголковой графики мы попытались изобразить "двухэтажный"    ¦
диск). Цилиндр - пространство на ВСЕХ дисках "этажерки", находящееся на опре-    V
деленном расстоянии от мест закреплений  дисков  на оси. Т.е. это -  совокуп-    ¦
ность концентрических дорожек одного  радиуса  на ВСЕХ сторонах HDD. Цилиндры    ¦
нумеруются так: 0..M, где M -- для разных HDD -- различно.                       ¦
                                                                                 ¦
      -----------------------------------------------------------¬               ¦
      ¦                          рис.6                           ¦:              ¦
      L-----------------------------------------------------------               ¦
верхний                                                                          V
диск    --¬                                                                      ¦
"этажерки"¦               --------------T-------------¬                          ¦
          ¦      ---------\             ¦            /L--------¬                 ¦
          ¦  -----          \-----------+----------/---¬       L---¬             ¦
         -----     ---------- \         ¦        /     L--------¬  L---¬         ¦
     -----     -----          --\-------+------/--¬             L---¬  L---¬     ¦
   ---     -----    -----------   \     ¦    /    L---------¬       L--¬   L-¬   ¦
  --    ----   ------               \--+¦¦-/-¬              L-----¬    L--¬  L¬  V
  ¦   ---   ----               ------ \¦¦¦   L--¬                 L---¬   L¬  ¦  ¦
  +---+TTTTT+------------------+--------¦L------+---------------------+----+--+  ¦
  ¦   L¦+++++TT¬               L----¬ / ¦ \  ----                 -----   --  ¦  ¦
  L¬    L¦++++++TTTT¬               /---+---\-              -------    ----  --  ¦
   L-¬    ¦L¦¦¦¦¦¦¦¦+TTTTTTTTT¬   /     ¦     \   -----------     ------LT----   ¦
     L---¬¦    L++++¦¦¦¦¦¦¦¦¦¦¦-¬гTTTTTT+----------      LT-  -----    --+--     ¦
         L+--¬     L++++++++-¦/¦¦¦¦¦¦¦¦¦¦         \ ------+----    ----- ¦       ¦
          ¦  L---¬     ¦    /-¦¦¦¦¦¦+¦¦¦+-----------\     ¦    -----     ¦       V
          ¦      L-----+--/         ¦   ¦             \---+-----         ¦       ¦
          ¦            ¦  L---------+--T+T-------------   ¦              ¦       ¦
          ¦            ¦            ¦  ¦¦¦                ¦              ¦       ¦
сентор 3---            ¦            ¦  ¦¦¦         -------+----¬  -------+----¬  ¦
   ¦                   ¦            ¦  ¦¦¦--¬      ¦ цилиндр 1 ¦  ¦ цилиндр 0 ¦  ¦
   ¦                   ¦            ¦  ¦¦¦  ¦      ¦(стОроны   ¦  ¦(стОроны   ¦  ¦
   ¦    сентор 2 -------            ¦  ¦¦¦ ось     ¦   0,1,2,3)¦  ¦   0,1,2,3)¦  V
   ¦      ¦                         ¦  ¦¦¦         L------T-----  L------T-----  ¦
   ¦      ¦     сентор 1   ----------  ¦¦¦------------¬   ¦              ¦       ¦
   ¦      ¦        ¦                   ¦¦¦           /L---+----¬         ¦       ¦
   ¦      ¦        ¦                   ¦¦¦---------/---¬  ¦    L---¬     ¦       ¦
   ¦      ¦        ¦                   ¦¦¦       /     L--+-----¬  L---¬ ¦       ¦
   на цилиндре с номером 1             ¦¦¦-----/--¬      -+¬    L---¬  L-+¬      ¦
(из рис. не просЕчь - на какой стороне)¦¦¦   /    L---------¬       L--¬-+L-¬    ¦
                                       ¦¦¦-/-¬              L-----¬    L--¬ L-¬  V
                                       ¦¦¦   L--¬                 L---¬   L¬  ¦  ¦
                                       L¦L------+---------------------+----+--+  ¦
                                       |  \  ----                 -----  ---  ¦  ¦
возможно - сектора нумеруются против    \---\-              -------   ----  ---  ¦
часовой стрелки - нам это как-то         |    \   -----------     -----   ---    ¦
пО фигу                                 /-------\--           -----    ----      ¦
                                       |          \ -----------    -----         V
                                        \-----------\          -----             ¦
                                         |            \---------                 ¦
                                        /--------------                          ¦
                                                                                 ¦
     Третье измерение HDD --  "сектор"  -- угловое расстояние от определенной    ¦
точки на каком-либо цилиндре какой-либо  стороны  HDD.  Секторы нумеруются по    ¦
возрастанию углового расстояния. Нумеруются они так: 1..L (НЕ С 0, КАК ЦИЛИН-    V
ДРЫ И СТОРОНЫ!), где L -- для разных HDD -- различно.                            ¦
     Отметим, что пересечение  цилиндра  со стороной образует дорожку (track)    ¦
-- одну окружность на одной из  сторон. Так вот, -- дорожка состоит из следу-    ¦
ющих друг за другом секторов.                                                    ¦
     Задав все три координаты, мы однозначно  задаем  определенное  место  на    ¦
HDD. Вообще говоря, эта фигня сильно напоминает цилиндрические координаты.       ¦
г==

Назад | Далее

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

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