ZF

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


     Через мои  руки  прошло  несколько  сотен  образцов  компьютерных
животных,  и  слишком  часто в них встречались одни и те же ошибки.  С
одной  стороны  это  хорошо   -   такие   вирусы   часто   оказываются
"маложивущими",   но  с  другой  стороны,  малозаметная  ошибка  может
привести  к  несовместимости  вируса  и  используемого  на  компьютере
программного   обеспечения.   В  результате  вирус  "вешает"  систему,
компьютер отдыхает,  а пользователи мечутся в панике с криками  "Пусть
хоть 100 вирусов, лишь бы компьютер работал!!!" (завтра сдавать заказ,
не запускается самая любимая игрушка,  компилятор виснет при выходе  в
DOS  и  т.п.).  И все это происходит при заражении довольно безобидным
вирусом.
     По причине   этого   и   возникло  желание  поделиться  некоторой
информацией о жизни вируса в компьютере дабы облегчить жизнь и Вам,  и
многочисленным "пользователям" Ваших вирусов. Итак, правила для автора
вируса:

     0. Не надо писать вирусы - на свете так много  интересного!  Если
нечего  делать,  то  перепишите  что-нибудь  с  DOS  на Windows,  если
хочеться прославиться - сделайте то же самое,  но потом раздайте  свою
программу всем желающим и нежелающим.

     1. При  запуске  вирус  должен  сохранять  все регистры,  которые
передает DOS загружаемой программе (т.е.  не только AX,  DS и ES, но и
остальные),  а  при  переходе  на  программу  восстанавливать  их  (за
исключением корректировки SS:SP, если это нужно). Почему? Объясняю.

     Существуют (и  обязательно  появятся  еще)   программы,   которые
используют  для  своих нужд значения регистров,  передаваемых из DOS'а
при  загрузке.  Например,  довольно  популярный   архиватор   COM-   и
EXE-файлов  DIET  (версия 1.10a) при распаковке запускаемых COM-файлов
предполагает,  что значение регистра BX обязательно должно быть  равно
0000h.  Если  подобная  программа  будет заражена вирусом,  который не
восстанавливает регистры при передаче управления на тело программы, то
она,  скорее  всего,  "умрет"  при  загрузке.  При  загрузке  регистры
принимают значения (верно для MS DOS 3.30 - 5.0):

AX = BX - корректность имени диска в командной строке (0 или 00FF);
CX, BP - не определены; DX=DS; SI=IP; DI=SP.

     2. Если  Вы  используете  или корректируете системные области DOS
(буферы,  стек, фрагменты обработки прерываний), Вы обязательно должны
проверять, в какой системе находитесь. Почему? Объясняю.

     Как правило,   каждая   следующая  версия  DOS  своей  внутренней
организацией не похожа на предыдущую. Это касается и буферов, и стека,
и  многого  другого.  Поэтому,  если  Вы полностью дизассемблировали и
разобрали по косточкам версию MS DOS 3.30, это вовсе не значит, что Вы
постигли все тайны фирмы Microsoft и Вам можно ставить памятник.  Нет!
Вам следует перекурить и приниматься за версию 4.0x,  потом 5.00,  а в
минуты отдыха и по ночам потрошить DR DOS.

     3. При  заражении  программ  сначала  записывайте вирус,  а затем
модифицируйте начало файла (в случае,  если вирус пишется в начало или
середину   файла   -   сначала  сохраните  стираемую  часть,  а  затем
записывайте вирус). Почему? Объясняю.

     При записи в файл может произойти ошибка  (кстати,  не  забывайте
проверять  флаг  CF  при  операциях  с  дисками),  и  если  Ваш  вирус
модифицировал начало файла,  а сам не записался,  то  файл  безнадежно
испортится и при загрузке скорее всего зависнет.

     4. Если  Вы  заражаете  COM-  и EXE-файлы,  сохраняйте первые два
