Полиморфные макровирусы радикально изменяют свой код с каждым новым шагом «размножения», что позволяет им избегать обнаружения антивирусными сканерами. Это может достигаться изменением ключа шифрования или самого криптографического механизма, изменением последовательности инструкций, или другими подобными изменениями в поведении вируса. Данная статья - первая из двух частей, в которых будет приведен краткий обзор использующихся полиморфных стратегий в мире макро-вирусов. Первая статья, в основном, посвящена некоторым более ранним примерам полиморфных технологий.
Полиморфные макровирусы радикально изменяют свой код с каждым новым шагом «размножения», что позволяет им избегать обнаружения антивирусными сканерами. Это может достигаться изменением ключа шифрования или самого криптографического механизма, изменением последовательности инструкций, или другими подобными изменениями в поведении вируса. Данная статья - первая из двух частей, в которых будет приведен краткий обзор использующихся полиморфных стратегий в мире макро-вирусов. Первая статья, в основном, посвящена некоторым более ранним примерам полиморфных технологий.
Первый вопрос, который приходит на ум – что именно классифицирует макровирусы, как полиморфные? Большинство макро-вирусов очень примитивны и не относятся к полиморфным. Однако есть несколько более сложных экземпляров зашифрованных вирусов, некоторые из которых даже имеют полиморфное кодирование.
Первым, еще детским, шагом к полиморфизму был Outlaw. Фактически, его даже нельзя назвать полноценным полиморфом. Сам вирусный код не изменялся ни на байт, менялось только название несущего макроса. Поэтому, Outlaw полиморфом не являлся, хотя его первоначально и отнесли именно к этому классу вирусов. Все дело в том, что ранние (преимущественно, WordBasic-основанные) защитные программы, созданные для борьбы с макровирусами, проверяли только имя макроса (примитивно, но именно так и обстояло дело!) и подобная смена названия макроса позволяла довольно долго водить за нос антивирусы. Позже, когда ранние антивирусы сменились более совершенными, проверяющими код или логику программы, обнаружилось, что Outlaw не является полиморфом, а относится к обычным, неморфическим макровирусам.
Далее последовал шаг, который и по сей день использует большинство вирусов - вставка всякого мусора в вирусный код. В самом простом случае, используется вставка строк, содержащих случайные комментарии. Семейство WM97.Class - хороший пример этой техники. В этих вирусах каждая линия макрокода заполнена случайными комментариями, обычно содержащими различные комбинации имени пользователя, даты, установленных принтеров и т.д. Вот пример подобного куска кода из зараженного файла:
Sub Document_Close() 'SiR DySTyKSDINFECTEDINFECTED.DOC5/22/2001 6:04: 'SiR DySTyKSDINFECTEDINFECTED.DOC5/22/2001 'SiR DySTyKSDINFECTEDINFECTED.DOC5/22/2001 |
А вот этот же фрагмент в другом зараженном файле:
Sub Document_Open() 'SiR DySTyKSDGOAT1GOAT1.DOC5/22/2001 6:04:16 AM 'SiR DySTyKSDGOAT1GOAT1.DOC5/22/2001 'SiR DySTyKSDGOAT1GOAT1.DOC5/22/2001 |
Эта методика привела к совершенствованию антивирусов – в ответ на нее, в антивирусные сканеры была добавлена технология игнорирования строк-коментариев при просмотре кода.
Старый вирус FutureNot состоял из двух модулей - AutoOpen и FileSave. Последний модуль и отвечал за заражение новых документов, сохраняясь в одном из шаблонов и, таким образом, не присутствуя непосредственно в самих зараженных документах. Первоначальный макрос AutoOpen сохранялся в глобальном шаблоне со случайно выбранным названием из 5 символов. Дополнительно, вирус вставлял в свой код в случайных местах текст "1 Gen". Это служило для «автора» своего рода «знаком поколения» - число таких комментариев соответствовало числу зараженных компьютеров по текущей цепочке инфицирования.
С каждым шагом инфицирования запрашивался макрос FileSaveAs и вирус несколько видоизменял свой код. Добавлялись случайные числа в виде комментариев и добавлялись дополнительные пустые строки. Через несколько стадий макрос напоминал следующий фрагмент:
dlg.Format = 1 |
Но и этот вирус стал бессилен, когда антивирусные сканеры стали предварительно проводить процедуру «нормализации кода» - комментарии удалялись из кода, как и пробелы и пустые строки. После этих процедур все экземпляры кода из самых разных цепочек и поколений полиморфического вируса выглядели абсолютно идентично. Это и позволяло идентифицировать макровирусы, наряду с определением контрольных сумм нормализованного кода подобных макровирусов.
Но все равно вскоре появились макровирусы, использующие вставки всякого мусора, которые смогли обойти существовавшие процедуры нормализации кода. Для примера можно привести макровирус Polymac.A, также известный под «кличкой» Chydow.A, который перемешивал свой значимый код (выделен зеленым шрифтом) с произвольно составленными ничего не значащими в большинстве случаев командами:
Loop While DjFeUOL2kkwJCIE6 < 44: End If Next For LU1VyC6 = 8 To 54 Step 3: If dDGlb7 <> Rnd * 28 Then PjN7FDkGwkU7 = 9 Do Loop While PjN7FDkGwkU7 < 21 End If: Next ActiveDocument.Close: TzLPGXn3lZ6 = 1 |
В дополнение к вышеописанному, в данном вирусе применилась достаточно революционная по тем временам новинка – в командах заменялось написание некоторых символов – с заглавных на строчные и наоборот. Ну и, к тому же, вирус использовал опыт предшественников и, особенно в первых модификациях, активно использовал вставку комментариев в код. Надо признать, что различные экземпляры данного вируса даже в одинаковых поколениях были крайне непохожи друг на друга. Вирус был достаточно успешным и распространенным, но только до тех пор, пока в антивирусах в процедурах нормализации кода не были учтены все применяемые новинки.
Здесь надо отметить, что хоть существовавшие к тому моменту традиционные технологии нормализации кода в большинстве случаев и не позволяли поимку полиморфных макровирусов, но иногда могли и сработать - в случае выделения характерных фрагментов. В частности, в нашем примере, программистам требовалось бы декомпилировать код и выделить фрагменты вируса из остального месива мусора и частей других программ. Затем требовалось бы запустить процесс размножения и изучить изменение строк кода с каждым шагом, после чего запустить анализатор кода и выявить во всех копиях вируса из всего несущественного цифрового хлама следующие строки
ActiveDocument.Save |
Все, этого было бы достаточно для сканеров и подсчета контрольных сумм. Но, как вы, конечно, понимаете, это – отнюдь не быстрый процесс, и могло пройти несколько недель (а то и месяцев!), прежде чем был бы выявлен уникальный, характерный для данного макровируса отпечаток кода. И все это время вирус абсолютно беспрепятственно размножался бы по всей планете.
Вскоре вирусы научились генерировать не только случайный цифровой мусор, но и части собственного значимого вирусного кода. Этот тип вирусов известен как Code Collectors. Примером такого типа вирусов может служить вирус Hope.AF. Его особенностью являлась способность альтернативной замены собственных фрагментов – функций и переменных. К примеру, объект ActiveDocument мог быть представлен в теле вируса случайным образом несколькими способами:
A(1) = "ActiveDocument" A(2) = "Word.ActiveDocument" A(3) = "Application.ActiveDocument" A(4) = "Word.Application.ActiveDocument" A(5) = "System.Application.ActiveDocument" A(6) = "AddIns.Application.ActiveDocument" A(7) = "Bookmarks.Application.ActiveDocument" A(8) = "Documents.Application.ActiveDocument" A(9) = "Word.System.Application.ActiveDocument" |
При каждом копировании производился случайный выбор одного из вариантов:
Documents.Application.ActiveDocument.SaveAs FileName:=Application.ActiveDocument.FullName |
или:
ActiveDocument.SaveAs FileName:=Word.Application.ActiveDocument.FullName |
Фактически, логика программы от этого не менялась, происходили лишь небольшие, но многочисленные флуктуации относительного первоначального варианта. Но именно это и не позволяло привести код в единый нормальный вид или выделить характерную строку (хотя, в нашем примере можно выделить длинный фрагмент, но для этого необходимо предварительно провести декомпиляцию).
Вирусы данного класса являлись интересной разработкой, требующей от разработчиков антивирусных программ немалых затрат времени и ресурсов. Но, в итоге, все рано в каждом конкретном случае находились достаточно длинные фрагменты, пригодные для CRC-детектора.
Наверное, читая эту статью и встречая описания различных способов изменения кода, вы уже сами обдумали этот самый очевидный вариант изменения кода – шифрование. Действительно, вся история полиморфных вирусов неразрывно связана с кодированием. Еще в славную эпоху седых 286-ых и 386-ых компьютеров кодированные полиморфы уже вовсю бегали по планете.
Конечно, мысль о кодированных макровирусах пришла в голову не только вам. Многие макровирусы используют статичное шифрование частей вирусного кода, применяя для этого, как правило, какой-нибудь простенький алгоритм (XOR или Shift). Ключ шифрования может изменяться от поколения к поколению, но, как правило, не претерпевает сильных изменений. Здесь в качестве примера можно привести макровирус Antisocial.F, в котором механизм кодирования и ключ к нему хранится в комментариях в коде. В процессе размножения код меняется, но также выделен в комментариях к каждому конкретному экземпляру вируса.
В принципе, сам код подобных вирусов, за исключением комментариев, для каждого вируса не меняется, и, теоретически, его легко выявить CRC-детекторами. Существует небольшое затруднение – предварительно код вируса надо расшифровать. При использовании примитивных механизмом кодированиях затруднение, действительно, небольшое, так как в комментариях находится и ключ шифра. Но в большинстве случаев процесс расшифровки является очень тяжелым и длительным по времени процессом, и не существует единого легкого способа получения макрокода. Но только после того, как разработчикам антивирусов удается изучить механизм кодирования, антивирусы становятся способны проводить расшифровку кода и выявлять подобные вирус. А до той поры применяется другой путь – защитные программы эмулируют запуск программы в «sandbox» и проводят изучение ее действия. На основании этого, антивирусные программы пытаются выяснить, является ли данный код вирусом или нет.
Разнообразные вирусы, использующие смену названий, были еще одной интересной попыткой создания полиморфного вируса. Самыми известными вирусами этой серии было семейство IIS. Так, IIS.I использовал различные методики смены названий и функций. По-видимому, автор вируса предпринял попытку изменять все обозначения, используемые в вирусном коде, но по каким-то неизвестным причинам (программные недоработки или элементарная забывчивость) не смог изменить часть из них. Вирус генерирует разнообразные имена, которые используют символы ASCII кода (от 130 до 204). Получаемый код труден для чтения и восприятия, как в приведенном примере:
If Left(+ÿ¦, 1) = "'" Then «ÿæ¦-º+áâ+¦¿+ = «ÿæ¦-º+áâ+¦¿+ + 1 Pô½-Å-+-ù-Åè+¦º¢+òòñ(«ÿæ¦-º+áâ+¦¿+, 1) = Mid(+ÿ¦, 2, Len(+ÿ¦)) |
Вирус хранит свой код в глобальном шаблоне во временных строках буфера. Там же содержится массив разнообразных имен – старых и новых, которые могут встретиться в процессе мутации. Имена выбираются из набора, хранящегося внутри вирусного кода. Существует целая серия строк-комментариев, в которых хранятся эти постоянно изменяющиеся обозначения, с соответствующими инструкциями к ним. После перебора всех имеющихся случайных обозначений, вирус генерирует новые. Новые обозначения имеют случайную длину (от 2 до 22 символов) и состоят из случайных символов ASCII с кодом в пределах от 130 до 204. Новые имена также хранятся в массиве в случайном месте
В отличие от других полиморфов, IIS.I даже осуществлял проверки для избежания конфликтов названий. Проверка проводилась по двум причинам: (обе могут вести к ошибке):
Если обнаруживалось несоответствие одному из этих требований, вирус решал проблему очень просто - генерировал новые случайные имена (а в некоторых версиях изменяя или добавляя один из символов в названии).
После того, как вирус проводил проверку и решал, что новое обозначение годится, вирус начинал поиск в буфере строчка за строчкой. Строки, содержащие свой код, вирус отмечал специальными метками из ASCII таблицы с символами менее 65. Как только вирус находил свою старую переменную, он заменял ее на новую, после чего процесс продолжался.
К полиморфным этот вирус относили только потому, что антивирусные сканеры кода или p-кода не способны были его обнаружить. Для обнаружения данного типа вирусов использовался поиск устанавливаемых вирусом меток, после чего вирус поражался его же оружием – найденные компоненты заменялись на неизвестные вирусу переменные:
If Left(var_1, 1) = "'" Then var_2 = var_2 + 1 var_3(var_2, 1) = Mid(var_1, 2, Len(var_1)) |
Но тут всегда существовала опасность, что вирус мог и не записывать свой код в пустые модули, а дописывать в уже существующие (примером являются Win32 вирусы EPO viruses). В этом случае метка переменной вируса могла начинаться не с, допустим, var_1, а с var_234 и даже var_7458. В таком случае сканер должен искать четкое соответствие между названием переменной и ее нахождением в макрокоде и удалять исключительно переменные, имеющиеся в базе данных вируса. Здесь очень важно, с одной стороны, не пропустить вирусных компонентов, а с другой, очень осторожно подходить к их замене, иначе результатом будет потеря огромных массивов данных и сбой в работе основной программы, что никак не допустимо для антивирусных программ.
В этой статье рассмотрены ранние этапы создания полиморфизма в вирусах, эволюция полиморфных макровирусов, используемые вирусные технологии и их методы обнаружения. В следующей статье будут рассмотрены первые серьезные макровирусы, которые действительно сумели достичь полиморфизма, их эволюция до настоящего времени, наблюдающиеся пути дальнейшего развития, а также метаморфы – вирусы будущего.
Ладно, не доказали. Но мы работаем над этим