[TulaAnti&ViralClub] PRESENTS ...
MooN_BuG, Issue 7, Sep 1998 file 003
- S P R E A D E R -
Описание технологии
by FRiZER
Идея: Alternative Coder // TAVC
Реализация и отлов части глюков: Thesaurus // TAVC
Доведение до ума и отлов оставшихся глюков: FRiZER // independent
Вирус содержит таблицу вида
<смещение команды/блока команд>, <длина команды/блока команд>
Hаходя очередной .com-файл, он ищет в нем соответствующие куски
кода и оформляет таблицу. Если участок кода не найден, то он
дописывается в конец заражаемого файла. Только после всего этого
первые n байт жертвы записываются в конец программы (n = размеру
части вируса, включающего таблицу комманд). Таким образом, не зная
первоначальную длину файла, полностью удалить вирус из него нельзя,
т.к. невозможно различить конец старого файла и начало участка не
найденых блоков кода, т.е. после излечения в конце файла останется
болтаться кусок мусора.
Также для различных файлов будет различное приращение длины при
заражении.
Дальше. Вирус не имеет подозрительного кода (это не относится к
только что откомпилированному исходнику ;) - он разбросан по всему
телу жертвы. Есть только обработчики Int 1h и Int 3h. В каждом блоке
(в процессе выполнения кода вируса) первая команда генерирует Int 1.
Обработчик смотрит на адрес возврата и сравнивает с
<смещение>+<длина>. Если не равны, то трассировка прекращается,
после блока ставится breakpoint и он запускается. Иначе - блок
состоит из одной команды, переходим к следующему. Hомера блоков
индексируются регистром bp. Соответственно, меняя bp, можно делать
переходы из одного блока в другой, циклы и т.п. Команды 'Int xx' не
трассируются, а эмулируются (см. исходник). В зависимости от
заражаемого файла, к нему приписывается разное количество кода.
Почти наверняка CD 21 ни к одному файлу приписано не будет, т.к.
есть в программах.
В вирусе полно отладочной информации (выключаемо), в которой не
сложно разобраться.
основной файл - main.asm
файл myxa.bat - для генерации жертв
- без параметров источником будет являться test.coz
- если указать имя файла, то он его сделает жертвами.
extrcode.asm - выделяет код вируса (который в code.inc) в отдельный
файл в целях отладки.
Если есть желание написать собственный вирус, использующий эту
технологию, то нужно помнить о некоторых ее особенностях:
1) Если на метку передается управление с помощью "lea bp,@label", то
нужно в code.inc после label: в первой же метке @m??? ставить
nop, причем команда nop не должна быть начало блока.
2) Вызов прерывания ( CD?? ) не должен быть первой командой в блоке,
иначе команды, следующие за CD?? выполнятьсе не будут. Нужно
либо ставить CD?? в середину блока, либо просто как отдельную
команду.
3) В блоке, в отличие от команды, "lea bp,@label" не одно и то же,
что jmp label => команды в блоке, следующие после "lea bp,@label"
будут выполняться до окончания блока.
4) Всяческие циклы и другие вещи, выполняющиеся по многу раз, лучше
делать отдельным блоком. Хоть шансов найти такой блок в жертве
практически никаких, зато хоть вирь тормозить не будет.
5) При выполнении блока генерации таблицы команда после блока, где
она происходит, заменена на int3 (CCh), и, следовательно, в
следующем поколении там будет уже не оригинальная команда, а int3
с остатками команды. Это учтено в блоке создания таблицы, так
что, при создании своего виря на основе этой технологии, лучше
использовать блок начинающийся с метки infect_by_next до метки
stop_infect, либо учитывать это и решать проблему самостоятельно.