Как стать автором
Обновить

Комментарии 41

Ссылка на прошлую часть не работает. Начинать читать со второй части — ад перфекциониста.
Ссылка работает
Это я видимо правил ссылку в первой части и забыл «Опубликовать», исправил, спасибо.
НЛО прилетело и опубликовало эту надпись здесь
Рекомендую сделать содержание. Мне кажется Вам есть еще что рассказать!
НЛО прилетело и опубликовало эту надпись здесь
Я же на это и жалуюсь в конце, а ничего нового и нет. В плане исполняемого кода все замерло лет шесть-семь назад уже. Может какая-нибудь новая аппаратная платформа стартанет новый виток развития

Попробую в следующих статьях что-нибудь нестандартное обмозговать
НЛО прилетело и опубликовало эту надпись здесь
А можно ключ и не хранить в памяти и даже цикл шифрования улучшить используя известную задачу «банерокрутилка», в среде вирмейкеров известную как «PRIDE-технология»

>>даже если в реальности она в данной ситуации вернула бы ошибку…
Неа. Далеко не факт. Просто косят под какую-либо версию Windows. Зачем морочиться. Возвращать всега ОК, это путь в ад
НЛО прилетело и опубликовало эту надпись здесь
А кто заставляет использовать ключ целиком? Надо разделять на части ключи.
К примеру вы шифровали dword-ом, тогда надо сначала сформировать первый байт ключа и расшифровать первый байт очередного dword-а данных, затем перейти ко второму байту ключа и даннных и т.д. и т.п.
Клево, использование кодов возврата API для генерации — прикольно, спасибо!

Была еще интересная тема — ключ вообще нигде не хранился. Каждый раз при надобности ключ подбирался bruteforce-ом — вирус себе может позволить такую задержку, у него времени много, а вот эмулятору это очень напряжно.
Да. С помощью брутфорс-атаки получаем ключ было, к примеру virus.win32.crypto.a. Но исчезло ибо необязательно вычислять ключ ) Основная цель вируса «спрятать данные», а это не означает что обязательно нужно применять шифрование в чистом виде. Подойдет Любое обратимое преобразование данных, а код такого преобразования обфусцировать
Процессоры x86, к слову, имеют встроенные средства для генерации мусора (точнее будет сказать, для небольшого увеличения энтропии кода). ;-)

Умный эвристик таким «полиморфизмом», конечно, не обманешь; но иногда этим пользуются коммерческие ассемблеры и компиляторы (watermarking of generated binaries).
Точняк. Только в терминологии статьи инструкции анализирует не эвристик, а эмулятор.

Подумал еще, что наверное, на RISC архитектурах (регистров больше, а инструкций меньше), где свободы в генерации инструкций существенно меньше, метаморфные генераторы должны быть либо совсем тупыми и простыми (sse, mmx), либо генерировать весьма непростой в плане оценки «мусорности» микс.
Про код Guard@mail.ru пост будет? :)
Откройте тайну при чем тут блог mail.ru?
Всех, кто против минусуют, это понятно, но зачем это печатать?
Блог mail.ru просто потому, что мне хочется, чтобы она была в нашем блоге, а не где-то ещё.
Забавно, что эти идеи были релизованы в далеком 1989 году
в вирусе Mutant.
Еще забавней то, что тогда их мог реализовать гораздо больший процент программистов, чем сейчас :)
Пропаганда сработала, отпала детская мечта писать вирусы.
Если хочется написать вирус — напиши хороший crackme
зачем?
Спасибо за статью. С удовольствием прочитал, понастольгировал.
Да, как выше писали, ничего нового, но очень интересно написано про старый добрый 0xCC и его окружение с историческим развитием.
ЗЫ: думаю нужно где-то в начало вставить небольшие вставки из УК под спойлер. Ну, так сказать, предупредить…
ЗЫЫ: можно еще в таком же стиле написать про сетевую живность 8)
А вот в сетевой живности я как раз «плаваю», увы. Закончил на последних сетевых эксплойтах под 2000, после этого занимался только движками и исполняемым кодом. Следующая статья скорее будет про какую нибудь веселую криптографию, или опять же про исполняемый код, но уже в нестандартных моделях — шеллкодах, стеганографии и т.п., пока не решил.

