• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Пишем свой V-Encryptor с самоудалением на С#

I

Ishikawa

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

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

Итак.
Шифрование будет обеспечено модулем, известным еще с моих предыдущих статей CryptoNote
Модуль Copy - открывающий файл и проводящий математические операции с каждым байтом. Очень шустрый. Его описание вы можете найти в тех же старых статьях.

upload_2017-12-11_11-51-55.png


!!! Обратите внимание на комментарии. !!! Если хотите получить шифровальщик без возможности расшифровки - вместо decodeString используйте Random()-функцию и в дальнейшем уберите ветку (CoderMode==false) - она отвечает за расшифровку.

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

upload_2017-12-11_11-56-57.png


Принцип простой: устанавливаем текущую директорию и всё что нашли грузим в стэк. Потом по этому стеку считаем кол-во папок и файлов:

upload_2017-12-11_11-58-3.png


Потом для каждого файла производим процедуру шифрования - выводим на экран список файлов, вызываем процедуру Copy:

upload_2017-12-11_13-4-25.png


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

upload_2017-12-11_13-14-0.png


С модулями разобрались. Осталось заставить это дело работать. Переходим к Main-блоку.

В нем видим следующее:
upload_2017-12-11_13-7-1.png


Закомментированная строка string result показывает как получить директорию Temp пользователя. Пригодится на будущее (в данный момент не используется).
Переменная curDir - будет содержать текущую папку и выведет её на экран. Эта фича для debug.

Закомментированная строка Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); отсылает нас в MSND Environment.GetFolderPath - эта функция позволяет получить очень много интересных целей, т.е. можно задать параметр и программа зашифрует все файлы в MyDocuments пользователя, т.о. можно зашифровать вообще весь текущий профиль юзера.

Мы в качестве примера указали просто string CoderPath = @"C:\users\admin\Desktop\test";
т.е. на рабочем столе пользователя admin есть папка test с неким содержимым. Этот параметр измените под себя, чтобы проверить!

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

Принцип модуля Odissey - в нужную нам папку распаковать файл с именем DeleteMe.exe и запустить его.

Сам модуль deleteme "компилируется" на лету из массива (его также можно зашифровать)
Записывается он используя функцию File.WriteAllBytes(outputFilePath, bytesmass);

Массив выглядит примерно так:
public static byte[] bytesmass = { 0x4D,0x5A,0x90,0x0,0x3,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0xFF...}
По-сути это хорошо известный шелл-код, как в эксплойтах.

Сам модуль DeleteMe был написан отдельно и представляет из себя такой код:
upload_2017-12-11_13-19-42.png


Алгоритм такой: ждём несколько секунд пока завершится процесс шифрования и в папке, полученной при запуске программы, удаляем файл PackMan - так зовут нашего шифровальщика.

Скомпилированный код переведен в hex-опкоды отдельной утилитой, которая будет присутствовать отдельно (энтузиасты смогут найти её в теле PackMan). Утилиту OpcodeGen тоже поправьте под себя, т.к. в коде жестко зашита переменная для запуска.

Процесс работы выглядит примерно так:
в папке test у меня лежит несколько документов, которые прекрасно выглядят и читаются:
upload_2017-12-11_13-27-13.png


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

upload_2017-12-11_13-28-9.png


В итоге текстовый файл у нас больше не читается:
ґ¤ќЈњўљ¤d њ“љ–ўdњd—џ–ЈЏ– њ˜‰џd•¤љџ’‰Jwzwz1?2.?2U

С картинками тоже самое:
upload_2017-12-11_13-32-30.png


При этом размеры получившихся файлов не меняются.

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

На текущем этапе код вполне боеспособен, но как и всегда, чтобы его заставить работать, нужно отредактировать основные переменные. Иначе всё было бы слишком просто, а так у вас будет challenge :)

Вопросы пишите в комментарии :)

p.s. Да прибудет с вами сила и с наступающим Новым Годом!
(и в коде есть интересная ошибка. кто найдет - напишите :)
 

Вложения

  • upload_2017-12-11_13-39-14.png
    upload_2017-12-11_13-39-14.png
    1,5 КБ · Просмотры: 373
  • PackMan.rar
    1,3 МБ · Просмотры: 630
Последнее редактирование модератором:

mrOkey

Grey Team
14.11.2017
967
976
BIT
0
Принцип простой: устанавливаем текущую директорию и всё что нашли грузим в стэк. Потом по этому стеку считаем кол-во папок и файлов:

upload_2017-12-11_11-58-3-png.13788

string - ссылочный тип, который хранится в куче. Каким образом тут ты грузишь его в стэк?
 
I

Ishikawa

