Перейти к содержимому

Как работает криптор

  • автор:

Криптор

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

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

Различают два вида крипторов: обычный и полиморфный. Обычные крипторы имеют статическую сигнатуру декриптора-расшифровщика, а у полиморфных данная сигнатура динамическая, и каждый раз при компиляции они (файлы, упакованные такими крипторами) выглядят по иному.

Как же работают крипторы? Все довольно просто: берется исходный оригинальный файл вредоносной программы, затем данная программа шифруется каким-либо криптором, при этом в начало вновь полученного файла записывается код для расшифровки программы. Чтобы было более понятно, объясним на простейшем примере: берется некая троянская программа и архивируется архиватором WinRAR, причем архивируется не просто так, а с парольной защитой. После выполнения данных действий ни одна антивирусная программа не сможет добраться до данного трояна, так как расшифровывать пароли к архивам они не умеют.

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

Вообще, по типу доступности крипторы подразделяют на Публичные (Public) и Приватные (Private).

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

Со вторым же видом все не так просто. Эти крипторы доступны только избранному сообществу людей либо же их можно приобрести за вполне реальные деньги (электронные в основном). Данный тип крипторов является более устойчивым к проверке их антивирусами благодаря как постоянно совершенствующимся алгоритмам шифрования, так и постоянно обновляемому стабу. Что такое стаб, спросите Вы? Ответим. Стаб – та часть кода криптора, которая используется для расшифровки данных вредоносной программы, которая и была зашифрована данным криптором.

Часто в раделах форумов, где представлены крипторы, присутствуют аббревиатуры FUD и semiFUD. Расшифруем эти аббревиатуры, чтобы Вам было более понятно. Что же это такое.

1)FUD — Full Undetected — «полностью не определяется антивирусами»

2)semiFUD — Semi-full undetected — «почти не определяется антивирусами».

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

Для кражи номеров ICQ, логинов и паролей к аккаунтам электронной почты и социальным сетям используются особые тоянские программы, которые называются пинчи и ксинчи.

Для приема и обработки полученной ворованной информации используются специальные php-скрипты, которые называются гейтами.

Для соединения в один файл безопасной программы и какого-либо вируса служат джойнеры. При этом функциональность как первого (допустим, фотографии), так и второго (например, троянского вируса), остается на высшем уровне.

[FAQ] Что такое криптор?

Криптор — программа служащая для скрытия различного типа вирусов от антивирусов. Чтобы вирус попал к жертве ему необходимо еще пройти преграду — антивирус, который его заблокирует, в этом нам поможет криптор. Попытаюсь вам создать образ как работает криптор, вору нужно пройти мимо охранника в банк с золотом, как это сделать незаметно? Если вор будет идти в маске с ломом — охранник поймет что это вор, поэтому тут как и с вирусом играет огромную роль — маскировка. Криптор маскирует файл(перестановкой блоков программы,добавлением мусора в код,добавлением каких-то комманд.. есть различные способы маскировки кода). Как когда-то троя и троянский конь, отсюда и троян — потому что солдаты под видом коня попали в город, стража пропустила коня, но солдат она бы не пропустила. Охранник — антивирус\файлволл, Вор — Вирус, Банк — ПК жертвы, Маскировка — Криптор (чтобы вы понимали сходство названия вещей в виртуальной жизни и реальной).

Типы:
semiFUD — расшифровывается в народе как полу-приватный криптор, то есть криптор спрячет ваш файл, но не от всех антивирусов.
FUD — полностью приватный, само слово FUD значит Full Undetected — полностью ненаходимый, то есть криптор спрячет ваш файл от всех антивирусов потому что у него уникальный код, который еще не попал в базы данных антивирусных компаний.