А про УК под спойлер… На основе этой статьи движок не напишешь, там возни огромный вагон, так что те, кто уже писал, сами всё знают, а те кто не писал, тем еще долго возиться, и по любому придется столкнуться с ресурсами, где всё станет понятно
Спасибо автору. Статьи замечательные во всех отношениях.
BoogerWooger
Кстати, а не хочется ли написать про антивирусы? О них же тоже можно многое рассказать. Как устроен эмулятор к примеру? Правда ли что это действительно «песочница» или все-таки часть кода на живом процессоре исполняется? Как только люди узнают ответ на предыдущий вопрос у них рождается другой: А можно ли «убежать» из «песочницы»? Другими словами, антивирусные технологии тоже весьма интересная область. Понятно, что они всегда будут «догоняющей» стороной, но тем не менее задач любопытных там достаточно!
Автор, по-моему вы путаете понятия «полиморфизм» и «метаморфизм».

Полиморфные вирусы
имеют статический зашифрованный код и мутирующий расшифровщик. Этот расшифровщик может содержать мусорные инструкции и другие трюки, но суть в том, что имеется статический код, который антивирусы могут обнаружить методом эмуляции, как только он появится в памяти расшифрованным.

В противоположность этому, у
метаморфных вирусов
мутирует не только расшифровщик, но и вообще весь исполняемый код. В этом случае даже пропадает необходимость его шифрования, т.к. он мутирует. Обнаружить метаморфный код методом эмуляции невозможно, так как не наступает момент, когда в памяти формируется нечто такое, что неизменно от экземпляра к экземпляру такого вируса. Ну, разве что, данные, но их тоже можно как-то проредить и спрятать.

Примеры живых метаморфных вирусов имеются, и сдерживает это явление только то, что создание метаморфного кода пока еще очень трудоемко, нет инструментальных средств, облегчающих это. Ну и у многих моделей метаморфов размер кода растет с каждым поколением. В код каждый раз добавляется мусор, в придачу к мусору, который был добавлен в прошлый раз. Если же один мусор заменяется другим — значит мусор детектируется в алгоритме вируса автоматически, но это же подвергает метаморф той опасности, что в целях анализа или детектирования этот же алгоритм чистки мусора может быть извлечен из вируса и использован враждебными ему силами (разработчик антивируса или сам антивирус).
Автор ничего не путает ;)
Вы безусловно правы в приведенной Вами терминологии и совершенно верно обозначили эти различия.

Рассмотрим слова из текста:
Полиморфизм для компьютерных вирусов означает, что каждый новый зараженный файл содержит в себе новый код вируса-потомка

Применяется фраза «новый код». Но какого он размера ни слова! Может автор как раз и имел ввиду код дешифровщика, а может действительно вирус целиком. Так что автор просто не уточнил размерность.
Да, я знаю, что многие трактуют это так: полиморфный движок — это аналог упаковщика (декриптор + зашированный буфер), а метаморфный — полная генерация нового кода из ПОЛНОГО старого кода. Но метаморфизм в таком чтении реально нежизнеспособен — вы правильно заметили, что размер кода будет расти, проблемы с его работоспособностью будут расти также, также будет расти и возможность более-менее эффективно инфицировать файлы. Также очень правильно подмечено про «антивирус-в-вирусе» — черт, надо было про это в статье написать, спасибо.

Я, как то так сложилось, всегда классифицировал немного по другому — все рассматриваемые вирусы имеют декриптор + зашифрованное тело и являются полиморфами (т.к. зашифрованный буфер уже меняется от поколения к поколению).
И, только, если используется генерация кода (изготовление инструкций на основе базового кода) — то я считаю движок метаморфным, без разници какая часть кода была сгенерирована автоматически, декриптор или весь код.

Ну а как правильно и абсолютно точно классифицировать движки, увы, никто не скажет, я пытался найти много раз. Даже лингвистика не особо помогает. С «поли» понятно: если есть конечное число вариантов декриптора — это «поли». Но очень уж расплывчатый смысл у приставки «мета».

P.S. EvilsInterrupt, спасибо, да, я имел в виду только декриптор. В этой статье после рассмотрения первого полиморфного вируса можно вообще везде, где упоминаются манипуляции над кодом, иметь в виду именно небольшой код декриптора, а не весь вирус целиком
все рассматриваемые вирусы имеют декриптор + зашифрованное тело и являются полиморфами (т.к. зашифрованный буфер уже меняется от поколения к поколению).

Пусть зашифрованное тело и меняется, но если не меняется расшифровщик — то такой вирус не является полиморфным, и его можно детектировать по сигнатуре. Именно этим отличаются полиморфные вирус от «обычных»: последние могут быть детектированы по сигнатуре (хотя бы короткой программы-расшифровщика), а первый — нет.