байта заражаемой программы и проверки "COM или EXE"  проводите  только
по  ним  (напомню  - в начале EXE-файлов должна быть сигнатура - 4D5Ah
или 5A4Dh).  Говорю об  этом  только  потому,  что  участились  случаи
появления вирусов,  которые проверяют "COM или EXE" по способу:  равен
регистр CS  регистру  DS  (ES)  или  нет  (некоторые  даже  умудряются
проверять  по  регистру  IP  -  равен  он  100h или нет).  Это в корне
неверно,  т.к.  при запуске EXE-файла  регистр  CS  может  быть  равен
регистру  DS (если в EXE-заголовке по смещению 16h стоит слово FFF0h),
а регистр IP - 100h (слово по смещению 14h - 100h).  Я,  например, при
работе с вирусами использую именно такие файлы.
     Кстати, до сих пор попадаются вирусы,  которые определяют  формат
файла по расширению его имени (.COM или .EXE). О том, что это является
грубой ошибкой, знают даже в детских садах!

     5. При заражении EXE-файлов обязательно сравнивайте длину файла с
длиной загружаемого модуля. Если они не совпадают, то такой файл лучше
не трогать,  так  как  Вы  либо  уничтожите  оверлей,  либо  программа
перестанет   загружаться   в  память.  Для  EXE-файлов  также  следует
проверять значения стековых регистров, иначе в некоторых случаях вирус
будет уничтожен стеком. Так же проверяйте длину COM-файлов: не следует
их делать больше, чем 64K.

     6. Учтите,  что чем дальше,  тем больше  Вашим  вирусам  придется
сталкиваться  с защищенным режимом процессоров 80x86,  в котором,  как
известно,  перехват прерывания 21h является довольно тонким  вопросом.
Если Вы перехватываете int 21h "по-старинке", то многие новые продукты
(например,  Borland C++ 3.0) будут зависать,  а Windows при нескольких
DOS-задачах  в  фоновом режиме может выдать "unrecoverable application
error".
     Для того,  чтобы  избежать  этого  помимо  всех  известных правил
подмены  критических  прерываний  (установка  флагов  и  регистров  на
выходе) существуют еще два:

- непосредственно перед вызовом OLD_21 нужно запретить аппаратные
  прерывания (cli);
- для всех функций, которые не обрабатывает Ваш резидент, OLD_21
  нужно выполнять через JMP а не через CALL.

     7. Теперь  насчет  порчи  программ  и  дисков.  Сравните   вирусы
зарубежного и отечественного производства. Вам сразу бросится в глаза,
что почти каждый советский вирус,  в отличие от зарубежных (не  считая
тайваньских:  "Восток - дело тонкое"),  что-нибудь,  да испортит. Даже
большая группа болгарских вирусов не  идет  ни  в  какое  сравнение  с
нашими  вирусами  по  части  пакостей.  Что  это - особенности русской
(точнее - советской) души или наследие сталинизма?
     Короче, если  Вы  пишете  вирус,  старайтесь  воздерживаться   от
вставки  пакостей  -  это  может  Вам  же  выйти  боком.  Несмотря  на
отсутствие в  нашем  уголовном  законодательстве  статьи  о  написании
вирусов  есть  там  другая статья - "причинение материального ущерба".
Вот по этой статье Вас и посадят,  тем более, что такой случай уже был
(по сообщению Н.Н.Безрукова).  Ну а если и не посадят, то пострадавшие
могут найти и, извините, морду набить. И такие случаи тоже бывали.
     Ну а  уж  если  Вы  все-таки  вставили  какую-то  гнусность,   то
запускайте свой вирус на своем компьютере и - наслаждайтесь.

     P.S. Данный  раздел  написан  в соавторстве с Евгением Касперским
(E-mail eugene@kami.npimsu.msk.su) и  Алексеем  де-Мондериком  (E-mail
demont@kami.npimsu.msk.su).



(C) NF, 1998-2004