Смекни!
smekni.com

;3апретим прерывания, так как со стеком нельзя работать,
;пока и сегмент, и смещение не установлены в нужное значение
cli

-.Установим сегмент стека (PSP+Wh+OldSS)
mov ss.ax

:Установим первоначальный указатель (смещение) стека

db @mov_sp
OldSP dw ?

; Разрешим прерывания - опасный участок пройден
sti

[Подготовим значения в стеке для команды IRET
RetEntryPoint:

pushf

рассчитаем сегмент для кода по аналогии с сегментом стека

mov ax.DATASEG

add ax,10h

db @add_ax
OldCS dw ?

;Сохраним в стеке полученное значение (PSP+Wh+OldCS)
push ax

;Сохраним в стеке смещение исходной точки входа

db @mov_ax
OldIP dw ?

push ax

.Запустим программу. В стеке находятся смещение
;точки входа, сегмент точки входа и флаги
iret

Внедрение способом сдвига

Инфицируемая программа размещается в файле после кода вируса,
сдвигаясь на его длину, отсюда и название метода. Алгоритм работы
вируса следующий:

1. Открыть файл, из которого получено управление.

2. Считать в буфер тело вируса.

3. Закрыть файл.

4. Найти файл-жертву (для данного типа вирусов лучше СОМ-файл,
но можно и не слишком большой ЕХЕ - это связано с тем, что все
тело инфицируемой программы считывается в память и ее может не
хватить, если эта программа слишком большая).

5. Открыть файл-жертву.

6. Проверить файл на повторное заражение (здесь могут быть вариан-
ты, но чаще всего используется сигнатура).

7. Если файл уже инфицирован, перейти к пункту 3.

8. Считать в буфер все тело программы.

9. Записать в начало файла тело вируса из буфера.

10. Дописать в файл после тела вируса тело программы из буфера.
Длина программы увеличивается на длину вируса.

11. Закрыть файл-жертву.

12. Открыть файл, из которого стартовали.

13. Считать в буфер тело инфицированной программы, расположенное
в файле после тела вируса.

14. Создать на диске временный файл с расширением СОМ или ЕХЕ
(в зависимости от того, какой тип программ заражается).

15. Записать в этот файл тело программы из буфера.

16. Закрыть созданный файл.

17. Процедурой Ехес запустить созданный файл на исполнение -
выполнится инфицированная программа.

18. После завершения работы программы созданный файл удалить.

19. Вернуть управление в DOS.

Вирусы - это хорошая гимнастика для ума, хотя многие думают, что
написать вирус на языке высокого уровня весьма трудно. Это не совсем
так. Писать на языке Pascal довольно легко, правда величина получен-
ного кода вызывает благоговейный трепет.

Внедрение способом переноса

Вирусы данного типа размножаются следующим образом. Из инфициру-
емой программы от начала файла считывается часть кода, по длине рав-
ная длине вируса. На освободившееся место вписывается вирус,
а оригинальное начало программы переносится в конец файла. Отсюда
и название метода - "метод переноса". Есть и другие варианты. Иногда,
например, начало программы записывается в середину файла, а середина
переносится в конец, чтобы еще сильнее все запутать. Превосходство дан-
ного метода над другими описанными в том, что инфицированная про-
грамма исполняется в том же виде, в каком она была до заражения,
из файла с тем же именем и расширением. То есть программы, проверя-
ющие себя на предмет заражения вирусом, его не замечают. Корректно
исполняются и такие программы, которые ищут свои файлы конфигура-
ции с именами:

ИМЯ_И_ПУТЬ_К_САМОЙ_ПРОГРАММЕ +.INI

Недостаток данного метода проявляется при сбоях в работе компьюте-
ра. Если при исполнении инфицированной программы компьютер
"повиснет" или произойдет перезагрузка системы, инфицированная

программа окажется "чистой", то есть без вируса. Но, во-первых, "кто
не рискует, тот не пьет шампанского", а во-вторых, программы виснут
редко. Алгоритм работы такого вируса следующий:

1. Открыть файл, из которого получено управление.

2. Считать в буфер тело вируса.

3. Закрыть файл.

4. Найти файл-жертву.

5. Открыть файл-жертву.

6. Проверить файл на повторное заражение (здесь могут быть вариан-
ты, но чаще всего используется сигнатура).

7. Если файл уже инфицирован, перейти к пункту 3.

8. Считать в буфер из начала найденного файла фрагмент программы,
по длине равный телу вируса.

9. Записать в начало файла тело вируса из буфера.

10. Дописать в конец файла считанное начало программы из буфера.
Длина программы увеличилась на длину вируса.

11. Закрыть файл-жертву.

12. Открыть файл, из которого стартовали.

13. Считать в буфер начало инфицированной программы, расположен-
ное в конце файла.

14. Записать считанное начало программы поверх кода вируса в начало
файла.

15. Сократить файл до его оригинальной длины (то есть удалить часть
кода, по длине равную длине тела вируса, в конце файла).

16. Закрыть файл.

17. Процедурой Ехес запустить стартовый файл (ParamStr(O)) на ис-
полнение - выполнится инфицированная программа.

18. После завершения работы программы опять открыть стартовый
файл.

19. Записать в начало файла тело вируса, а оригинальное начало про-
граммы опять переместить в конец файла.

20. Закрыть файл.

21. Вернуть управление в DOS.