В русской википедии есть некоторая путаница по этому поводу, а в английской сказано четко:
Encryption alone is not polymorphism. To gain polymorphic behavior, the encryptor/decryptor pair are mutated with each copy of the code. This allows different versions of some code while all function the same


И именно в таком смысле понятие «полиморфный вирус» использовалось с 1990х годов в нормальных книгах по вирусам, таких авторов, как Лозинского и Касперского. Ранний Касперский, правда, использовал другой термин — «вирус-призрак», но определял его так же. Цитата: "… шифрование тела вируса и модификации программы-расшифровщика". Простые же случаи шифровки со статическим расшифровщиком никто вообще не рассматривал — они с точки зрения обнаружения ничем не отличаются от незашифрованных вирусов.

С распространением такого способа детектирования, как «эмуляция + сигнатура», борьба с полиморфными вирусами перестала быть сложной задачей, и тогда авторы вирусов выдали новое изобретение — метаморфизм, которое является качественным скачком по отношению к полиморфизму. Метаморфный код нельзя детектировать по сигнатуре, хоть с эмуляцией, хоть без нее. Используются другие методы, такие как анализ поведения, так как ни за что больше тут не зацепишься.

Но метаморфизм в таком чтении реально нежизнеспособен — вы правильно заметили, что размер кода будет расти, проблемы с его работоспособностью будут расти также

Боюсь, в этом вы ошибаетесь. Указанные трудности не являются принципиальными для метаморфного кода. Например, метаморфный движок можно создать на базе виртуальной машины, байт-код которой будет меняться от поколения к поколению хотя бы простой перестановкой. Ну а сама виртуальная машина является достаточно простой конструкцией, чтобы ее можно было легко «замусоривать», и «чистить», наподобие того, как мутируют расшифровщики в полиморфных вирусах.

Также рекомендую почитать статьи анг. википедии «Polymorphic code» и «Metamorphic code», чтобы четко увидеть разницу.
Ок, приму к сведению, спасибо
такого способа детектирования, как «эмуляция + сигнатура»

Не совсем понял о чем Вы. Не могли бы сформулировать другими словами?
Так в статье же описано. Целый раздел: «Наш ответ Чемберлену: эмуляция». Если кратко, то антивирус позволяет коду вируса исполняться в виртуальной машине, и следит за состоянием памяти этой машины. Полиморфный вирус расшифровывает свой код (который у полиморфных вирусов не мутирует, а только шифруется) и помещает его в память. Тут-то антивирус и детектирует этот код по сигнатуре.
В разделе про Чемберлена я имел в виду именно это — доэмулировать до того момента, как в памяти появятся данные (или код) которые не меняются от поколения к поколению, и сравнить по сигнатуре, т.е. именно то, что написал MichaelBorisov.

Второй подход, когда я бегу по коду декриптора, «сворачиваю» его к некоторому эталонному, выбрасываю мусор, и потом сравниваю уже этот нормализованный код (тут моей задачей будет являться привести все варианты сгенерированного кода к единому эталонному) — менее универсален, намного быстрее, и требует более глубокого изучения кода генератора. Про это я уже не стал писать, ибо общих алгоритмов там практически нет — все зависит от генератора.

По идее, это можно тоже назвать сравнением по «кодовой» сигнатуре, но тут я опять могу попасть впросак с классификацией
Все уже было предусмотрено — для противодействия эмуляции
вирус стартовал или не стартовал случайным образом.
И некоторые экземпляры стартовали очень редко.
А по-поводу ZMist'оподобный движков что скажете?
Там разборка оригинального кода .exe на инструкции и перемешивание их с вирусными.
Я бы лучше попросил Win95/Zmorph или Win95/Zperm. Это поделки того же автора
Mistfall мне ну очень-очень понравился, по моему даже написал на нем что-то. Но юзать его по-моему нужно только вкупе с методами сокрытия точки входа. Если просто влепить переход на код вируса прямо в EP, то эмулятор спокойно пойдет по нему и наберет себе характерных данных для детекта. Такие движки это в общем-то очень добротная доработка инфектора. Если хорошо скрыть точку входа, то это очень круто, найти что-то в файле будет очень проблематично. А если не заморачиваться, то эмулятор спокойно разгрызет и Mistfall.
Кстати, рекомендую к прочтению про детект мусора все рассматривается на базе Zmist-вируса. Все по-английски, но достаточно развернуто!
Зарегистрируйтесь на Хабре, чтобы оставить комментарий