string - ссылочный тип, который хранится в куче. Каким образом тут ты грузишь его в стэк?
Используя Stack<string> dirs = new Stack<string>(20); - в стек пишем папки, а файлы уже в
массив string[] files.

 
Последнее редактирование модератором:

Remir

Grey Team
05.11.2017
282
354
BIT
371
У меня у одного upload_2017-12-11_13-39-14.png - поврежден?
 

Remir

Grey Team
05.11.2017
282
354
BIT
371
:)
Тьфу ты! А я воспринял его, как сообщение моей собственной системы! Невнимателен.
Извини за беспокойство.
 

hans007

Green Team
15.01.2017
14
3
BIT
0
Когда исходники подправят
[doublepost=1513204507,1513204394][/doublepost]
Используя Stack<string> dirs = new Stack<string>(20); - в стек пишем папки, а файлы уже в
массив string[] files.

В исходнике ошибке исправьте если нетрудно файл с картинкой ведь моросит
[doublepost=1513591501][/doublepost]
Доброго времени суток!
Сегодня я покажу как написать простой и уже опробованный в разных местах шифровальщик (не детектится антивирусами), который после завершения процесса сам себя удалит.
Писать будем на С#

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

Итак.
Шифрование будет обеспечено модулем, известным еще с моих предыдущих статей CryptoNote
Модуль Copy - открывающий файл и проводящий математические операции с каждым байтом. Очень шустрый. Его описание вы можете найти в тех же старых статьях.

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

!!! Обратите внимание на комментарии. !!! Если хотите получить шифровальщик без возможности расшифровки - вместо decodeString используйте Random()-функцию и в дальнейшем уберите ветку (CoderMode==false) - она отвечает за расшифровку.

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

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

Принцип простой: устанавливаем текущую директорию и всё что нашли грузим в стэк. Потом по этому стеку считаем кол-во папок и файлов:

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

Потом для каждого файла производим процедуру шифрования - выводим на экран список файлов, вызываем процедуру Copy:

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

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

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

С модулями разобрались. Осталось заставить это дело работать. Переходим к Main-блоку.

В нем видим следующее:
Посмотреть вложение 13791

Закомментированная строка string result показывает как получить директорию Temp пользователя. Пригодится на будущее (в данный момент не используется).
Переменная curDir - будет содержать текущую папку и выведет её на экран. Эта фича для debug.

Закомментированная строка Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); отсылает нас в MSND Environment.GetFolderPath - эта функция позволяет получить очень много интересных целей, т.е. можно задать параметр и программа зашифрует все файлы в MyDocuments пользователя, т.о. можно зашифровать вообще весь текущий профиль юзера.

Мы в качестве примера указали просто string CoderPath = @"C:\users\admin\Desktop\test";
т.е. на рабочем столе пользователя admin есть папка test с неким содержимым. Этот параметр измените под себя, чтобы проверить!

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

Принцип модуля Odissey - в нужную нам папку распаковать файл с именем DeleteMe.exe и запустить его.

Сам модуль deleteme "компилируется" на лету из массива (его также можно зашифровать)
Записывается он используя функцию File.WriteAllBytes(outputFilePath, bytesmass);

Массив выглядит примерно так:
public static byte[] bytesmass = { 0x4D,0x5A,0x90,0x0,0x3,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0xFF...}
По-сути это хорошо известный шелл-код, как в эксплойтах.

Сам модуль DeleteMe был написан отдельно и представляет из себя такой код:
Посмотреть вложение 13793

Алгоритм такой: ждём несколько секунд пока завершится процесс шифрования и в папке, полученной при запуске программы, удаляем файл PackMan - так зовут нашего шифровальщика.

Скомпилированный код переведен в hex-опкоды отдельной утилитой, которая будет присутствовать отдельно (энтузиасты смогут найти её в теле PackMan). Утилиту OpcodeGen тоже поправьте под себя, т.к. в коде жестко зашита переменная для запуска.

Процесс работы выглядит примерно так:
в папке test у меня лежит несколько документов, которые прекрасно выглядят и читаются:
Посмотреть вложение 13794

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

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

В итоге текстовый файл у нас больше не читается:
ґ¤ќЈњўљ¤d њ“љ–ўdњd—џ–ЈЏ– њ˜‰џd•¤љџ’‰Jwzwz1?2.?2U

С картинками тоже самое:
Посмотреть вложение 13796

При этом размеры получившихся файлов не меняются.

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

На текущем этапе код вполне боеспособен, но как и всегда, чтобы его заставить работать, нужно отредактировать основные переменные. Иначе всё было бы слишком просто, а так у вас будет challenge :)

Вопросы пишите в комментарии :)

p.s. Да прибудет с вами сила и с наступающим Новым Годом!
(и в коде есть интересная ошибка. кто найдет - напишите :)
здорово...как исправить ошибку в коде
 

