• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Ransomware - все по взрослому или оптимизация работы (конкурс 2020)

то же самое что "не пишите на шарпе, он декомпилируется"
а что тогда? go? ruby? нода ебучая?
php как был актуальным, так и останется еще долгое время
Это всего лишь рекомендация (я не настаиваю, можно и на пхп - ТОЛЬКО уделить надо много внимания безопасности), я бы предложил какой нить ГО для серьезного проекта, т.к. он компилируемый и там сложнее взломать, т.к. каждый проект уникален.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Статья лишь от части верна.
Нет смысла шифровать после AES'а. Нет смысла использовать ключ длинной 256 бит. Нет смысла в многопоточном поиске. Нет смысла в AES-NI. Нет смысла писать свою реализацию криптоалгоритмов, как и нет смысла использовать Crypto API.

Выводы тестов показывают, что технология AES-NI дает серьезный прирост в скорости шифрования 3-5 раз, техника не имеет внешних зависимостей, так же на 16кб разница между AES и AES+RC4 не столь существенна.
AES-NI дает прирост, но оптимизировать нужно не здесь.

Для ускорения работы стоит использовать много поточность поиска, т.е. на каждый диск один поток который ищет файлы и заносит их путь в буфер. Так же используем 16кб шифрования начальных данных файла без его полной перезаписи, 16кб потому что обычно стандартный размер кластера блока записи на диск 4кб, значит нам надо использовать кратную величину.
В тестах на скине мы видим тест скорости работы шифровальщика для заданного диска в одном потоке и в 3х потоках, для SSD и для HDD на реальных носителях в одной системе.
Можно искать файлы в многопотоке, можно использовать асинхронный поиск (BURAN), но это не дает никакого выйгрыша в скорости шифрования.

Как видно из тестов вышее скорость работы с файловой системой при увеличении потоков не сильно отличается (%5 на каждый дополнительный поток, но не более 5), т.е. мы упираемся в ограничения записи (что и следовало ожидать).
Упираешься ты не в ограничение скорости чтения-записи, а в скорость обработки файлов.
Те цикл CreateFile => ReadFile => WriteFile => CloseHandle занимает бОльшую часть времени.
В детали не буду вникать, много писать. Коротко - это кеширование ввода-вывода на уровне системы, ожидание чтения нужного сектора на диске и даже скорость передачи от одного враппера к другому(ReadFile -> NtReadFile -> SYSENTER )
Проверить это можешь, запустив свой бенчмарк и посмотрев в монитор ресурсов, с какой скоростью идет ввод-вывод. Или время отработки этого цилка, в помощь Process Monitor.

Единственный момент, который имеет место оптимизировать, это запись, чтение и открытие файла.


Как происходит процесс ввода-вывода в Windows
  1. Вызов WriteFile/ReadFile из kernel32.dll
  2. WriteFile/ReadFile вызывает NtWriteFile/NtReadFile из ntdll.dll
  3. NtWriteFile/NtReadFile через системный вызов SYSENTER передает управление в ядро(ring 0)
  4. В режиме ядра вызываются функции NtWriteFile/NtReadFile из Ntoskrnl.exe
  5. Они передают запрос IRP_MJ_WRITE/IRP_MJ_READ в драйвер файловой системы
  6. Драйвер файловой системы определяет, какие секторы должны быть прочитаны/записаны, и передает их в драйвер хранилища.
  7. Драйвер хранилища отправляет команду на жесткий диск для фактической записи/чтения данных в указанные сектора
  8. Жесткий диск читает/записывает данные

Кешифрование ввода-вывода в Windows выглядит так

cache.png


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

Все это взято из официальной документации MSDN и личного опыта.

Что точно даст результат:

  • Открывать файлы с флагом FILE_FLAG_NO_BUFFERING, писать по размеру сектора
  • Работу с файлами перенести на Native API
  • Использовать асинхронный файловый ввод-вывод
  • Использовать I/O порт завершения
  • Передавать управление в ядро самому, гугли KiFastSystemCall
По пунктам я разбил сложность реализации, от легкого к сложному.
При работе с сетевыми ресурсами(шары SMB, WebDAV, DFS) действуют уже другие законы.


В результате оптимизаций, скорость шифрования

speed.png
 
Статья лишь от части верна.
Нет смысла шифровать после AES'а. Нет смысла использовать ключ длинной 256 бит. Нет смысла в многопоточном поиске. Нет смысла в AES-NI. Нет смысла писать свою реализацию криптоалгоритмов, как и нет смысла использовать Crypto API.


AES-NI дает прирост, но оптимизировать нужно не здесь.


Можно искать файлы в многопотоке, можно использовать асинхронный поиск (BURAN), но это не дает никакого выйгрыша в скорости шифрования.


Упираешься ты не в ограничение скорости чтения-записи, а в скорость обработки файлов.
Те цикл CreateFile => ReadFile => WriteFile => CloseHandle занимает бОльшую часть времени.
В детали не буду вникать, много писать. Коротко - это кеширование ввода-вывода на уровне системы, ожидание чтения нужного сектора на диске и даже скорость передачи от одного враппера к другому(ReadFile -> NtReadFile -> SYSENTER )
Проверить это можешь, запустив свой бенчмарк и посмотрев в монитор ресурсов, с какой скоростью идет ввод-вывод. Или время отработки этого цилка, в помощь Process Monitor.

Единственный момент, который имеет место оптимизировать, это запись, чтение и открытие файла.


