Метаморфизм (часть I) — Архив WASM.RU
Это моя очередная статья, точнее уже третья по счету после 'Heuristic Technology' и 'Viric life and die theories', вышедших в DDT#1. Итак, приступим.
[ Введение - концепция метаморфизма ]
Хорошо, начнем с основ. Для тех, кто еще не знает что такое метаморфизм, скажу, что суть этой техники заключается в ПОЛНОМ изменении тела вируса без изменения его функциональности. Проще говоря, это то же самое, что и полиморфизм декриптора, но примененный ко всему телу вируса.
[ Некоторые идеи, факты и мысли ]
Ладно, ладно, я понимаю, что некоторые вещи не совсем ясны. Если Вы думаете, что метаморфизм это просто, то ошибаетесь. Я считаю, что для реализации этой техники нужно обладать высоким IQ, потому что Вы должны в уме просчитывать все возможные ошибки и быть терпеливым, иначе Вы никогда не допишете этот чертов вирус.
У нас есть одна большая проблема - как узнать состояние регистров процессора в результате выполнения какой-либо команды. Это очень просто в случае любого регистра, кроме ESP... Ладно, ESP мы обсудим в другой раз (не здесь), а сейчас поговорим об остальных регистрах. Решить нашу проблему можно двумя способами:
- узнавать значения регистров в тот момент когда мы модифицируем код
- эмулировать выполнение кода
Реализовать первый метод довольно просто как под DOS, так и под Win32. Просто представьте себе, что код Вашего вируса способен генерировать любую операцию (например, XOR) в процессе морфинга. Причем мы можем использовать различные пути для достижения требуемого результата, и можем, к примеру, делать тот же XOR с переменной которая содержит в себе значение нужного нам регистра вместо того чтобы использовать сам регистр. Это справедливо и для DOS и для Win32.
Второй способ является более продвинутым, но его реализация под DOS и Win32 очень сильно отличается. В случае DOS это выглядит проще, поскольку мы можем просто установить свой обработчик int 1 и оттрасировать весь код вируса, зная значения регистров после каждой команды и в то же время генерировать абсолютно отличный код для выполнения одной и той же задачи. Под Win32 все кардинально меняется, потому что у нас нет доступа к нашему любимому int 1. На данный момент нет надежного метода трассировки под Win32, хотя, скорее всего, это можно реализовать с помощью многозадачности (используя потоки) и эмуляции кода в момент исполнения. Но это только предположения - я не проверял это (пока).
У меня также есть еще один способ как обойти нашу проблему, но я расскажу о нем позже.
[ Простой и продвинутый метаморфизм ]
Что ж, я не уверен, правильно отражает ли название этого подзаголовка смысл того что я хочу Вам поведать, но по крайней мере, я надеюсь на это. Я имею в виду три возможных реализации метаморфизма:
- замена регистров (с использованием таблиц)
- мутация кода
- внутренний дизассемблер
Первое можно определить как простой метаморфизм, поскольку мы всего лишь изменяем имена регистров в теле вируса, не более того. То есть шанс, что антивирус обнаружит наше творение очень высок и для него это будет простой задачей если он использует маски. У нас есть пример реализации такого способа метаморфизма в вирусе моего друга Vecna, написанного им, когда он был членом группы 29A, который он назвал RegSwap.
Мутация кода гораздо мощнее, чем предыдущий метод, но для достижения того же результата он использует другую технику - вместо таблиц в него встроен небольшой дизассемблер. Пример такого вируса можно увидеть в ZCME и AZCME, созданных ZOMBiE (также из 29A). Но все же это также простой тип метаморфизма.
Но нирвана наступает, когда мы используем дизассемблер не просто для обмена регистров. Мы можем использовать его, для того, чтобы дизассемблировать все тело вируса и таким образом узнать какое значение регистров, нам необходимо в данном месте и вставить на это место различные математические операции, после выполнения которых мы получим нужное нам значение. Это считается очень продвинутой техникой вследствие сложности реализации и качества результатов. Я думаю, что такой тип метаморфизма является одним из методов для создания наиболее трудно обнаруживаемых вирусов.
Всю прелесть метаморфизма можно ощутить, если представить себе объединение мутации кода (замена регистров) с внутренним дизассемблером и различными путями вычисления нужного значения, используя разнообразные математические операции. Я считаю, что в этом случае мы будем иметь наивысшее качество выходного кода.
Но все еще остается один метод, который до этого я не описывал. Я не делал этого раньше, потому что это тема для отдельного разговора, так как это основной стержень моего проекта Itxoiten.
[ Проект Itxoiten ]
Я не знаю, размышлял ли кто-либо на эту тему до меня, (я считаю, что почти все, что можно придумать уже придумано, но все же...) но я хотел бы изложить свою идею.
Что значит Itxoiten? Itxoiten - это слово происходит из euskera (баскский язык) и означает ждать. И это все, что Вам остается делать, пока я не закончу свой проект
Это проект с использованием метаморфизма и, вероятно, мой первый вирус с данной техникой получит это имя. Хорошо, пока Вы не вышли из себя, я изложу свои размышления насчет того, что я собираюсь делать или, по крайней мере, основную концепцию.
Мой вирус будет иметь генератор кода, но не такой, как был описан в 'Viric life and die theories'. Новый генератор кода в первую очередь должен иметь интерпретационную структуру (interpretation of a structure - ITX), и генерировать код, обозначенный в ней, причем делать это всеми возможными путями. Вы можете себе представить это как карту дорог, и Вы вольны выбирать множество дорог для достижения цели. Но только представьте себе, что Вы можете поменять саму карту. С тем же самым движком, но другой ITX-структурой код, созданный нашим генератором будет абсолютно другим. Но на самом деле все не так просто, как я Вам здесь расписал. Допустим, замена таблицы - довольно простая операция (в принципе, замена на лету также проста). Вся сложность заключается в создании самой ITX-структуры. Она должна быть достаточно мощной, чтобы обрабатывать все возможные ситуации, в которых может оказаться Win32-вирус в процессе своей эволюции (да, я собираюсь создавать проект itxoiten для платформы Win32). К примеру, использование SEH потребует нестандартной таблицы, поскольку код для работы с SEH является не совсем обычным (использование регистра FS и пр.). Но подумайте обо всех возможных операциях Win32-вируса (Ring-3), и Вы увидите, что большинство из них связано с командой PUSH. Мы можем использовать это в своих целях, играя со значениями регистров, а затем толкая в стек тот или иной регистр. Или занесение значения в стек напрямую, но предварительно поиграв со значением ESP. А еще лучше и то и другое вместе. Представьте, какие возможности открываются перед нами, если применить это ко всему коду вируса.
Рисунок слева (или где у Вас там - прим. пер.) иллюстрирует некоторые основные действия нашего генератора.
- Интерпретация. Генератор анализирует ITX-структуру соответствующим образом, а также инициализирует все необходимые переменные.
- Морфинг. Генератор использует информацию, полученную из структуры, и генерирует новое тело нашего вируса опкод за опкодом.
- Исправление ошибок. Генератор исправляет все смещения для CALL'ов, безусловные переходы, условные переходы и т. д., и производит поиск возможных ошибок в сгенерированном коде.
- Экстернализация. Означает запись свежеиспеченного вируса в тело хозяина (не уверен - прим. пер.), временный файл или куда-либо еще.
Вот базовые принципы. Некоторые вещи могут измениться в будущем, но в основном все будет так, как я изложил. Я буду работать над форматом ITX-структуры, как и над генератором и надеюсь, что скоро получу нечто определенное.
[ Полиморфизм против метаморфизма ]
Но, наверное, в вашем мозге возник другой вопрос... Не проще ли вместо метаморфного вируса (учитывая все усилия, которые придется приложить) создать хороший полиморфный. Первое о чем подумают многие - это то, что метаморфики мощнее (это действительно так), но Вам также может показаться, что это слишком медленно, и, помимо изменения размера (что можно также достичь в хорошем полиморфном движке) не имеет почти никаких преимуществ. Что ж, с помощью полиморфизма (естественно я говорю о полиморфизме в стиле Mental Driller'а) Вы поимели AV'еров. В конце концов, метаморфизм это всего лишь полиморфизм, примененный ко всему телу вируса, как я и говорил в начале этой статьи.
Это должно быть более мощным, чем обычный полиморфный движок, и я все еще хочу создать метаморфный вирус, по крайней мере, я попытаюсь. Мне все равно, поймают ли AV его быстрее чем вирус с моим последним полиморфным движком, но мне будет приятно осознавать, что метаморфного зверя создал я, а не кто-либо другой
[ Напоследок ]
Я по настоящему надеюсь, что Вы получили удовольствие читая этот небольшой документ. Я понимаю, что он мог показаться Вам скучным без практических примеров, которые я обычно вставляю в свои Путеводители по написанию вирусов, но иногда мой мозг подсказывает мне делать нечто похожее на эту статью.
Я всегда думал о метаморфизме как об основном оружии против AV'еров. Даже учитывая плохие стороны этой техники, это по-прежнему один из наших главных козырей.
Если у Вас есть какие-либо вопросы, советы или замечания просто напишите мне.
From here to eternity, Billy Belcebu/iKX. © Billy Belcebu / Xine#4, пер. v0id
Метаморфизм (часть I)
Дата публикации 9 мар 2003