Пожалуйста, обратите внимание, что пользователь заблокирован
С чего начать?
Как правило стоит начать с изучения ЯП, но и его незнание не помешает вам собрать проект из исходников, и поправить некоторые константы. Ну а на самом деле нам стоит определиться с алгоритмом шифрования, и режимом шифрования. Описание алгоритмов шифрования, их стойкость к брутфорсу итд вы можете посмотреть в википеди.
А тепеь про методы шифования. Возьмём саамые основные режимы шифрования, это ECB и CBC.
ECB
ECB - это шифрование методом простой замены в блоках.
(картинко с википедии)
Основная суть в том, что каждый блок шифруется отдельно, независимо от другого. Такой метод не очень безопасен, и подвержен брутфосу.
CBC
CBC - основная суть данного метода шифрования в том, что каждый последующий блок зависит напрямую от предыдущего.
(картинко с википедии)
При шифровании в данном режие, все блоки имеют одинаковый размер. Если у файла размер не кратен размеру блока, то последний блок дополняется до нужного размера.
Каждый последующий блок шифруется с использованием предыдущего блока, используя вектор инициализации.
Более подробно про методы шифрования вы можете прочитать в википедии:
Режим шифрования — Википедия
Начало работы
Мы определились с алгоритмом и методом шифрования, теперь надо начать писать.
В данной статье я не буду рассматривать конкретный ЯП. К статье приложу исходники криптолокера, написанного нашей командой на C++.
Надо определиться а алгоритмом работы программы. Самое простое, это сделать несколько модулей и воркеры. Воркеры в нашем случае будут обрабатывать шифрование файлов.
Для выдачи заданий воркерам будем использовать аналог BlockingQueue (из Java).
C++:
#include <mutex>
#include <condition_variable>
#include <deque>
template <typename T>
class queue
{
private:
std::mutex d_mutex;
std::condition_variable d_condition;
std::deque<T> d_queue;
public:
void push(T const& value) {
{
std::unique_lock<std::mutex> lock(this->d_mutex);
d_queue.push_front(value);
}
this->d_condition.notify_one();
}
T pop() {
std::unique_lock<std::mutex> lock(this->d_mutex);
this->d_condition.wait(lock, [=]{ return !this->d_queue.empty(); });
T rc(std::move(this->d_queue.back()));
this->d_queue.pop_back();
return rc;
}
};
При запуске нашего локера стоит сразу же создать N'ое кол-во воркеров. На один воркер - 1 поток. Воркер будет брать задания из нашего стека, и выполнять их. Если заданий нету, то ждать другие.
Для того чтобы воркер понял, что заданий нету, в стек надо добавить N'ое (по кол-ву воркеров) количество данных (например текст EXIT), который будет означать, что задания закончились, и воркер должен завершить работу.
Примеров рекурсивного поиска файлов в сети полно, стоит взглянуть на stackoverflow, и вы найдёте кучу примеров рекурсивного поиска файлов. Все нужные нам файлы (с нужным расширением) добалвяем в стек. В конце программы (перед return) добавляем ожидания завершения потоков (воркеров) чере Join (или аналог для вашего ЯП).
При шифровании возможно писать напрямую в файл, если размер закриптованного блока равен размеру не закриптованного блока ( Blowfish алгоритм ). В данном случае файл перезаписывается (полезно для NTFS).
И так, вывод. Основные модули для работы криптолокера:
- Рекурсивный поиск файлов (с отдачей путей до нужных файлов в воркер)
- Воркер, который принимает список заданий (пути до файлов) и выполняет их (шифрует)
- Модуль криптографии для шифрования
По сути данной теории достаточно, чтобы человек сам домыслил, что ему надо писать дальше.
!! Внимание
На NTFS файловых системах существует такое понятие как "фрагментация", и ваш файл будет записан в любое место на диске, а удаление старого не удалит его. Единственный выход из такой ситуации - заполнение всего диска рандомными файлами, но в большинстве случаев куски файлов перезаписываются, и старые не зашифрованные файлы становится невозможно восстановить.
Ссылки:
[CLIKE]Проект на гитхабе:
PokemonGoTeam/CRYPTOPOKEMON
Simple C++ cryptolocker Blowfish CBC. Contribute to PokemonGoTeam/CRYPTOPOKEMON development by creating an account on GitHub.
Для сборки нужна Visual Studio 2017. В проекте используется C++17 для поиска файлов (std::filesystem)
КРАЙНЕ НЕ СОВЕТУЮ ИСПОЛЬЗОВАТЬ ДАННЫЙ СОФТ И СТАТЬЮ В ПРОТИВОЗАКОННЫХ ЦЕЛЯХ. СТАТЬЯ НАПИСАНА В ОЗНАКОМИТЕЛЬНЫХ ЦЕЛЯХ, ДЛЯ ПОНИМАНИЕ РАБОЫТ КРИПТОЛОКЕРОВ.
(с) PokemonGo Team https://pokemongo.icu/
Последнее редактирование: