"Игорь Коваль. Как написать вирус" - читать интересную книгу автора

Другой способ состоит в использовании для поиска
подходящего блока памяти так называемых MCB - бло-
ков ( потом мы поговорим о них подробнее ) . При
этом вирус должен путем сканирования цепочки бло-
ков управления памятью ( Memory Control Blocks )
найти свободный блок подходящего размера, разде-
лить его на две части, одна из которых точно соот-
ветствует или несколько превышает длину вируса, и
записать во вновь созданный блок свой код.Основной
недостаток данного метода состоит в том что MCB -
блоки являются недокументированной структурой MS
DOS, и при их использовании нужно быть готовым к
тому,что программа будет работать на одной машине
и не будет работать на другой. Это также относится
к разным версиям операционной системы .Кроме того,
очень сложно построить эффективный алгоритм реали-
зации этого метода . Ведь вирусный код должен за-
писываться не просто в подходящий по размерам
блок, а в старшие адреса оперативной памяти, ина-
че загрузка больших программ будет просто невозмо-
жна .
Третий способ заключается в том, что код вируса
копируется в заданную область памяти без коррекции
MCB - блоков. Недостаток его состоит в следующем:
"время жизни" вируса,реализующего такой алгоритм,
чрезвычайно мало и зависит от интенсивности ис-
пользования оперативной памяти . Причем "гибель"
вирусной программы с почти стопроцентной вероятно-
стью приводит к повисанию компьютера. Хотя метод
отличается простотой реализации и имеет ряд других
достоинств, приведенный выше недостаток делает его
практическое использование маловозможным .
Четвертый способ состоит в использовании функций,
реализующих управление памятью.Используя его,можно
построить эффективный и корректно работающий про-
граммный код, который будет хорошо работать на
разных машинах и с любыми версиями операционной
системы .При этом его реализация весьма проста и
понятна . Поэтому мы применим именно этот способ :

free_mem: mov ah,4ah ;Определим объем
;доступной памя-
;ти ...
mov bx,0ffffh ;Заведомо невоз-
int 21h ;можное значение
;(0ffffh) !
;Ошибка будет
;обязательно, и
;проверять ее
;наличие