Виды:
Stub — стабовый криптор состоит из двух программ — криптора и стаба. Стаб является отдельной программой, при крипте вирус связывается с кодом стаба(в народе такого рода функции криптора есть у Joiner`ов), в результате сего творения антивирус распознает его как безопасный потому что такая связка ему не знакома, но стоит залить стаб криптора или криптованый таким криптором вирус на virustotal. com или другие не безопасные сервисы, как через несколько часов все файлы криптованные этим стабом будут дэтэктиться антивирусами.
Polymorph — полиморфный, уникальный тип крипторов, уникальность заключается в том что каждая последовательность крипта вируса — будет иметь уникальный код для каждого, вызов API и добавление разного кода\комманд в код делает его срок срок службы долгим, если автор сего творения перестанеть его «чистить» то вскоре и он будет под дэтэктом антивирусов.

Ну, антивирус, погоди! Создаем EXE-криптор на Python’е

Web мы спасли от антивирусов несколько месяцев назад. Это было нетрудно — область относительно новая, не освоенная. С исполнимыми же файлами антивирусы борются уже десятилетиями. Побороть EXE-модуль будет сложнее, но… мы справимся :).

Выпуск 1. Ознакомительный

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

И найти хорошего криптора ой как сложно.

Но решение проблемы есть! Как мы знаем, антивирусные компании обмениваются технической информацией и создают специальные ресурсы, посредством которых мы сами отсылаем им сэмплы (типа VirusTotal’а). Но ведь и вирмейкеры тоже могут обмениваться информацией! Необязательно палить приватные мазы — публичные технологии тоже сгодятся. Например, было бы круто, если бы в каком-то одном месте лежали функции для генерации PE-файла, генерации импорта, шифрования ресурсов, рабочие функции определения SandBox’ов, тогда мы могли бы создавать крипторы так же непринужденно, как домики из кубиков Лего.

Идеальным местом для обмена, наверное, будет GitHub, и туда я залью исходники написанного нами сегодня криптора — он будет доступен по адресу http://github.com/presidentua/ExePacker.

Кроме того, в решении проблемы здорово помогло бы использование высокоуровневых языков программирования. В паблике сейчас валяются исходники крипторов на С++ или VisualBasic’е, но ведь от этого проще не становится, поскольку разобраться в написанном коде — ой как непросто. На Python’е все выглядит в разы лучше, поэтому именно его мы сегодня и будем использовать. В общем, заложим фундамент этой благородной миссии. Присоединяйся!

Выпуск 2. PE-файл

Структура PE-файла довольно сложная, поэтому подробная документация будет ждать тебя на диске, а здесь я представлю твоему вниманию лишь избранные моменты.

PE-файл представляет набор разных служебных структур, связанных между собой, и набор данных, которые размещены в секторах. Загрузчик Windows’a читает структуры, обрабатывает их (например, импортирует DLL’ки) и потом передает управление на инструкцию, указанную в поле «Entry Point».

Теперь посмотрим, что же нужно нам сделать, чтобы изменить файл и при этом не испортить его.

Выпуск 3. Теоретический криптор

Для начала выберем файл, который будет у нас исполнять функции лабораторной мыши. Чтобы сделать приятное Андрюшку :), мы, пожалуй, будем издеваться над Putty.exe. Упрощенно его структура будет выглядеть так:

  1. Служебные данные
  2. Первая кодовая секция
  3. Другие секции с данными

Алгоритм криптора следующий. Создать две ассемблерные программы. Первая будет косить под обычную прогу и проверять, что мы не в эмуляторе, а потом передаст управление на вторую программу. Вторая же восстановит оригинальную структуру файла и передаст управление на оригинальную точку входа Putty. И записать эти программы в файл.

В результате получится следующая структура:

  1. Служебные данные
  2. Первая кодовая секция
    1. Наша первая программа, которая передаст управление на 4.2
    2. Шифрованный код первой секции
    1. Часть кодовой секции, перезаписанной программой 2.1
    2. Вторая программа, которая оригинальный код из 4.1 поместит на 2.1, а потом расшифрует кодовую секцию и передаст на нее управление.

    Выпуск 4. Практический криптор

    Ну наконец-то мы добрались до сердца нашей статьи. Для работы криптора нам понадобится модуль pefile (будем использовать несколько модифицированную версию), и с помощью либы откроем Putty:

    import pefile
    pe = pefile.PE(«putty.exe»)

    Теперь, если ты напишешь «print pe», то увидишь подробную инфу обо всех характеристиках файла, по этой инфе я советую искать нужные для изменения поля в файле. А о внутренней работе модуля обязательно прочитай во врезке. Теперь немного математики. У нас будут две программы, которые нужно внедрить в файл. Они будут занимать где-то по 512 байт каждая максимум. Поэтому для размещения добавим новую секцию в 1024 килобайт вызовом:

    Закриптуем первую секцию XOR’ом с ключом «1»:

    Магия, правда? :). А теперь прикинь, что все это пришлось бы писать на С++!

    Поскольку в начале программы будет наш код, то сохраним оригинальный код, скопировав его в последнюю секцию. Адрес первой секции в файле находится в переменной — pe.sections[0]. PointerToRawData, а последней, соответственно — в pe.sections[-1].PointerToRawData:

    pe.data_copy(pe.sections[0].PointerToRawData, pe.sections[-1].PointerToRawData, 512)

    Оригинальный код сохранен, и мы приступим к написанию первой программы. Конечно же, писать мы ее будем на ассемблере, используя FASM для компиляции. Создадим файлик pack.tpl.asm с содержанием:

    use32
    mov eax, >
    jmp eax

    Ты, наверное, уже догадался, что это не готовый исходник, это лишь шаблон для шаблонизатора из TornadoWeb, а его мы уже отлично знаем, ведь именно его мы использовали при написании HTML-морфера. Сгенерируем первую программу:

    asm = Template(open(«pack.tpl.asm», «r»).read()).generate(
    go=pe.OPTIONAL_HEADER.ImageBase + pe.sections[-1].VirtualAddress+512,
    )
    with open(«pack.asm», «w») as f:
    f.write(asm)
    os.system(r»c:fasmwFASM.EXE pack.asm»)

    В переменной go мы передаем адрес в памяти, где будет наша вторая программа — то есть, в последней секции, начиная с 512 байта. А в последней строчке компилим результат на FASM’е. Теперь запишем получившийся код в начало первой секции:

    new_pack = open(«pack.bin», «rb»).read()
    pe.data_replace(offset=pe.sections[0].PointerToRawData, new_data=new_pack)

    Вторую программу запишем в файл copy.tpl.asm. Размер у нее более внушительный, поэтому полный код смотри на диске. Там содержится два цикла, один скопирует 512 байт оригинальной программы с последней секции в первую, а второй цикл расшифрует всю первую секцию. После этого передается управление на оригинальную программу.

    При компиляции темплейта нужно передать туда параметры для циклов копирования и расшифровки:

    copy_from = pe.OPTIONAL_HEADER.ImageBase+pe.sections[-1].VirtualAddress
    copy_to = pe.OPTIONAL_HEADER.ImageBase+pe.sections[0].VirtualAddress
    oep = pe.OPTIONAL_HEADER.ImageBase+pe.OPTIONAL_HEADER.AddressOfEntryPoint
    asm = Template(open(«copy.tpl.asm», «r»).read()).generate( copy_from=copy_from, copy_to=copy_to, copy_len=512, xor_len=pe.sections[0].Misc_VirtualSize, key_encode=1, original_oep=oep,)

    Остался маленький штришок — записать вторую прогу в файл и сделать первую секцию записываемой, чтобы расшифровщик не выдавал ошибок, а также установить точку входа на начало первой секции:

    new_copy = open(«copy.bin», «rb»).read()
    pe.data_replace(offset=pe.sections[-1].PointerToRawData+512, new_data=new_copy)
    pe.sections[0].Characteristics |= pefi le.SECTION_CHARACTERISTICS[«IMAGE_SCN_MEM_WRITE»]
    pe.OPTIONAL_HEADER.AddressOfEntryPoint = pe.sections[0].VirtualAddress
    pe.write(fi lename=»result.exe»)

    Выпуск 5. Завершающий

    Если собрать кусочки кода вместе, то будет у нас всего 50 строк. Всего лишь 50 — и криптор готов! А теперь прикинь, сколько строк содержала бы программа на С? Конечно, это еще далеко не готовый продукт, над ним нужно работать и работать. Чтобы довести систему до реального криптора, нужно добавить как минимум шифрование ресурсов и импорта, а также антиэмуляцию. О том как теоретически эти проблемы решить, смотри во врезках. Удачи!

    Желательный функционал 1. Обход песочниц

    В крипторе нужно делать проверки на запуск в виртуальной машине, SandBox’е или анализаторе типа анубиса. Чтобы их зедетектить, нужно провести небольшое исследование и написать программу, которая будет на экран выводить разные внутренние параметры системы, а дальше — проверить этот файл на том же анубисе и в скриншоте посмотреть параметры, которые показала наша прога. Дальше все просто — при запуске на системе с подобными параметрами — просто уходим в цикл.

    Обязательный функционал 2. Шифрование ресурсов и импорта

    Для шифрования ресурсов мы должны пройтись по секции ресурсов и сохранить оттуда важные для запуска файла — иконки и манифест. Дальше создаем новые ресурсы с важными ресурсами, а остальное шифруем. После запуска криптора восстанавливаем все обратно.

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

    Обязательный функционал 1. АнтиЭмуляция

    Кроме избавления от внешних сигнатур, очень важно, чтобы антивирус в своем эмуляторе не добрался до исходного файла. Для этого нужна антиэмуляция. Раньше были очень популярны приемы, основанные на предположении, что эмулятор не понимает все инструкции процессора. Сейчас же ситуация изменилась, и самые эффективные приемы основаны на использовании Windows API. Согласись, что антивирус вряд ли сможет эмулировать все API.

    Вот тебе такая идейка для реализации:

    • создаем Windows-приложение и один дополнительный поток;
    • после создания потока он должен послать через API сообщение основному потоку с каким-то ключом;
    • в главной программе проверяем, и если ключ правильный — передаем управление на код расшифровки основного файла;
    • если код неправильный, то просто ничего не делаем и находимся в вечном цикле получения сообщений от Windows.

    PS:Никогда не останавливай программу с ошибкой, это лишь прибавит криптору лишний вес. Вечный цикл получения сообщений от Windows — лучший способ.

    Внутренности Антивирусов

    В упрощенном виде, антивирус — это набор правил (сигнатур) и система, которая проверяет файл по этим правилам.

    К примеру, пусть в антивирусе будут такие сигнатуры:

    • секция с кодом, записываемая +10;
    • после запуска прописывается в авторан +30;
    • вторая секция с именем Zeus +30;
    • меньше 4 энтропия кодовой секции +20;
    • есть сертификат от майкрософта -10.

    Дальше антивирь проверяет те правила, которые возможно проверить без запуска EXE, потом в эмуляторе запускает файл и проверяет все остальные правила. А после этого подсчитывает сумму, если она больше 100, значит вирус, если меньше — значит не вирус.

    Как работает pefile

    При загрузке в pefile экзэхи, библиотека сохраняет сам файл в pe.data, а потом обрабатывает его и создает массив структур pe.structures. Структура — это объект, у которого есть адрес. Адрес, по которому она находится в файле, и есть набор полей.

    При сохранении файла pe.write(filename=»result. exe») либа проходит по всем структурам и сохраняет их по указанным адресам. Чтобы что-то добавить, например, в ту же секцию, нам сначала нужно найти адрес в памяти. Это можно посчитать так: адрес в памяти последней секции + размер секции. Дальше заполняем все поля в структуре и добавляем ее в массив pe.structures. Вот и все :).

    Links

    • Репозиторий с измененным pefile’ом и написанным криптом http://github.com/presidentua/ExePacker
    • Оригинальная либа pefile http://code.google.com/p/pefile/
    • Дока по TornadoWebшаблонизатору http://www.tornadoweb.org/
    • Тулза для анализа PE-файла, из которой можно брать много полезных функций http://code.google.com/p/pyew/

    Cassandra: криптор, который любит держаться в тени

    Ни один атакующий не хочет, чтобы его инструменты обнаружили и раскрыли раньше времени. Поэтому, как правило, в чистом виде никто вредоносные программы не распространяет. Например, пользователю прилетело фишинговое письмо от имени известной транспортной компании и просят проверить документы во вложении. Подобные письма достаточно часто являются началом атаки, так было и на этот раз. Внутри архива находился исполняемый файл Cassandra Crypter — популярный криптор, полезной нагрузкой которого могут выступать различные семейства вредоносного программного обеспечения. Алексей Чехов, аналитик CERT-GIB, рассказывает, как Cassandra проникает на компьютер жертвы и приводит с собой других незваных гостей.

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

    Первая стадия

    Cassandra маскируется под легитимное приложение. В точке входа располагается стандартная для приложений Windows Forms функция запуска.

    Конструктор формы также выглядит стандартным, ничем не отличающимся от легитимного приложения.

    При детальном анализе был обнаружен вызов функции aaa() , которая содержит вредоносный функционал. Ее вызов приводит к расшифровке и подгрузке вспомогательной dll .

    Для расшифровки используется алгоритм AES.

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

    Вторая стадия содержится в изображении, в зашифрованном виде, в исходной сборке.

    Для расшифровки используется операция XOR, ключом для расшифровки являются первые 16 байтов исходного изображения.

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

    Вторая стадия

    Вторая стадия представляет собой исполняемый файл .Net Framework.

    Конфигурационный файл

    Ключ, который используется на первой стадии расшифровки пейлоада

    Поле, содержащее пейлоад в расшифрованном виде

    Поле содержащее сырой (не разобранный) конфиг

    Поле, содержащее подготовленный конфиг

    Поле, содержащее флаг типа инжекта

    Поле, содержащее флаг закрепления в системе

    Поле, содержащее имя файла после закрепления в системе

    Поле, содержащее название мьютекса

    Поле, содержащее информацию об использовании загрузчика

    Поле, содержащее информацию о пути до загруженного файла

    Поле, содержащее ссылку на пейлоад

    Поле, содержащее информацию об использовании Anti-VM/Sandbox-функции, осуществляющей поиск

    Поле, содержащее информацию об использовании Anti-VM/Sandbox-функции, осуществляющей поиск строк в пути файла

    Поле, содержащее информацию об использовании Fake MessageBox

    Текст заголовка Fake MessageBox

    Текст Fake MessageBox

    Информация о кнопках Fake MessageBox

    Информация об иконке Fake MessageBox

    Количество секунд, в течение которых приложение будет бездействовать

    Функция, осуществляющая разбор конфигурационного файла

    Полезная нагрузка

    Полезная нагрузка содержится в крипторе в зашифрованном виде. Расшифровка проходит в два этапа:

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

    2. Осуществляется дешифрование, аналогичное тому, что было на первой стадии: используется операция XOR, в качестве ключа используются первые 16 байтов массива, полученного на первом этапе.

    Закрепление в системе

    Закрепление в системе осуществляется через создание отложенной задачи. Файл копируется в директорию AppData//+”.exe” . После этого исходный файл удаляется и создается задача на выполнение.

    Anti-VM

    В функции осуществляется поиск виртуальных видеоадаптеров и специфических ключей реестра, свойственных для виртуальных машин.

    Anti-Sandbox

    Реализованы три функции противодействия песочнице:

    • Детект изолированной среды. Функция проверяет путь до исполняемого файла и ищет в нём специфические строки, таких как \\VIRUS, SAMPLE, SANDBOX и т.д. Также осуществляется поиск окна, свойственного WindowsJail, и библиотеки SbieDll.dll, загруженной в процесс.

    • Попытка обхода песочницы по таймауту. Реализована при помощи стандартной процедуры Sleep.

    • Попытка обхода песочницы по user activity. Реализована при помощи показа Fake MessageBox.

    Защита от повторного запуска

    Реализована путем создания мьютекса с заданным именем в системе.

    Функционал

    Downloader

    Реализована функция загрузки пейлоада из сети.

    Запуск полезной нагрузки

    Содержит два варианта запуска пейлоада:

    1. Загрузка в память при помощи функций .Net Framework.

    2. Инжект полезной нагрузки в запущенный процесс. Есть возможность выбора из нескольких процессов.

    На данный момент Cassandra — достаточно распространенный тип крипторов. Как правило, злоумышленники используют его в массовых рассылках, чтобы незаметно запускать на машине пользователя вредоносное ПО. Cassandra позволяет запускать даже хорошо изученные семейства ВПО.

    • криптор
    • cryptor
    • cassandra
    • впо
    • протектор
    • компьютерная безопасность
    • компьютерная криминалистика
    • реверс-инжиниринг
    • реверсинг
    • Блог компании F.A.C.C.T.
    • Информационная безопасность
    • Реверс-инжиниринг
    • Исследования и прогнозы в IT
    • IT-компании

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Luxury Car Rental in Miami | Reserve a Premium Vehicle with RealCar