Как происходит процесс ввода-вывода в Windows
  1. Вызов WriteFile/ReadFile из kernel32.dll
  2. WriteFile/ReadFile вызывает NtWriteFile/NtReadFile из ntdll.dll
  3. NtWriteFile/NtReadFile через системный вызов SYSENTER передает управление в ядро(ring 0)
  4. В режиме ядра вызываются функции NtWriteFile/NtReadFile из Ntoskrnl.exe
  5. Они передают запрос IRP_MJ_WRITE/IRP_MJ_READ в драйвер файловой системы
  6. Драйвер файловой системы определяет, какие секторы должны быть прочитаны/записаны, и передает их в драйвер хранилища.
  7. Драйвер хранилища отправляет команду на жесткий диск для фактической записи/чтения данных в указанные сектора
  8. Жесткий диск читает/записывает данные

Кешифрование ввода-вывода в Windows выглядит так

Посмотреть вложение 7847

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

Все это взято из официальной документации MSDN и личного опыта.

Что точно даст результат:

  • Открывать файлы с флагом FILE_FLAG_NO_BUFFERING, писать по размеру сектора
  • Работу с файлами перенести на Native API
  • Использовать асинхронный файловый ввод-вывод
  • Использовать I/O порт завершения
  • Передавать управление в ядро самому, гугли KiFastSystemCall
По пунктам я разбил сложность реализации, от легкого к сложному.
При работе с сетевыми ресурсами(шары SMB, WebDAV, DFS) действуют уже другие законы.


В результате оптимизаций, скорость шифрования

Посмотреть вложение 7848

Ваши выводы 100% правильны, но есть несколько проблем с чем столкнетесь:
1) такая нагрузка на дист хоть и даст серьезный прирост, но он он вгонит систему холд или приближенно, это вызовет у юзера лишние телодвижения, например выключить систему, для серверов может вызвать авто удаление приложения из памяти. По итогу придется тормозить, чтобы нагрузка не мешала всей работе.
2) поиск по дискам даст прирост, особенно если диски разные (даже SMB или WenDav, проще их кучей сканировать)
3) Шифрование с РС4 для полных параноиков - таких как я, что и сказано было в статье.
4) Вот вы пишите что своя реализация излишня, и что КриптАпи тоже плохо (я так же согласен), но почему то ничего не сказано, что лучше? Я предложил вариант который 100% рабочий, и по скорости и по реализации и по криптостойкости, РС4 использовать или нет каждый сам пусть выбирает.
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
Использовать проверенную реализацию криптоалгоритмов из других источников. OpenSSL и подобные - нормальный вариант.
Своя реализация - отсутсвиее гарантии в надежности алгоритма.
 
Скорее всего речь идёт о "криптографических функциях нового поколения".
Каких? И что они дадут? Быстрее? Криптостойкость выше? CPU не будут напрягать?
 
Использовать проверенную реализацию криптоалгоритмов из других источников. OpenSSL и подобные - нормальный вариант.
Своя реализация - отсутсвиее гарантии в надежности алгоритма.
Вы можете проверить этот алгоритм, он десятилетиям подтвержден (тот что я использовал), зачем изобретать велосипед? Что у OpenSSL лучше AES? смешно
 
А какими способами/тулзами лучше всего воспользоваться, чтобы оценить возможность или невозможность восстановления файла после крипта? Хотелось бы как то экспериментально понять какой метод лучше - шифрование первых 16кб, шифрование полосами, как писали выше и тд
 
А какими способами/тулзами лучше всего воспользоваться, чтобы оценить возможность или невозможность восстановления файла после крипта? Хотелось бы как то экспериментально понять какой метод лучше - шифрование первых 16кб, шифрование полосами, как писали выше и тд
Да тут не надо думать, полосами - более эффективнее, дешифровать сложнее, но и дольше и нагрузка чуть больше, тут надо играть с параметрами, но и реализация сложнее (ошибки не допустимы). Если делать прям пиздец пиздец - то полосы лучший вариант.
 
Да тут не надо думать, полосами - более эффективнее, дешифровать сложнее, но и дольше и нагрузка чуть больше, тут надо играть с параметрами, но и реализация сложнее (ошибки не допустимы). Если делать прям пиздец пиздец - то полосы лучший вариант.
Да понятно, что в целом лучше, но как раз таки нужно понять, когда достаточно первых 16кб, а когда нужно изъебываться. Можно же по идее сделать так, чтобы малварь в той или иной ситуации сама выбирала подходящую технику шифрования и использовала ее. Нужны эксперименты, само собой, поэтому и спросил про способы восстановления
 
Да понятно, что в целом лучше, но как раз таки нужно понять, когда достаточно первых 16кб, а когда нужно изъебываться. Можно же по идее сделать так, чтобы малварь в той или иной ситуации сама выбирала подходящую технику шифрования и использовала ее. Нужны эксперименты, само собой, поэтому и спросил про способы восстановления
зачем такие сложности, делаем первые 16кб и потом примерно каждые 0.1-1мб делаем полосу 1кб - это более чем достаточно, объеденим обе техники для простоты и надежности.
Текущий пример я делал как простую основу для экспериментов, никто не мешает его расширить.
 
Эта статья участвует в Конкурсе, голосование открыто https://xssforum7mmh3n56inuf2h73hvhnzobi7h2ytb3gvklrfqm7ut3xdnyd.onion/threads/35309/
Если понравилась голосуйте.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх