╔═══════════════════════════════════════════╗
║ ■ ■ ║
║ █▀ █▀▄ █▀ █▀█ ▀█▀ █ █ █▀▄ █▀ █▀▀ ║
║ THE █ █▄▀ █▄ █▄█ █ █ █ █▄▀ █▄ █▄▄ ║
║ █▄ █ █ █▄ █ █ █ █▄█ █ █ █▄ ▄▄█ ║
║ ■ ■ ║
╚═══════════════════════════════════════════╝
Посадка в память вирусного кода.
------------------------------------------------------------------------------
"Что-то с памятью моею стало..."
Некоторые считают, что нерезидентный вирус, каким бы он не был,
недостоин называться вирусом, ну и вообще кал полный. Не знаю. В любом
случае нельзя делать ставку ТОЛЬКО на резидентность. Ведь вирусы -
поле для фантазии довольно широкое, так что творите, "плодитесь и
размножайтесь", ну и все такое. В любом случае, необходимо знать, как это
делается, поэтому здесь описывается заражение с использованием
резидентности и реализация этой самой резидентности, а также кое-что об
организации памяти в MS-DOS. Для начала. Итак, с адреса 0:0 начинается
таблица векторов, потом всякая системная хрень, короче, собственно
используемая память находится где-то в 80-м сегменте. Память в системе
разделена на части, каждая из которых имеет свой Memory Control Block (MCB),
длиной в 16 байт.
Так как область памяти без MCB в лучшем случае затрется чем-нибудь
гадким (в худшем будет Memory allocation error), а приписывать вирус к
другой программе в жопном блоке недостойно, то лучше всего скромно выделить
под вирус собственный блок памяти.
При запуске COM или EXE программы с присобаченым вирусом, под нее
выделяется блок размером со всю свободную память, что неотрадно, так как нет
места для нашего блока. Но мы ведь тоже не пальцем сделаны (неужели вы
все еще топчете ваши тексты одним пальцем? надо учиться печатать!), и
поэтому запросто обрежем, откусим и изнасилуем подручными предметами
программу, поимев для себя желанную память. В качестве подручного предмета
можно взять родной DOS, использовав функцию X'4Ah - изменить размер блока
памяти (входные данные: bx - новый размер, es - сегментный адрес).
Рассчитывайте размер, исходя из того, что MCB также занимает один сегмент.
Затем можно попользоваться X'48h чтобы выделить блок, хотя вообще
MCB можно записать вручную. (входные данные для X'48h: BX - требуемая память)
Эти функции возвращают CF=1 при ошибке, пользуйтесь этим при отладке.
Переместив вирус путем movsb, можно вообще и завершать работу, но,
поскольку в MCB установлен "адрес владельца" на носитель, то вирусу придет
пиндык. Поставьте туда '8' - владелец DOS. Имя файла также можно затереть.
Чтобы вирус получал управление, необходимо переставить вектор 21h
на его адрес, только вот тут-то и будет облом. Ну, не полный, конечно, но
скотина ВъЕБ страшно орет, увидев, что int21h показывает на конец памяти.
Хотя обломать по такой хуйне его - плевое дело.
Реагировать можно по разным событиям, по запуску программ, открытию
и закрытию файлов, завершении процесса (X'4Ch). Чтобы проверить, а не сидит
ли уже вирус в памяти, введите для доса новую функцию :)
Для операций с файлами можно либо ввести новый инт, повесив его на
обработчик двадцать первого, хотя, если у вас не встречается вызовов
фуцнкций, на которые реагирует вирус, можно оставить все как есть.
(я говорю про вызов функций доса из вашего обработчика int 21h)
Цель данной статьи - пробудить интерес к реализации резидентности
вируса, а вовсе не расписать все по полочкам, как и что делать. Помните -
чем оригинальнее вирус, тем лучше.
Нестандартный программист
Джарод