ONX

Green Team
03.02.2017
19
4
BIT
0
1. Писать криптор без декриптования - плохой тон, это я про рандом...
2. Писать криптор с декриптованием на C# - детский лепет.
3. Писать Статьи на форуме хорошо ;) но учится такому точно не стоит)
 
C

Catharsis

Приветствую.
К Вам вопрос: возможно ли что-то подобное реализовать, только на C++ и, желательно, без сторонних библиотек, вроде Crypto++?
С уважением.
 

ONX

Green Team
03.02.2017
19
4
BIT
0
Приветствую.
К Вам вопрос: возможно ли что-то подобное реализовать, только на C++ и, желательно, без сторонних библиотек, вроде Crypto++?
С уважением.
Конечно можно, на С и на С++ и нужно это дело писать, но если ты об этом спрашиваешь то первый более менее криптор на с++ у тебя будет минимум через года два
 
C

Catharsis

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

mastanggt

Green Team
26.10.2016
18
4
BIT
2
Конечно можно, на С и на С++ и нужно это дело писать, но если ты об этом спрашиваешь то первый более менее криптор на с++ у тебя будет минимум через года два
Что за культ С и С++.
Я пишу всякую малварь и крипторы на Go и нормально живу.
 

ONX

Green Team
03.02.2017
19
4
BIT
0
Что за культ С и С++.
Я пишу всякую малварь и крипторы на Go и нормально живу.
Твое призвание интерпретируемые языки - наше компилируемые, если разница не понятна, то видимо и малвари соответствующие. Ничего личного - только бизнес :)
 
  • Нравится
Реакции: Глюк

ONX

Green Team
03.02.2017
19
4
BIT
0
Go компилируемый ;)
Стал недавно :) в 2016 году а до этого переваривал себя через чистый Си) но мы малвари пишем с 2000-ых и не могли ждать 16 лет пока выйдет ваш Голанг)
Но для меня он всегда остенется в памяти скриптовым языком)
 

mastanggt

Green Team
26.10.2016
18
4
BIT
2
Стал недавно :) в 2016 году а до этого переваривал себя через чистый Си) но мы малвари пишем с 2000-ых и не могли ждать 16 лет пока выйдет ваш Голанг)
Но для меня он всегда остенется в памяти скриптовым языком)

Вы о чем.
Go всегда был компилируемым.

А по поводу 16 лет, ну как бы уже не 2000 год, не обязательно сидеть на одном и том же всю жизнь.
Go 1 версии кстати в 2009 еще появился :)
Я не спорю что C хороший язык, я сам его иногда использую, но время идет, и ничто не мешает использовать более удобные языки.
 

ONX

Green Team
03.02.2017
19
4
BIT
0
Вы о чем.
Go всегда был компилируемым.

А по поводу 16 лет, ну как бы уже не 2000 год, не обязательно сидеть на одном и том же всю жизнь.
Go 1 версии кстати в 2009 еще появился :)
Я не спорю что C хороший язык, я сам его иногда использую, но время идет, и ничто не мешает использовать более удобные языки.
Не имею смысла обсуждать далее, так как вы о собственном языке не знаете важных вещей, что тот самый компилятор которым вы собираете ваш софт перешел на язык Go в 2016 году до этого компилятор был написан на Си. Пруф к моей полемике на официальном сайте Go что с 2014 года ведется разработка своего компилятора что бы уйти с компилятора Си и наконец он был выпущен ближе к 2016 году. покажите примеры ваших программ очень сомнительно что вы пишите на нем)))
 

mastanggt

Green Team
26.10.2016
18
4
BIT
2
Не имею смысла обсуждать далее, так как вы о собственном языке не знаете важных вещей, что тот самый компилятор которым вы собираете ваш софт перешел на язык Go в 2016 году до этого компилятор был написан на Си. Пруф к моей полемике на официальном сайте Go что с 2014 года ведется разработка своего компилятора что бы уйти с компилятора Си и наконец он был выпущен ближе к 2016 году. покажите примеры ваших программ очень сомнительно что вы пишите на нем)))

То что он использовал компилятор написаный на С не делает его интерпретируемым языком.

Вы немного путаете понятия интерпретируемых и компилируемых языков, видимо.

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

Питон вот интерпретируемый, а вот go всегда был и есть компилируемым языком.
 

ONX

Green Team
03.02.2017
19
4
BIT
0
То что он использовал компилятор написаный на С не делает его интерпретируемым языком.

Вы немного путаете понятия интерпретируемых и компилируемых языков, видимо.

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

Питон вот интерпретируемый, а вот go всегда был и есть компилируемым языком.

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!