Pull to refresh

Comments 41

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

Попробую в следующих статьях что-нибудь нестандартное обмозговать
UFO just landed and posted this here
А можно ключ и не хранить в памяти и даже цикл шифрования улучшить используя известную задачу «банерокрутилка», в среде вирмейкеров известную как «PRIDE-технология»

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

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

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

Подумал еще, что наверное, на RISC архитектурах (регистров больше, а инструкций меньше), где свободы в генерации инструкций существенно меньше, метаморфные генераторы должны быть либо совсем тупыми и простыми (sse, mmx), либо генерировать весьма непростой в плане оценки «мусорности» микс.
Откройте тайну при чем тут блог 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.
Sign up to leave a comment.